Satranç Tahtası ve Tek Sayılar

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ş :smiley:
emeğinize sağlık bir amatörle profesyonel arasındaki fark böyle olsa gerek :slight_smile:
Tebrikler

sorunun matematiksel yorumunu kast ediyorsanız orda şüphe yok :slight_smile:

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.

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