Ufak bir sayı sonucu ne kadar da çok değiştiriyor 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)
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)
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))
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))
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
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))
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_)
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ş)
arananlar=[]
for i in kullanılan_sayılar:
sonuç = '{}*{}+{}-{}/{}'.format(i[0:3], i[3:6], i[6], i[7],i[8])
arananlar.append(eval(sonuç))
if eval(sonuç)==843502.5:
print(sonuç)
print(max(arananlar))
bu kısmı maksimum değeri bulduktan sonra hangisinin sağladığını kontrol için yazdım.Başka bir yol varmı hem maksimum değeri hemde işlemi aynı anda verebilecek?