Sator kareleri meşhur bir kelime dizilimi programıdır. Örneği şu şekildedir.
Kurallardan anlaşılacağa üzere her satır ve sütunda anlamlı kelimeler bulunuyor ve bunlar bazen birbirinin tersi olabiliyor. Anlamlı sator karelerini bulabilmek için öncelikle elimizde bir kelime veri tabanı olması gerekiyor. 60bin anlamlı kelimelerden oluşan veri tabanını indirmek için: Türkçe Sözcük veritabanı na tıklayabilirsiniz. Ben doğrudan import ettiğim için .py dosyası haline getirdim, siz elinizdeki başka veritabanlarını da kullanabilirsiniz.
Bundan sonra kodumuz bir kaç aşamadan geçiyor. Aşağıda kodlarla sator karelerini bulma girişimlerimiz olmuştur.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import words
besli = []
toplam = 0
kelimeler = words.kelime
for k in kelimeler:
if len(k)==5 and k[::-1] in kelimeler:
besli.append(k)
for k1 in besli:
if k1==k1[::-1]:
continue
for k2 in besli:
if k2==k2[::-1]:
continue
if k1[1]!=k2[0] or k1[3]!=k2[4]:
continue
for k3 in besli:
if k3!=k3[::-1] or k3[0]!=k1[2] or k3[1]!=k2[2]:
continue
k4 = k2[::-1]
k5 = k1[::-1]
print(k1,k2,k3,k4,k5,sep="\n")
print()
toplam += 1
print(toplam)
Sonuç olarak yukarıdaki program hem hızlı hem de doğru bulduğu 22 (ayna görüntüleri hariç) sator karesinden bir kaç örnek.
1
2
3
4
5
6
7
8
9
10
11
SAKAT
AKALA
KAÇAK
ALAKA
TAKAS
KİNİŞ
İVESİ
NEDEN
İSEVİ
ŞİNİK
Programın daha geliştirilmiş ve kaçlı sator karesi aradığınıza da yönelik kodu aşağıdadır.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import json
from itertools import permutations, product
def read_json(filename):
with open(filename, encoding="utf-8") as f:
return json.load(f)
def filter_words(words, length):
data = [x for i in words if len(x := i["word"]) == length]
return [i for i in data if i[::-1] in data]
def possible_sator_words(x, y, index=(1, -2)):
cases = [i for i in x if y[index[0]] == i[0] and y[index[1]] == i[-1]]
if sum(map(abs, index)) == (len(y) if len(y) % 2 else len(y) - 1):
return cases
else:
return [cases, possible_sator_words(x, y, (index[0] + 1, index[1] - 1))]
def is_sator_square(lst):
return all(lst[m] == "".join([j[m] for j in lst]) for m in range(len(lst)))
def find_sator_squares(words, length):
words = filter_words(words, length)
array = []
for word in words:
if all(possibilities := possible_sator_words(words, word)) and len(possibilities) >= 1:
sator_group = [[word]] + (possibilities if length % 2 else [possibilities])
for p in product(*sator_group):
for perm in permutations(p, length - 2):
perm += tuple(j[::-1] for j in perm[:2])[::-1]
if (
is_sator_square(perm)
and
sorted(perm) not in array
and all(perm.count(i) == 1 for i in perm)
):
array += [sorted(perm)]
return array
Siz de sator kareleri ile ilgili kodu, yorumlar kısmına ekleyebilirsiniz.