0
1

ধরা যাক, আমি চাচ্ছি যে a, b, c, d, e, f, g, h, i, j এই কয়টা ক্যারেকটার মিলিয়ে ৫ ক্যারেকটারের যত কম্বিনেশন বানানো যায় বানাব। যেমন– abcdef, efghi, dheci, iafcj এই রকম। কিন্তু আমার টার্গেট হলো যে প্রতি কম্বিনেশনে প্রতি ক্যারেক্টার একবারের বেশি আসা যাবে না। মানে aaaaa বা abcdc এগুলো ইনভ্যালিড।

একটা কাজ করা যেতে পারে যে, এক প্রান্ত থেকে বানানো শুরু করা আর প্রতিটা কম্বিনেশন বানানোর পর চেক করা যে সেটা ভ্যালিড কি না। যেমন– প্রথমে হবে aaaaa, তারপর হবে aaaab, তারপর aaaac, এভাবে এক এক করে বাড়াব এবং চেক করে সিদ্ধান্ত নেব যে এটা ভ্যালিড কি না। তবে সমস্যা হলো যে, এতে আমাকে প্রায় অর্ধেক বা আরো বেশি সময় লুপ চালাতে হবে যার কোনো আউটপুট নাই। এটা এক্সিকিউশন টাইম অনেক বাড়িয়ে দেবে।

এমন কোনো উপায় কি আছে যে আমি যখনই কোনো রিপিট ক্যারেক্টার পাব, যেমন– aaaaa, তখন আমি সিদ্ধান্ত নিতে পারব যে এবার আমাকে এক এক করে না বাড়িয়ে এক সাথে অনেক বাড়াতে হবে। আর কত দূর লাফ দিয়ে যেতে হবে সেটাও জেনে নেওয়া যাবে।

এখানে সম্ভবত আমার প্রথম ভ্যালিড কম্বিনেশন abcde

asked 04 Apr, 04:01

mabdsalam12's gravatar image

mabdsalam12
477223

edited 04 Apr, 07:17

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
74618

3

আপনি পাইথনে এই কাজটা itertools.combinations ব্যাবহার করে করতে পারেন ।

(09 Jun, 05:21) menon

@menon -এর কমেন্টটিই সঠিক। ওটাকেই আরেকটু বিস্তৃত করে লিখলাম।

>>> lst = ['a', 'b', 'c', 'd', 'e']
>>> for combination in itertools.combinations(lst, 3):
...     print(combination)
...
('a', 'b', 'c')
('a', 'b', 'd')
('a', 'b', 'e')
('a', 'c', 'd')
('a', 'c', 'e')
('a', 'd', 'e')
('b', 'c', 'd')
('b', 'c', 'e')
('b', 'd', 'e')
('c', 'd', 'e')
>>>

অ্যালগরিদমটি জানতে চাইলে itertools.combinations ফাংশনটির কোড দেখা যেতে পারে।

def combinations(iterable, r):
    # combinations('ABCD', 2) --> AB AC AD BC BD CD
    # combinations(range(4), 3) --> 012 013 023 123
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = list(range(r))
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)
permanent link

answered 13 Jun, 13:56

tahmidrafi's gravatar image

tahmidrafi ♦♦
1.1k214

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×9
×1
×1

question asked: 04 Apr, 04:01

question was seen: 579 times

last updated: 13 Jun, 13:56