На данный момент лучший в мире решатель для угадывания слов в таких играх как виселица, ПолеЧудес. После тестов еще доделаю статитистику для слов когда ведущий не говорит в каких местах буквы находятся.
https://rutube.ru/video/4367bfea32c91158da64767c99...
def search():
буквы=set("абвгдежзийклмнопрстуфхцчьъышщэюя")
тексты_виджетов = {widget.get("1.0", tk.END).strip() for widget in text_widgets}
буквы.difference_update(set(мусор.get())|тексты_виджетов)
буквы2=''.join(буквы)
gg=""
pp=0
for widget in text_widgets:
jj=widget.get("1.0", tk.END)[:-1]
if jj:
if pp:
gg+="[" + буквы2 + "]{"+f"{pp}"+"}"
pp=0
gg+=jj
else:
pp+=1
else:
if pp: gg+="[" + буквы2 + "]{"+f"{pp}"+"}$"
else: gg+="$"
в_слове=dict(Counter(есть.get()))
for i in в_слове:
pj=f".*{i}"
gg=f"(?={pj*в_слове[i]})"+gg
gg="^"+gg
все_слова = [word for word in слова if len(word)==длина and re.findall(gg, word)]
сет={}
for буква in буквы:
счет={}
for слово in все_слова:
if буква in слово:
ff=tuple([index for index, char in enumerate(слово) if char == буква])
счет[ff] = счет.get(ff, 0) + 1
общее=счет.values()
if общее:
сумма=sum(общее)
сет[буква]=[сумма-(max(общее)*min(общее)), сумма, len(общее)]
for i in в_слове:
if i in сет: del сет[i]
for area in [text_area, text_area2, text_area3]:
area.delete("1.0", tk.END)
text_area.insert(tk.END, f"Букв: {len(сет.keys())} Cлов: {len(все_слова)}\n" + "\n".join(все_слова))
insert_colored_text(text_area2, "Для слов ≥ 7\n")
insert_colored_text(text_area3, "Для слов ≤ 6\n")
for номер, area in enumerate([text_area2, text_area3, text_area4]):
for key, value in sorted(сет.items(), key=lambda x: x[1][номер], reverse=True):
area.insert(tk.END, f"{key.upper()} = {value[номер]}\n")
for i in "абвгдежзийклмнопрстуфхцчьъышщэюя":
if i in сет:
буквы_сл[i].config(bg="white", fg="black")
else:
буквы_сл[i].config(bg="#eee5e5", fg="#f0f0f0")