Dokuz sayı ve Yüz

Ne yapmak istediğinizi anladım ama şu kullanımı ilk defa görüyorum

if not (e := sayılar[start:i]): continue
            sayı_listesi.append(e)
            start = i
        if e := sayılar[start:]: sayı_listesi.append(e) 
orayı açıklarmısınız ' e : = ' kısmıını

Python3.8’de gelen yeni bir özellik o, Walrus Operatörü olarak geçiyor. Aşağıdaki bağlantıyı bir ziyaret edin isterseniz.

2 Beğeni
 if not (e := sayılar[start:i]): continue
Burda neden atlama gereği duyduk bu şartı sağlayan durumlar varmı ki ?

Bu şart e değişkeni [] olursa sağlanıyor, bunun için listeye eklemiyorum. sayıların içinde ardışık iki sayı bulunursa sağlanır tabii ki. Hem niye bana soruyorsunuz ki, oraya bir tane print koymanız yeterli :slight_smile:

1 Beğeni

Bir örnek liste alıp o şartı kontrol etmiştim sonucu etkilemiyordu ama ayıraçları ardışık kullanmamıştım.Amaç boş listeleri çıkarmak yani
Teşekkürler

Bulamadim.

Cozum yontemi olarak @EkremDincel’in yazdigi metodu soyleyecektim.

Genel cozum olarak ise aynisini expression tree’ler ile yapmayi.

Bu problemdeki bir sorun kac adet kac basamakli sayi kullanilacagini bilmiyoruz. Bilsek bile sanirim her grup icin 9! varyasyon var.

1 Beğeni

Şöyle bir şey yazdım ama sadece 7 tane buluyor (soruda 12 tane bulunduğu söylenmiş), bir de sebebini anlayamadım ama aynı işlem iki defa yapılmış oluyor (aynı toplam iki defa elde ediliyor):

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((len(sayı_listesi)**2)):
            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(sonuçlar)

bende bir kod yazdım ve 7 tane buluyorum sorun nerde anlayamadım
çözüm kümesi 12 elemanlı :frowning:

import itertools

sayılar = "123456789"

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:
        ##        print(ayıraç)
        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)

import itertools

sayılar = "123456789"

for ayıraç_sayısı in range(7):

    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(e)
            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
        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
    sonuç=[]
    for i in istenenler:
        kullan=[]
        for j in i:
            kullan.append(abs(int(j)))
        if len(set(kullan))==len(kullan):
            sonuç.append(i)
    nihayet=[]
    for i in sonuç:
        if set(i) not  in nihayet:
            nihayet.append(set(i))
    buldum=[]
    for i in nihayet:
        boş=''
        for j in i:
            boş+=j
        c=boş.replace('-','')
        if len(c)==9:
            buldum.append(i)

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