Bu arada söylediğiniz mantık doğru gibi duruyor.
from itertools import product
rotate = lambda iterable, x: zip(*parser(iterable, x))
def parser(iterable, step):
i = 0
j = step
while i < len(iterable):
yield iterable[i:j]
i, j = j, j+step
assert list(parser([1,2,3,4], 2)) == [[1, 2], [3, 4]]
assert list(rotate([1,2,3,4], 2)) == [(1, 3), (2, 4)]
##-----------------------
tahta_genişliği = 5
santranç_tahtası = product([0, 1], repeat = tahta_genişliği ** 2)
sayaç = 0
for olasılık in santranç_tahtası:
for parse in parser(olasılık, tahta_genişliği):
if not sum(parse) % 2:
break
else: # nobreak :P
for parse in rotate(olasılık, tahta_genişliği):
if not sum(parse) % 2:
break
else: # nobreak
sayaç += 1
print(sayaç)
1 Beğeni
benim algoritma ne hale gelmiş
emeğinize sağlık bir amatörle profesyonel arasındaki fark böyle olsa gerek
Tebrikler
sorunun matematiksel yorumunu kast ediyorsanız orda şüphe yok
Evet, soruyu çözmek için şöyle bir fonksiyon yazabiliriz:
f = lambda size: 2 ** ((size -1) ** 2)
1 Beğeni
import numpy as np
from itertools import product
tahta_büyüklüğü = 5
farklı_tahta_sayısı = [0]
def kontrol_et(tahta):
tahta = np.array(tahta)
for i in np.arange(tahta_büyüklüğü):
if not np.sum(tahta[i]) % 2 == 1:
break
if not np.sum(tahta.T[i]) % 2 == 1:
break
if i == tahta_büyüklüğü-1:
farklı_tahta_sayısı[0] += 1
for i in product(np.arange(2),repeat=tahta_büyüklüğü**2):
tahta = np.array(i).reshape(tahta_büyüklüğü,tahta_büyüklüğü)
kontrol_et(tahta)
print(farklı_tahta_sayısı[0])
Bir kaç dakika sonra 65536 sayısını veriyor.
farklı_tahta_sayısı
niçin bir liste?
Çünkü listeye defte tanımlı fonksiyondan müdahale edebiliyorum. fonksiyonda iç içe döngü veya if kullanıldığında local dışındaki değişkenlere ulaşamıyorum.
Herhangi bir değişkeni global yapmanız burada daha uygun olur.
Python’da if ve döngü blokları kendi scope’larına sahip değil.
toxide
Mart 20, 2020, 12:12ös
29
Biraz geç oldu ama ben de kodumu paylaşmak isterim.
from itertools import product
def satirlara_ayir(dizilis: list, satir_uzunlugu: int) -> list:
sonuc = []
for i in range(satir_uzunlugu):
satir = dizilis[i * satir_uzunlugu:(i + 1) * satir_uzunlugu]
sonuc.append(satir)
return sonuc
def satir_tek_mi(tahta: list) -> bool:
for satir in tahta:
if sum(satir) % 2 == 0:
return False
return True
def sutun_tek_mi(tahta: list) -> bool:
for i in range(len(tahta[0])):
sutun = []
for satir in tahta:
sutun.append(satir[i])
if sum(sutun) % 2 == 0:
return False
return True
def gecerli_mi(tahta: list) -> bool:
satir_tek = satir_tek_mi(tahta)
sutun_tek = sutun_tek_mi(tahta)
return satir_tek and sutun_tek
def main():
satir_uzunluk, sutun_uzunluk = 5, 5
toplam_kare = satir_uzunluk * sutun_uzunluk
dizilisler = product(range(2), repeat=toplam_kare)
gecerli_tahta_sayisi = 0
for dizilis in dizilisler:
tahta = satirlara_ayir(dizilis, satir_uzunluk)
if gecerli_mi(tahta):
gecerli_tahta_sayisi += 1
print(gecerli_tahta_sayisi)
if __name__ == "__main__":
main()
2 Beğeni