Dokuz sayı ve Yüz

böyle biraz karışda olsa sonuca giden bir şey yazdım
sorun şurda çıkıyor

 istenenler=[]
    for i in kullanılacak:
        ekle=[]
        for j in i:
            ekle.append(int(j))
        if sum(ekle)==100:
            istenenler.append(i)
    for i in istenenler:
        if set(i)=={'123','45','-67','8','-9'}:
            True

daha önceki yerlerde varken toplamı 100 olanlarda gelmiyor

Şimdi 10 tane buldum. Yukarıda attığım kodda saçma bir hata yapmışım, düzelttim.

import itertools

sayılar = "123456789"

sonuçlar = set()

for ayıraç_sayısı in range(7):
    
    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)       

        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
##            print(toplam)

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

##        print()
            
print(sonuçlar)

bendeki hata nerde bakabilirmisiniz?

Ne yapmaya çalıştığınızı anlayamadığım için şimdi bakamayacağım, ben bu yöntemle yaptım:

Şu ana kadar kullandığımız algoritmalardan önemli gördüklerimi bir dosyada topladım, artık ihtiyacımız olduğunda oradan alırız:

1 Beğeni
import itertools

sayılar = "123456789"
sonunsonu=[]
for ayıraç_sayısı in range(8):

    ayıraçlar = itertools.combinations(range(1, 9), ayıraç_sayısı)
    aranan_listeler = []
    for ayıraç in ayıraçlar:
        ##        print(ayıraç)
        sayı_listesi = []

        start = 0
        for i in ayıraç:
            if not (e := sayılar[start:i]): continue
            sayı_listesi.append(sayılar[start:i])
            start = i
        if e := sayılar[start:]: sayı_listesi.append(e)
        for j in sayı_listesi:
            aranan_listeler.append(sayı_listesi)
    ekle1 = []
    for i in aranan_listeler:
        if i not in ekle1:
            ekle1.append(i)

    ekle2 = []
    for i in ekle1:
        a = ' -'.join(i)
        ekle2.append(a)
    ekle3 = []
    for j in ekle2:
        b = j.split(' ')
        ekle3.append(b)
    işlem_listesi = []
    for i in range(0, len(ekle1)):
        işlem_listesi.append(ekle1[i] + ekle3[i])
    kullanılacak = []
    for i in işlem_listesi:
        for k in range(1, len(i) + 1):
            a = itertools.combinations(i, k)
            for j in a:
                kullanılacak.append(list(j))

    istenenler = []
    for i in kullanılacak:
        sayaç = 0
        for j in i:
            sayaç += int(j)
        if sayaç == 100:
            istenenler.append(i)
    sonuç = []
    for i in istenenler:
        kullan = []
        for j in i:
            kullan.append(abs(int(j)))
        if len(set(kullan)) == len(kullan):
            sonuç.append(i)
    ensonunda=[]
    for i in sonuç:
        ekle=[]
        for j in i:
            a=j.replace('-','')
            ekle.append(a)
        topla=''
        for k in ekle:
            topla+=k
        if len(topla)==9:
            ensonunda.append(i)
        sonunsonu.append(ensonunda)
buraya=[]
for i in sonunsonu:
    for j in i:
        buraya.append(j)
vurgun=[]
for i in buraya:
    if set(i) not in vurgun:
        vurgun.append(set(i))
print(vurgun)
print(len(vurgun))

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