Merdiveni Farklı Çıkma Yolları

Birincisi basamak sayısı, ikincisi ise atabileceğimiz farklı adim sayısı olmal üzere iki argüman alan, bu argümanlara göre merdiveni çıkma kombinasyonlarını veren bir fonksiyon yazmak istiyorum.

Örneğin:

basamak_sayisi = 4
atilabilecek_adimlar = [1, 2]
sonuc = adim_komb(basamak_sayisi, atilabilecek_adimlar)
print(sonuc)
"""
[1, 1, 1, 1]
[2, 1, 1]
[1, 2, 1]
[1, 1, 2]
[2, 2]
"""

Aşağıdaki kodlar işinizi görüyor mu?

def olasiliklar(tbs: int = 0, ab: list = []):
    """
    :param tbs: toplam basamak sayısı
    :param ab: atılacak basamaklar
    """
    sonuc = []
    duzenli_adimlar = [
        _ for _ in ab for __ in range(1, tbs + 1, _)
    ]
    gtbs = tbs  # geçici toplam basamak sayısı
    while gtbs:
        for i in __import__("itertools").permutations(duzenli_adimlar, gtbs):
            if sum(i) == tbs and i not in sonuc:
                sonuc.append(i)
        gtbs -= 1
    return sonuc


for olasilik in olasiliklar(tbs=4, ab=[1, 2]):
    print(olasilik)

Çıktı:

(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(2, 1, 1)
(2, 2)
subset_sum_rep = lambda sum_, es: [] if sum_ < 0 else [[]] if sum_ == 0 else [[e] + ss for e in es for ss in subset_sum_rep(sum_ - e, es)]

adim_komb = lambda s, es: "\n".join(map(str, subset_sum_rep(s, es)))
3 Beğeni

Bu iki çözüm önerisi arasından @aib’in çözüm önerisini daha çok tavsiye ederim çünkü bu argümanlara göre aşağı yukarı 5 kat daha hızlı çalışıyor.

Keşke kodlarınızı anlayabilsem :smiley:

Ben de okunabilen, yazilabilen, anlasilabilen kodu tavsiye ediyorum, her hangisiyse. :slight_smile:

Recursion icin guzel ornek aslinda. Haskell’de base case’ler guard olarak yazilabiliyor, daha da guzel:

subset_sum_rep :: Int -> [Int] -> [[Int]]
subset_sum_rep sum es | sum <  0  = []
                      | sum == 0  = [[]]
                      | otherwise = concatMap (\e -> map (e:) (subset_sum_rep (sum - e) es)) es

adim_komb sum es = concatMap ((++"\n") . show) (subset_sum_rep sum es)

Benim tavsiyem Python kodunu Haskell gibi base case | base case | recursive case seklinde ayirmak. Sonra list comprehension’lar acilabilir istege gore.

Bu konu başlığı altında yine @aib yazmış olduğu fonksiyonlardan
N basamaklı bir merdiveni kaç farklı şekilde çıkabileceğimize veya
x adım atarak kaç farklı şekilde çıkabileceğimize cevap bulabiliyoruz

1 Beğeni