Şöyle bir algoritma izledim:
def sator_square(words: list, length: int, stop=0):
if not length:
yield []
return
for i in range(len(words)):
for comb in sator_square(words[i + 1:], length - 1, stop + 1):
if (
len(lst := [words[i], *comb]) != length + stop
or
all(lst[m] == "".join([j[m] for j in lst]) for m in range(len(lst)))
):
yield lst
Şu sorgu:
all(lst[m] == "".join([j[m] for j in lst]) for m in range(len(lst)))
sizin yazdığınız sorguların hepsini tek seferde yapar.
words
'ü, fonksiyona argüman olarak vermeden önce filtrlersek, gereksiz kısımlardan kurtuluruz.
words = [
"PLAK",
"LOTA",
"ATOL",
"KALP",
"ADAM",
"NEDE",
"URFA",
"GELE",
"NAZİ",
"ARAZ",
"ZARA",
"İZAN",
]
print(*sator_square(words, 4))
Çıktı:
['PLAK', 'LOTA', 'ATOL', 'KALP'] ['NAZİ', 'ARAZ', 'ZARA', 'İZAN']
Ayrıca x uzunluğundaki bir listenin 4’lü kombinasyonlarından, yukardaki koşula uyan kombinasyonları seçmek istiyorsunuz.
6’lı kombinasyon yapmak istediğimizde, yani sator karesinde 6 tane kelime kullanacaksak, 6 tane for döngüsünü alt alta yazmak iyi bir yöntem olmazdı.
Bu tür iterasyon işlemleri için itertools
kütüphanesi de oldukça kullanışlı.