Dokuz sayı ve Yüz

1 den 9 a kadar olan sayıları sırayla yazarak ve araya sadece + ve - işaretleri koyarak 100sayısını elde ediniz. Toplam 12 çözüm vardır.Bunlar nelerdir?
Örnek: 1+2+34-5+67-8+9=100
Şöyle bir yol düşündüm str( 123456789) parçalarına ayrılmalı 1er1er ve 2şer 2şer ayırsam sıkıntı yok
Ama hem 1hemde 2 basamaklı sayıları içerenlerde olay karışıyor.
Birde aynı sorun +ve - olayındada var
Nasıl bir yol izlemek gerekir?

- associative (birlesik?) veya commutative (degisik?) olmadigi icin (hangisi bilemedim) islem sirasi sorunu cikiyor:

123 - (456 - 789) yazabiliyor muyuz?

Bu forumda bir yerlerde × ÷ de olan bir versiyonunu yapmistik, arayayim…

Parantez kullanmıyoruz

Buradaki mantığı kullanırsak bu kod işi görüyor:

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)       
        print(sayı_listesi)

Bir sayacı arttırın, ikinin üslerinden kalanına göre aralara - veya + koyarsınız.

1 Beğeni

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))