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
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 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)
işaretleri eksi yapmak için harcadığım çabadan sonra sizin yazdığınız kodu görünce nede yormuşum kendimi dedim
iyi düşünce bravo
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
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))
O kadar soruda kullanmama rağmen benimde aklıma gelmedi
Bu da product
lu 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))
Ben biraz daha basit düşündüm sanırım
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
Çok iyi, ilginç algoritma
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
>>> 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