Dokuz sayı ve Yüz

düzenlemeden karmaşık bir kod yazdım bende 10 taneye çıkardım sonucumu
şu iki işlemi bulamadım
1+2-3+4+5+6+78+9
1+2+3-4+5+6+78+9

teşekkürler çok güzel olmuş emeğinize sağlık

Anlamadım, bu zaten 100 etmiyor ki:

>>> 1+2-3+4+5+6+78+9
102

:slight_smile: sevindim kontrol etmedim cevaplarda vardı diye
ozman doğru sonuca ulaşmışız tabi benim kod uzun ve düzenlenmesi gerek

Ama diğeri (1+2+3-4+5+6+78+9) doğru olduğu halde bizde yok, ve bana ayıraç algoritmasında hata var gibi geldi.

hmm evet ayıraç algoritmasında bu iki durumu kontrol edince bulamıyoruz

Ufak bir sayı sonucu ne kadar da çok değiştiriyor :slightly_smiling_face: for ayıraç_sayısı in range(7):yi for ayıraç_sayısı in range(8): yaptım ve sonuç çıktı.

import itertools

sayılar = "123456789"

sonuçlar = set()

toplamlar = []

for ayıraç_sayısı in range(8):
    
    ayıraçlar = itertools.combinations(range(1, 9), ayıraç_sayısı)

    for ayıraç in ayıraçlar:
        sayı_listesi = []

        start = 0
        for i in ayıraç:
            if not (e := sayılar[start:i]): continue
            sayı_listesi.append(e)
            start = i
        if e := sayılar[start:]: sayı_listesi.append(e)       
    
##        if len(sayı_listesi) > 2 and sayı_listesi[-2] == "78": print(sayı_listesi)
        for k in range(2 ** (len(sayı_listesi))):
            toplam = ""
            for i, j in enumerate(sayı_listesi):
                if k & 2**i:
                    toplam += "+" + j
                else:
                    toplam += "-" + j

##            print(toplam)
            toplamlar.append(toplam)
            if eval(toplam) == 100:
                sonuçlar.add(toplam)

            
print(sonuçlar)


1 Beğeni

işaretleri eksi yapmak için harcadığım çabadan sonra sizin yazdığınız kodu görünce nede yormuşum kendimi dedim :slight_smile:
iyi düşünce bravo

1 Beğeni

Kodun github’daki halini de düzelttim, en başta döngüyü kurarken ayıraç sayısını yanlış düşünüp 8 yerine 7 yazmışım. Şimdi kodun son hali bu:

from algoritmalar import hepsini_ayır

sayılar = "123456789"

sonuçlar = set()

for sayı_listesi in hepsini_ayır(sayılar):
    for k in range(2 ** (len(sayı_listesi))):
        toplam = ""
        for i, j in enumerate(sayı_listesi):
            if k & 2**i:
                toplam += "+" + j
            else:
                toplam += "-" + j

        if eval(toplam) == 100:
            sonuçlar.add(toplam)
            
print(sonuçlar)


Ben size demiştim ama :smiley:

1 Beğeni

O zaman cevap 11 mi? Çünkü benim bulduğum sonuçlarda -1+2-3+4+5+6+78+9 da var, ama bunun en başında - var.

Gerçi benim de uğraşmama gerek yokmuş:

>>> from itertools import product
>>> list(product("+-",repeat=3))
[('+', '+', '+'), ('+', '+', '-'), ('+', '-', '+'), ('+', '-', '-'), ('-', '+', '+'), ('-', '+', '-'), ('-', '-', '+'), ('-', '-', '-')]

Şu product adındaki güzel fonksiyonun varlığını unutup duruyorum, geçen de burada combinator adı ile baştan yazmıştım.

Cevap 11 cevap olarak verilenlerden biri sağlamıyor

O zaman kodu şöyle düzeltelim:

from algoritmalar import hepsini_ayır, product

sayılar = "123456789"

sonuçlar = set()

for sayı_listesi in hepsini_ayır(sayılar):
    for k in range(2 ** (len(sayı_listesi) -1)):
        toplam = sayı_listesi[0]
        for i, j in enumerate(sayı_listesi[1:]):
            if k & 2**i:
                toplam += "+" + j
            else:
                toplam += "-" + j

        if eval(toplam) == 100:
            sonuçlar.add(toplam)
            
print(sonuçlar)
print()
print(len(sonuçlar))
1 Beğeni

O kadar soruda kullanmama rağmen benimde aklıma gelmedi :frowning:

1 Beğeni

Bu da productlu hali:

from algoritmalar import hepsini_ayır, product

sayılar = "123456789"

sonuçlar = set()

for sayı_listesi in hepsini_ayır(sayılar):
    for k in product("+-", repeat = len(sayı_listesi) -1):
        toplam = sayı_listesi[0]
        for i, j in zip(k, sayı_listesi[1:]):
            toplam += i + j

        if eval(toplam) == 100:
            sonuçlar.add(toplam)
            
print(sonuçlar)
print()
print(len(sonuçlar))
1 Beğeni

Ben biraz daha basit düşündüm sanırım :smiley:

from itertools import product

def sonuc_100_olanlar():
    sayilar = "123456789"

    for operatorler in product(["+", "-", ""], repeat=len(sayilar)-1):
        formul = sayilar[0]
        for i in range(len(operatorler)):
            formul += operatorler[i] + sayilar[i+1]
        if eval(formul) == 100:
            yield formul
2 Beğeni

Çok iyi, ilginç algoritma :slight_smile:

Buraya yeni konu açmadan bağlantılı olduğunu düşündüğüm için yeni bir soru paylaşıyorum
SORU :1 den 9 akadar olan sayıları ve 4 işlemi birer kez kullanarak elde edebileceğiniz maksimum sayı kaçtır?
Ayır fonksiyonunu kullanarak şöyle bir yol izledim sonuç vereceğinden de eminim fakat çok permütasyon olduğu için uzun zaman alacak ve beklemek gerekecek
Daha iyi alternatif bir kod arıyorum yardımcı olurmusunuz

from algoritmalar import ayır, product,permutations

ana_madde = "123456789"
liste=permutations(ana_madde)

kullanılan_sayılar=[]
for i in liste:
    boş=''
    for j in i:
        boş+=j
    kullanılan_sayılar.append(boş)

sonuçlar = set()
for sayılar in kullanılan_sayılar:
    for sayı_listesi in ayır(sayılar,4):
        for k in permutations("+-*/", 4):
            toplam = sayı_listesi[0]
            for i, j in zip(k, sayı_listesi[1:]):
                toplam += i + j

            sonuçlar.add(eval(toplam))

print(max(sonuçlar))

Hala çok uzun sürüyor ama

from itertools import permutations


def formulas(opr=["+", "-", "*", "/"] + [""] * 4,
             numbers="123456789"):
    for i in permutations(numbers):
        for j in permutations(opr):
            yield "{}".join(i).format(*j)

max_ = max(formulas(), key=eval)
print(max_)

Bağlantılı da olsa her soru için yeni konu açmanız daha iyi, daha düzenli olur.

Denenecek bu kadar olasılık var :neutral_face:

>>> P(9, 9) * C(13, 4)
259459200.0

Sayıların hepsini bir listeye ekleyeyim falan demeyin 6 GB’ı aşıyor.

>>> sys.getsizeof(1) * 259459200 / 1024 ** 3
6.765925884246826