Bir kısayol bulamadım.
pozisyonlar = {}
for x in range(8):
for y in range(8):
for z in range(8):
pozisyonlar.update({(x, y, z): True})
def degistir(x, y, z):
if (x, y, z) in pozisyonlar:
pozisyonlar[(x, y, z)] = False
def xyz_duz(x1, y1, z1):
for n in range(8):
pozisyonlar[(n, y1, z1)] = False
pozisyonlar[(x1, n, z1)] = False
pozisyonlar[(x1, y1, n)] = False
def xyz_sag_carpraz(x1, y1, z1):
if x1 < z1:
for x, y, z in zip(range(8 - (z1 - x1)), range(y1 - x1, 8), range((z1 - x1), 8)):
degistir(x, y, z)
else:
for x, y, z in zip(range((x1 - z1), 8), range(y1 - z1, 8), range(8 - (x1 - z1))):
degistir(x, y, z)
def xyz_sol_carpraz(x1, y1, z1):
if x1 + z1 > 7:
x, z = x1, z1
if x1 > z1:
x, z = 7, z - (7 - x)
for n, y in zip(range(0, x - z + 1), range(y1 - (z1 - z), 8)):
degistir(x - n, y, z + n)
else:
x, z = x - (7 - z), 7
for n, y in zip(range(0, z - x + 1), range(y1 - (x1 - x), 8)):
degistir(x + n, y, z - n)
else:
x, z = x1, z1
if x1 > z1:
x, z = x + z, 0
for n, y in zip(range(0, x - z + 1), range(y1 - (z1 - z), 8)):
degistir(x - n, y, z + n)
else:
x, z = 0, z + x
for n, y in zip(range(0, z - x + 1), range(y1 - (x1 - x), 8)):
degistir(x + n, y, z - n)
def xz_sag_carpraz(x1, y1, z1):
if x1 < z1:
for x, z in zip(range(8 - (z1 - x1)), range((z1 - x1), 8)):
degistir(x, y1, z)
else:
for x, z in zip(range((x1 - z1), 8), range(8 - (x1 - z1))):
degistir(x, y1, z)
def xy_sag_carpraz(x1, y1, z1):
if x1 < y1:
for x, y in zip(range(8 - (y1 - x1)), range((y1 - x1), 8)):
degistir(x, y, z1)
else:
for x, y in zip(range((x1 - y1), 8), range(8 - (x1 - y1))):
degistir(x, y, z1)
def yz_sag_carpraz(x1, y1, z1):
if z1 < y1:
for z, y in zip(range(8 - (y1 - z1)), range((y1 - z1), 8)):
degistir(x1, y, z)
else:
for z, y in zip(range((z1 - y1), 8), range(8 - (z1 - y1))):
degistir(x1, y, z)
def xz_sol_carpraz(x1, y1, z1):
if x1 + z1 > 7:
x, z = x1, z1
if x1 > z1:
x, z = 7, z - (7 - x)
for n in range(0, x - z + 1):
degistir(x - n, y1, z + n)
else:
x, z = x - (7 - z), 7
for n in range(0, z - x + 1):
degistir(x + n, y1, z - n)
else:
x, z = x1, z1
if x1 > z1:
x, z = x + z, 0
for n in range(0, x - z + 1):
degistir(x - n, y1, z + n)
else:
x, z = 0, z + x
for n in range(0, z - x + 1):
degistir(x + n, y1, z - n)
def xy_sol_carpraz(x1, y1, z1):
if x1 + y1 > 7:
x, y = x1, y1
if x1 > y1:
x, y = 7, y - (7 - x)
for n in range(0, x - y + 1):
degistir(x - n, y + n, z1)
else:
x, y = x - (7 - y), 7
for n in range(0, y - x + 1):
degistir(x + n, y - n, z1)
else:
x, y = x1, y1
if x1 > y1:
x, y = x + y, 0
for n in range(0, x - y + 1):
degistir(x - n, y + n, z1)
else:
x, y = 0, y + x
for n in range(0, y - x + 1):
degistir(x + n, y - n, z1)
def yz_sol_carpraz(x1, y1, z1):
if z1 + y1 > 7:
z, y = z1, y1
if z1 > y1:
z, y = 7, y - (7 - z)
for n in range(0, z - y + 1):
degistir(x1, y + n, z - n)
else:
z, y = z - (7 - y), 7
for n in range(0, y - z + 1):
degistir(x1, y - n, z + n)
else:
z, y = z1, y1
if y1 > z1:
z, y = z + y, 0
for n in range(0, z - y + 1):
degistir(x1, y + n, z - n)
else:
z, y = 0, y + z
for n in range(0, y - z + 1):
degistir(x1, y - n, z + n)
def xyz_hepsi(x, y, z):
xyz_duz(x, y, z)
xyz_sag_carpraz(x, y, z)
xyz_sol_carpraz(x, y, z)
xy_sag_carpraz(x, y, z)
xy_sol_carpraz(x, y, z)
yz_sag_carpraz(x, y, z)
yz_sol_carpraz(x, y, z)
xz_sag_carpraz(x, y, z)
xz_sol_carpraz(x, y, z)
toplam = 0
for x in range(8):
for y in range(8):
for z in range(8):
if pozisyonlar[(x, y, z)] == True:
xyz_hepsi(x, y, z)
toplam += 1
print(f"Toplam vezir sayısı: {toplam}")
for key in pozisyonlar:
if pozisyonlar[key] == True:
print(key) # Ekrana hiç bir şey yazılmayacaktır çünkü True olan yer kalmamış olacak.
Çıktı:
Toplam vezir sayısı: 35
-
for döngüleri ile False olmayan her bir konuma vezir yerleştirilir ve ardından xyz_hepsi() isimli fonksiyon çağrılarak o vezirin diğer vezirleri yiyebileceği tüm konumlar False yapılır. Bu şekilde ilerlendiğinde, nihayet tüm for döngüleri bittiğinde geriye hiç bir True pozisyon kalmadığı gözlemlenir. Toplam vezir sayısı ise 35 olacaktır.
-
Fonksiyonlar biraz fazla yer tuttu ama tek amaçları bir vezirin çeşitli eksenlerde, diğer vezirleri yiyebileceği noktaları sözlük içerisinde False olarak işaretlemek.
-Vezirlerin konumları:
x y z
0 0 0
0 1 2
0 2 4
0 3 1
0 4 3
1 0 3
1 1 5
1 2 0
1 4 6
1 6 1
1 7 4
2 0 1
2 1 7
2 4 0
2 5 2
2 6 6
3 0 4
3 1 0
3 3 6
3 5 5
3 7 1
4 0 2
4 2 5
4 4 1
4 6 7
5 2 3
5 3 7
5 7 2
6 1 4
6 3 0
6 4 2
6 7 6
7 2 7
7 3 3
7 6 5
Edit: 2 tane fonksiyon eksikmiş, cevap yanlış muhtemelen. Halledebilirsem tekrardan düzenleyeceğim.