Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
0795dff811
|
|||
|
eb2c2771c4
|
|||
|
9036816e97
|
|||
|
ab7fb24b01
|
@@ -1,4 +1,5 @@
|
|||||||
### Python template
|
### Python template
|
||||||
|
scripts/
|
||||||
|
|
||||||
deploy/
|
deploy/
|
||||||
.idea/
|
.idea/
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
**/*.csv filter=lfs diff=lfs merge=lfs -text
|
**/*.csv filter=lfs diff=lfs merge=lfs -text
|
||||||
**/*.png filter=lfs diff=lfs merge=lfs -text
|
**/*.png filter=lfs diff=lfs merge=lfs -text
|
||||||
|
scripts/dicts/data/*.txt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
**/*.gz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|||||||
-115
@@ -1,115 +0,0 @@
|
|||||||
digraph model_graph {
|
|
||||||
fontname = "Roboto"
|
|
||||||
fontsize = 8
|
|
||||||
splines = true
|
|
||||||
rankdir = "LR";
|
|
||||||
|
|
||||||
node [
|
|
||||||
fontname = "Roboto"
|
|
||||||
fontsize = 8
|
|
||||||
shape = "plaintext"
|
|
||||||
]
|
|
||||||
|
|
||||||
edge [
|
|
||||||
fontname = "Roboto"
|
|
||||||
fontsize = 8
|
|
||||||
]
|
|
||||||
|
|
||||||
// Tables
|
|
||||||
|
|
||||||
TABLE_Puzzle [label=<
|
|
||||||
<TABLE BGCOLOR="white" BORDER="1" CELLBORDER="0" CELLSPACING="0">
|
|
||||||
<TR>
|
|
||||||
<TD COLSPAN="2" CELLPADDING="5" ALIGN="CENTER" BGCOLOR="#4C89C8">
|
|
||||||
<FONT FACE="Roboto" COLOR="white" POINT-SIZE="10">
|
|
||||||
<B>Puzzle</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
</TR>
|
|
||||||
|
|
||||||
|
|
||||||
<TR>
|
|
||||||
<TD ALIGN="LEFT" BORDER="0">
|
|
||||||
<FONT FACE="Roboto">
|
|
||||||
<B>id</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
<TD ALIGN="LEFT">
|
|
||||||
<FONT FACE="Roboto">
|
|
||||||
<B>UUID</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
</TR>
|
|
||||||
|
|
||||||
<TR>
|
|
||||||
<TD ALIGN="LEFT" BORDER="0">
|
|
||||||
<FONT FACE="Roboto">
|
|
||||||
<B>board</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
<TD ALIGN="LEFT">
|
|
||||||
<FONT FACE="Roboto">
|
|
||||||
<B>Varchar</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
</TR>
|
|
||||||
|
|
||||||
<TR>
|
|
||||||
<TD ALIGN="LEFT" BORDER="0">
|
|
||||||
<FONT FACE="Roboto">
|
|
||||||
<B>solutions</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
<TD ALIGN="LEFT">
|
|
||||||
<FONT FACE="Roboto">
|
|
||||||
<B>JSON</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
</TR>
|
|
||||||
|
|
||||||
<TR>
|
|
||||||
<TD ALIGN="LEFT" BORDER="0">
|
|
||||||
<FONT FACE="Roboto">
|
|
||||||
<B>extra</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
<TD ALIGN="LEFT">
|
|
||||||
<FONT FACE="Roboto">
|
|
||||||
<B>JSON</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
</TR>
|
|
||||||
|
|
||||||
<TR>
|
|
||||||
<TD ALIGN="LEFT" BORDER="0">
|
|
||||||
<FONT FACE="Roboto">
|
|
||||||
<B>definitions</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
<TD ALIGN="LEFT">
|
|
||||||
<FONT FACE="Roboto">
|
|
||||||
<B>JSON</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
</TR>
|
|
||||||
|
|
||||||
<TR>
|
|
||||||
<TD ALIGN="LEFT" BORDER="0">
|
|
||||||
<FONT FACE="Roboto">
|
|
||||||
<B>date</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
<TD ALIGN="LEFT">
|
|
||||||
<FONT FACE="Roboto">
|
|
||||||
<B>Date</B>
|
|
||||||
</FONT>
|
|
||||||
</TD>
|
|
||||||
</TR>
|
|
||||||
|
|
||||||
</TABLE>
|
|
||||||
>]
|
|
||||||
|
|
||||||
|
|
||||||
// Relations
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
import csv
|
||||||
|
import gzip
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
from collections import defaultdict
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from zangramru.utils.trie import TrieNode
|
||||||
|
|
||||||
|
CWD = Path(__file__).parent
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
|
|
||||||
|
def build_trie(dict_path: Path) -> TrieNode:
|
||||||
|
"""Build trie for wikidict definitions."""
|
||||||
|
trie = TrieNode()
|
||||||
|
total_words = 0
|
||||||
|
with gzip.open(dict_path) as f_in:
|
||||||
|
for line in f_in:
|
||||||
|
word_info = json.loads(line)
|
||||||
|
# If it starts wit capital.
|
||||||
|
if word_info.get("lang_code") != "ru":
|
||||||
|
continue
|
||||||
|
if word_info.get("pos") != "noun":
|
||||||
|
continue
|
||||||
|
if word_info["word"][0].isupper():
|
||||||
|
continue
|
||||||
|
senses = word_info.get("senses", [])
|
||||||
|
multi_def = []
|
||||||
|
for sense in senses:
|
||||||
|
glosses = sense.get("glosses")
|
||||||
|
if glosses:
|
||||||
|
multi_def.extend(glosses)
|
||||||
|
|
||||||
|
total_words += 1
|
||||||
|
trie.add(word_info["word"], definitions=multi_def)
|
||||||
|
|
||||||
|
logger.info(f"Trie is ready. Total words: {total_words}")
|
||||||
|
return trie
|
||||||
|
|
||||||
|
|
||||||
|
def get_defs(
|
||||||
|
dict_file: Path,
|
||||||
|
defs: TrieNode,
|
||||||
|
stats: dict[str, int],
|
||||||
|
) -> dict[str, list[str]]:
|
||||||
|
"""Find all word definitions for all our dicts."""
|
||||||
|
word_def = {}
|
||||||
|
with dict_file.open("r") as f_in:
|
||||||
|
for line in f_in:
|
||||||
|
if len(line.strip()) < 4:
|
||||||
|
stats["too_short"] += 1
|
||||||
|
continue
|
||||||
|
node = defs.find_node(line)
|
||||||
|
if node is None:
|
||||||
|
stats["not_found"] += 1
|
||||||
|
continue
|
||||||
|
if not node.valid_word:
|
||||||
|
stats["invalid"] += 1
|
||||||
|
continue
|
||||||
|
word_def[node.value] = node.definitions
|
||||||
|
return word_def
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
"""Update dictionaries."""
|
||||||
|
trie = build_trie(Path(CWD / "wikidict.jsonl.gz"))
|
||||||
|
with Path(CWD.parent.parent / "zangramru/services/dict.csv").open("w") as f_out:
|
||||||
|
writer = csv.writer(f_out, delimiter="|")
|
||||||
|
writer.writerow(["word", "def"])
|
||||||
|
stats = defaultdict(int)
|
||||||
|
words: dict[str, list[str]] = {}
|
||||||
|
|
||||||
|
for file in Path(CWD / "data").iterdir():
|
||||||
|
logger.info(f"Processing {file}")
|
||||||
|
words.update(get_defs(file, trie, stats))
|
||||||
|
|
||||||
|
logger.info("Done updating")
|
||||||
|
logger.info(stats)
|
||||||
|
|
||||||
|
for word, defs in words.items():
|
||||||
|
all_defs = ""
|
||||||
|
if len(defs) == 1:
|
||||||
|
all_defs = defs[0]
|
||||||
|
else:
|
||||||
|
all_defs = "\n".join(f"{i + 1}: {defn}" for i, defn in enumerate(defs))
|
||||||
|
writer.writerow([word, all_defs])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
и
|
||||||
|
в
|
||||||
|
не
|
||||||
|
на
|
||||||
|
я
|
||||||
|
быть
|
||||||
|
он
|
||||||
|
с
|
||||||
|
что
|
||||||
|
а
|
||||||
|
по
|
||||||
|
это
|
||||||
|
она
|
||||||
|
этот
|
||||||
|
к
|
||||||
|
но
|
||||||
|
они
|
||||||
|
мы
|
||||||
|
как
|
||||||
|
из
|
||||||
|
у
|
||||||
|
который
|
||||||
|
то
|
||||||
|
за
|
||||||
|
свой
|
||||||
|
что
|
||||||
|
весь
|
||||||
|
год
|
||||||
|
от
|
||||||
|
так
|
||||||
|
о
|
||||||
|
для
|
||||||
|
ты
|
||||||
|
же
|
||||||
|
все
|
||||||
|
тот
|
||||||
|
мочь
|
||||||
|
вы
|
||||||
|
человек
|
||||||
|
такой
|
||||||
|
его
|
||||||
|
сказать
|
||||||
|
только
|
||||||
|
или
|
||||||
|
ещё
|
||||||
|
бы
|
||||||
|
себя
|
||||||
|
один
|
||||||
|
как
|
||||||
|
уже
|
||||||
|
до
|
||||||
|
время
|
||||||
|
если
|
||||||
|
сам
|
||||||
|
когда
|
||||||
|
другой
|
||||||
|
вот
|
||||||
|
говорить
|
||||||
|
наш
|
||||||
|
мой
|
||||||
|
знать
|
||||||
|
стать
|
||||||
|
при
|
||||||
|
чтобы
|
||||||
|
дело
|
||||||
|
жизнь
|
||||||
|
кто
|
||||||
|
первый
|
||||||
|
очень
|
||||||
|
два
|
||||||
|
день
|
||||||
|
её
|
||||||
|
новый
|
||||||
|
рука
|
||||||
|
даже
|
||||||
|
во
|
||||||
|
со
|
||||||
|
раз
|
||||||
|
где
|
||||||
|
там
|
||||||
|
под
|
||||||
|
можно
|
||||||
|
ну
|
||||||
|
какой
|
||||||
|
после
|
||||||
|
их
|
||||||
|
работа
|
||||||
|
без
|
||||||
|
самый
|
||||||
|
потом
|
||||||
|
надо
|
||||||
|
хотеть
|
||||||
|
ли
|
||||||
|
слово
|
||||||
|
идти
|
||||||
|
большой
|
||||||
|
должен
|
||||||
|
место
|
||||||
|
иметь
|
||||||
|
ничто
|
||||||
@@ -0,0 +1,900 @@
|
|||||||
|
то
|
||||||
|
сейчас
|
||||||
|
тут
|
||||||
|
лицо
|
||||||
|
каждый
|
||||||
|
друг
|
||||||
|
нет
|
||||||
|
теперь
|
||||||
|
ни
|
||||||
|
глаз
|
||||||
|
тоже
|
||||||
|
тогда
|
||||||
|
видеть
|
||||||
|
вопрос
|
||||||
|
через
|
||||||
|
да
|
||||||
|
здесь
|
||||||
|
дом
|
||||||
|
да
|
||||||
|
потому
|
||||||
|
сторона
|
||||||
|
какой-то
|
||||||
|
думать
|
||||||
|
сделать
|
||||||
|
страна
|
||||||
|
жить
|
||||||
|
чем
|
||||||
|
мир
|
||||||
|
об
|
||||||
|
последний
|
||||||
|
случай
|
||||||
|
голова
|
||||||
|
более
|
||||||
|
делать
|
||||||
|
что-то
|
||||||
|
смотреть
|
||||||
|
ребенок
|
||||||
|
просто
|
||||||
|
конечно
|
||||||
|
сила
|
||||||
|
российский
|
||||||
|
конец
|
||||||
|
перед
|
||||||
|
несколько
|
||||||
|
вид
|
||||||
|
система
|
||||||
|
всегда
|
||||||
|
работать
|
||||||
|
между
|
||||||
|
три
|
||||||
|
нет
|
||||||
|
понять
|
||||||
|
пойти
|
||||||
|
часть
|
||||||
|
спросить
|
||||||
|
город
|
||||||
|
дать
|
||||||
|
также
|
||||||
|
никто
|
||||||
|
понимать
|
||||||
|
получить
|
||||||
|
отношение
|
||||||
|
лишь
|
||||||
|
второй
|
||||||
|
именно
|
||||||
|
ваш
|
||||||
|
хотя
|
||||||
|
ни
|
||||||
|
сидеть
|
||||||
|
над
|
||||||
|
женщина
|
||||||
|
оказаться
|
||||||
|
русский
|
||||||
|
один
|
||||||
|
взять
|
||||||
|
прийти
|
||||||
|
являться
|
||||||
|
деньги
|
||||||
|
почему
|
||||||
|
вдруг
|
||||||
|
любить
|
||||||
|
стоить
|
||||||
|
почти
|
||||||
|
земля
|
||||||
|
общий
|
||||||
|
ведь
|
||||||
|
машина
|
||||||
|
однако
|
||||||
|
сразу
|
||||||
|
хорошо
|
||||||
|
вода
|
||||||
|
отец
|
||||||
|
высокий
|
||||||
|
остаться
|
||||||
|
выйти
|
||||||
|
много
|
||||||
|
проблема
|
||||||
|
начать
|
||||||
|
хороший
|
||||||
|
час
|
||||||
|
это
|
||||||
|
сегодня
|
||||||
|
право
|
||||||
|
совсем
|
||||||
|
нога
|
||||||
|
считать
|
||||||
|
главный
|
||||||
|
решение
|
||||||
|
увидеть
|
||||||
|
дверь
|
||||||
|
казаться
|
||||||
|
образ
|
||||||
|
писать
|
||||||
|
история
|
||||||
|
лучший
|
||||||
|
власть
|
||||||
|
закон
|
||||||
|
все
|
||||||
|
война
|
||||||
|
бог
|
||||||
|
голос
|
||||||
|
найти
|
||||||
|
поэтому
|
||||||
|
стоять
|
||||||
|
вообще
|
||||||
|
тысяча
|
||||||
|
больше
|
||||||
|
вместе
|
||||||
|
маленький
|
||||||
|
книга
|
||||||
|
некоторый
|
||||||
|
решить
|
||||||
|
любой
|
||||||
|
возможность
|
||||||
|
результат
|
||||||
|
ночь
|
||||||
|
стол
|
||||||
|
никогда
|
||||||
|
имя
|
||||||
|
область
|
||||||
|
молодой
|
||||||
|
пройти
|
||||||
|
например
|
||||||
|
статья
|
||||||
|
оно
|
||||||
|
число
|
||||||
|
компания
|
||||||
|
про
|
||||||
|
государственный
|
||||||
|
полный
|
||||||
|
принять
|
||||||
|
народ
|
||||||
|
никакой
|
||||||
|
советский
|
||||||
|
жена
|
||||||
|
настоящий
|
||||||
|
всякий
|
||||||
|
группа
|
||||||
|
развитие
|
||||||
|
процесс
|
||||||
|
суд
|
||||||
|
давать
|
||||||
|
ответить
|
||||||
|
старый
|
||||||
|
условие
|
||||||
|
твой
|
||||||
|
пока
|
||||||
|
средство
|
||||||
|
помнить
|
||||||
|
начало
|
||||||
|
ждать
|
||||||
|
свет
|
||||||
|
пора
|
||||||
|
путь
|
||||||
|
душа
|
||||||
|
куда
|
||||||
|
нужно
|
||||||
|
разный
|
||||||
|
нужный
|
||||||
|
уровень
|
||||||
|
иной
|
||||||
|
форма
|
||||||
|
связь
|
||||||
|
уж
|
||||||
|
минута
|
||||||
|
кроме
|
||||||
|
находиться
|
||||||
|
опять
|
||||||
|
многий
|
||||||
|
белый
|
||||||
|
собственный
|
||||||
|
улица
|
||||||
|
черный
|
||||||
|
написать
|
||||||
|
вечер
|
||||||
|
снова
|
||||||
|
основной
|
||||||
|
качество
|
||||||
|
мысль
|
||||||
|
дорога
|
||||||
|
мать
|
||||||
|
действие
|
||||||
|
месяц
|
||||||
|
оставаться
|
||||||
|
государство
|
||||||
|
язык
|
||||||
|
любовь
|
||||||
|
взгляд
|
||||||
|
мама
|
||||||
|
играть
|
||||||
|
далекий
|
||||||
|
лежать
|
||||||
|
нельзя
|
||||||
|
век
|
||||||
|
школа
|
||||||
|
подумать
|
||||||
|
уйти
|
||||||
|
цель
|
||||||
|
среди
|
||||||
|
общество
|
||||||
|
посмотреть
|
||||||
|
деятельность
|
||||||
|
организация
|
||||||
|
кто-то
|
||||||
|
вернуться
|
||||||
|
президент
|
||||||
|
комната
|
||||||
|
порядок
|
||||||
|
момент
|
||||||
|
театр
|
||||||
|
следовать
|
||||||
|
читать
|
||||||
|
письмо
|
||||||
|
подобный
|
||||||
|
следующий
|
||||||
|
утро
|
||||||
|
особенно
|
||||||
|
помощь
|
||||||
|
ситуация
|
||||||
|
роль
|
||||||
|
бывать
|
||||||
|
ходить
|
||||||
|
рубль
|
||||||
|
начинать
|
||||||
|
появиться
|
||||||
|
смысл
|
||||||
|
состояние
|
||||||
|
называть
|
||||||
|
рядом
|
||||||
|
квартира
|
||||||
|
назад
|
||||||
|
равный
|
||||||
|
из-за
|
||||||
|
орган
|
||||||
|
внимание
|
||||||
|
тело
|
||||||
|
труд
|
||||||
|
прийтись
|
||||||
|
хотеться
|
||||||
|
сын
|
||||||
|
мера
|
||||||
|
пять
|
||||||
|
смерть
|
||||||
|
живой
|
||||||
|
рынок
|
||||||
|
программа
|
||||||
|
задача
|
||||||
|
предприятие
|
||||||
|
известный
|
||||||
|
окно
|
||||||
|
вести
|
||||||
|
совершенно
|
||||||
|
военный
|
||||||
|
разговор
|
||||||
|
показать
|
||||||
|
правительство
|
||||||
|
важный
|
||||||
|
семья
|
||||||
|
великий
|
||||||
|
производство
|
||||||
|
простой
|
||||||
|
значит
|
||||||
|
третий
|
||||||
|
сколько
|
||||||
|
огромный
|
||||||
|
давно
|
||||||
|
политический
|
||||||
|
информация
|
||||||
|
действительно
|
||||||
|
положение
|
||||||
|
поставить
|
||||||
|
бояться
|
||||||
|
наконец
|
||||||
|
центр
|
||||||
|
происходить
|
||||||
|
ответ
|
||||||
|
муж
|
||||||
|
автор
|
||||||
|
все-таки
|
||||||
|
стена
|
||||||
|
существовать
|
||||||
|
даже
|
||||||
|
интерес
|
||||||
|
становиться
|
||||||
|
федерация
|
||||||
|
правило
|
||||||
|
оба
|
||||||
|
часто
|
||||||
|
московский
|
||||||
|
управление
|
||||||
|
слышать
|
||||||
|
быстро
|
||||||
|
смочь
|
||||||
|
заметить
|
||||||
|
как-то
|
||||||
|
мужчина
|
||||||
|
долго
|
||||||
|
правда
|
||||||
|
идея
|
||||||
|
партия
|
||||||
|
иногда
|
||||||
|
использовать
|
||||||
|
пытаться
|
||||||
|
готовый
|
||||||
|
чуть
|
||||||
|
зачем
|
||||||
|
представить
|
||||||
|
чувствовать
|
||||||
|
создать
|
||||||
|
совет
|
||||||
|
счет
|
||||||
|
сердце
|
||||||
|
движение
|
||||||
|
вещь
|
||||||
|
материал
|
||||||
|
неделя
|
||||||
|
чувство
|
||||||
|
затем
|
||||||
|
данный
|
||||||
|
заниматься
|
||||||
|
продолжать
|
||||||
|
красный
|
||||||
|
глава
|
||||||
|
ко
|
||||||
|
слушать
|
||||||
|
наука
|
||||||
|
узнать
|
||||||
|
ряд
|
||||||
|
газета
|
||||||
|
причина
|
||||||
|
против
|
||||||
|
плечо
|
||||||
|
современный
|
||||||
|
цена
|
||||||
|
план
|
||||||
|
приехать
|
||||||
|
речь
|
||||||
|
четыре
|
||||||
|
отвечать
|
||||||
|
точка
|
||||||
|
основа
|
||||||
|
товарищ
|
||||||
|
культура
|
||||||
|
слишком
|
||||||
|
рассказывать
|
||||||
|
вполне
|
||||||
|
далее
|
||||||
|
рассказать
|
||||||
|
данные
|
||||||
|
представлять
|
||||||
|
мнение
|
||||||
|
социальный
|
||||||
|
около
|
||||||
|
документ
|
||||||
|
институт
|
||||||
|
ход
|
||||||
|
брать
|
||||||
|
забыть
|
||||||
|
проект
|
||||||
|
ранний
|
||||||
|
встреча
|
||||||
|
особый
|
||||||
|
целый
|
||||||
|
директор
|
||||||
|
провести
|
||||||
|
спать
|
||||||
|
плохой
|
||||||
|
может
|
||||||
|
впрочем
|
||||||
|
сильный
|
||||||
|
наверное
|
||||||
|
скорый
|
||||||
|
ведь
|
||||||
|
срок
|
||||||
|
палец
|
||||||
|
опыт
|
||||||
|
помочь
|
||||||
|
больше
|
||||||
|
приходить
|
||||||
|
служба
|
||||||
|
крупный
|
||||||
|
внутренний
|
||||||
|
просить
|
||||||
|
вспомнить
|
||||||
|
открыть
|
||||||
|
привести
|
||||||
|
судьба
|
||||||
|
пока
|
||||||
|
девушка
|
||||||
|
поскольку
|
||||||
|
очередь
|
||||||
|
лес
|
||||||
|
пусть
|
||||||
|
экономический
|
||||||
|
оставить
|
||||||
|
правый
|
||||||
|
состав
|
||||||
|
словно
|
||||||
|
федеральный
|
||||||
|
спрашивать
|
||||||
|
принимать
|
||||||
|
член
|
||||||
|
искать
|
||||||
|
близкий
|
||||||
|
количество
|
||||||
|
похожий
|
||||||
|
событие
|
||||||
|
объект
|
||||||
|
зал
|
||||||
|
создание
|
||||||
|
войти
|
||||||
|
различный
|
||||||
|
значение
|
||||||
|
назвать
|
||||||
|
достаточно
|
||||||
|
период
|
||||||
|
хоть
|
||||||
|
шаг
|
||||||
|
необходимый
|
||||||
|
успеть
|
||||||
|
произойти
|
||||||
|
брат
|
||||||
|
искусство
|
||||||
|
единственный
|
||||||
|
легкий
|
||||||
|
структура
|
||||||
|
выходить
|
||||||
|
номер
|
||||||
|
предложить
|
||||||
|
пример
|
||||||
|
пить
|
||||||
|
исследование
|
||||||
|
гражданин
|
||||||
|
глядеть
|
||||||
|
человеческий
|
||||||
|
игра
|
||||||
|
начальник
|
||||||
|
сей
|
||||||
|
рост
|
||||||
|
ехать
|
||||||
|
международный
|
||||||
|
тема
|
||||||
|
принцип
|
||||||
|
дорогой
|
||||||
|
попасть
|
||||||
|
десять
|
||||||
|
начаться
|
||||||
|
верить
|
||||||
|
метод
|
||||||
|
тип
|
||||||
|
фильм
|
||||||
|
небольшой
|
||||||
|
держать
|
||||||
|
либо
|
||||||
|
позволять
|
||||||
|
край
|
||||||
|
местный
|
||||||
|
менее
|
||||||
|
гость
|
||||||
|
купить
|
||||||
|
уходить
|
||||||
|
собираться
|
||||||
|
воздух
|
||||||
|
туда
|
||||||
|
относиться
|
||||||
|
бывший
|
||||||
|
требовать
|
||||||
|
характер
|
||||||
|
борьба
|
||||||
|
использование
|
||||||
|
кстати
|
||||||
|
подойти
|
||||||
|
размер
|
||||||
|
удаться
|
||||||
|
образование
|
||||||
|
получать
|
||||||
|
мальчик
|
||||||
|
кровь
|
||||||
|
район
|
||||||
|
небо
|
||||||
|
американский
|
||||||
|
армия
|
||||||
|
класс
|
||||||
|
представитель
|
||||||
|
участие
|
||||||
|
девочка
|
||||||
|
политика
|
||||||
|
сначала
|
||||||
|
герой
|
||||||
|
картина
|
||||||
|
широкий
|
||||||
|
доллар
|
||||||
|
спина
|
||||||
|
территория
|
||||||
|
мировой
|
||||||
|
пол
|
||||||
|
тяжелый
|
||||||
|
довольно
|
||||||
|
поле
|
||||||
|
ж
|
||||||
|
изменение
|
||||||
|
умереть
|
||||||
|
более
|
||||||
|
направление
|
||||||
|
рисунок
|
||||||
|
течение
|
||||||
|
возможный
|
||||||
|
церковь
|
||||||
|
банк
|
||||||
|
отдельный
|
||||||
|
средний
|
||||||
|
красивый
|
||||||
|
сцена
|
||||||
|
население
|
||||||
|
большинство
|
||||||
|
сесть
|
||||||
|
двадцать
|
||||||
|
случиться
|
||||||
|
музыка
|
||||||
|
короткий
|
||||||
|
правда
|
||||||
|
проходить
|
||||||
|
составлять
|
||||||
|
свобода
|
||||||
|
память
|
||||||
|
приходиться
|
||||||
|
причем
|
||||||
|
команда
|
||||||
|
установить
|
||||||
|
союз
|
||||||
|
будто
|
||||||
|
поднять
|
||||||
|
врач
|
||||||
|
серьезный
|
||||||
|
договор
|
||||||
|
стараться
|
||||||
|
уметь
|
||||||
|
встать
|
||||||
|
дерево
|
||||||
|
интересный
|
||||||
|
факт
|
||||||
|
добрый
|
||||||
|
всего
|
||||||
|
хозяин
|
||||||
|
национальный
|
||||||
|
однажды
|
||||||
|
длинный
|
||||||
|
природа
|
||||||
|
домой
|
||||||
|
страшный
|
||||||
|
прошлый
|
||||||
|
будто
|
||||||
|
общественный
|
||||||
|
угол
|
||||||
|
чтоб
|
||||||
|
телефон
|
||||||
|
позиция
|
||||||
|
проводить
|
||||||
|
скоро
|
||||||
|
наиболее
|
||||||
|
двор
|
||||||
|
обычно
|
||||||
|
бросить
|
||||||
|
разве
|
||||||
|
писатель
|
||||||
|
самолет
|
||||||
|
объем
|
||||||
|
далеко
|
||||||
|
род
|
||||||
|
солнце
|
||||||
|
вера
|
||||||
|
берег
|
||||||
|
спектакль
|
||||||
|
фирма
|
||||||
|
способ
|
||||||
|
завод
|
||||||
|
цвет
|
||||||
|
трудно
|
||||||
|
журнал
|
||||||
|
руководитель
|
||||||
|
специалист
|
||||||
|
возможно
|
||||||
|
детский
|
||||||
|
точно
|
||||||
|
объяснить
|
||||||
|
оценка
|
||||||
|
единый
|
||||||
|
снять
|
||||||
|
определенный
|
||||||
|
низкий
|
||||||
|
нравиться
|
||||||
|
услышать
|
||||||
|
регион
|
||||||
|
связать
|
||||||
|
песня
|
||||||
|
процент
|
||||||
|
родитель
|
||||||
|
позволить
|
||||||
|
чужой
|
||||||
|
море
|
||||||
|
странный
|
||||||
|
требование
|
||||||
|
чистый
|
||||||
|
весьма
|
||||||
|
какой-нибудь
|
||||||
|
основание
|
||||||
|
половина
|
||||||
|
поехать
|
||||||
|
положить
|
||||||
|
входить
|
||||||
|
легко
|
||||||
|
поздний
|
||||||
|
роман
|
||||||
|
круг
|
||||||
|
анализ
|
||||||
|
стихи
|
||||||
|
автомобиль
|
||||||
|
специальный
|
||||||
|
экономика
|
||||||
|
литература
|
||||||
|
бумага
|
||||||
|
вместо
|
||||||
|
впервые
|
||||||
|
видно
|
||||||
|
научный
|
||||||
|
оказываться
|
||||||
|
поэт
|
||||||
|
показывать
|
||||||
|
степень
|
||||||
|
вызвать
|
||||||
|
касаться
|
||||||
|
господин
|
||||||
|
надежда
|
||||||
|
сложный
|
||||||
|
вокруг
|
||||||
|
предмет
|
||||||
|
отметить
|
||||||
|
заявить
|
||||||
|
вариант
|
||||||
|
министр
|
||||||
|
откуда
|
||||||
|
реальный
|
||||||
|
граница
|
||||||
|
действовать
|
||||||
|
дух
|
||||||
|
модель
|
||||||
|
операция
|
||||||
|
пара
|
||||||
|
сон
|
||||||
|
немного
|
||||||
|
название
|
||||||
|
ум
|
||||||
|
повод
|
||||||
|
старик
|
||||||
|
способный
|
||||||
|
мало
|
||||||
|
миллион
|
||||||
|
малый
|
||||||
|
старший
|
||||||
|
успех
|
||||||
|
практически
|
||||||
|
получиться
|
||||||
|
личный
|
||||||
|
счастье
|
||||||
|
необходимо
|
||||||
|
свободный
|
||||||
|
ребята
|
||||||
|
обычный
|
||||||
|
кабинет
|
||||||
|
прекрасный
|
||||||
|
высший
|
||||||
|
кричать
|
||||||
|
прежде
|
||||||
|
магазин
|
||||||
|
пространство
|
||||||
|
выход
|
||||||
|
остановиться
|
||||||
|
удар
|
||||||
|
база
|
||||||
|
знание
|
||||||
|
текст
|
||||||
|
сюда
|
||||||
|
темный
|
||||||
|
защита
|
||||||
|
предлагать
|
||||||
|
руководство
|
||||||
|
вовсе
|
||||||
|
площадь
|
||||||
|
сознание
|
||||||
|
гражданский
|
||||||
|
убить
|
||||||
|
возраст
|
||||||
|
молчать
|
||||||
|
согласиться
|
||||||
|
участник
|
||||||
|
участок
|
||||||
|
рано
|
||||||
|
пункт
|
||||||
|
несмотря
|
||||||
|
сильно
|
||||||
|
столь
|
||||||
|
сообщить
|
||||||
|
линия
|
||||||
|
бежать
|
||||||
|
желание
|
||||||
|
папа
|
||||||
|
кажется
|
||||||
|
петь
|
||||||
|
доктор
|
||||||
|
губа
|
||||||
|
известно
|
||||||
|
дома
|
||||||
|
вызывать
|
||||||
|
дочь
|
||||||
|
показаться
|
||||||
|
среда
|
||||||
|
председатель
|
||||||
|
представление
|
||||||
|
солдат
|
||||||
|
художник
|
||||||
|
принести
|
||||||
|
волос
|
||||||
|
оружие
|
||||||
|
выглядеть
|
||||||
|
соответствие
|
||||||
|
никак
|
||||||
|
ветер
|
||||||
|
внешний
|
||||||
|
парень
|
||||||
|
служить
|
||||||
|
зрение
|
||||||
|
попросить
|
||||||
|
генерал
|
||||||
|
состоять
|
||||||
|
огонь
|
||||||
|
отдать
|
||||||
|
боевой
|
||||||
|
понятие
|
||||||
|
строительство
|
||||||
|
ухо
|
||||||
|
выступать
|
||||||
|
грудь
|
||||||
|
нос
|
||||||
|
ставить
|
||||||
|
завтра
|
||||||
|
возникать
|
||||||
|
когда
|
||||||
|
страх
|
||||||
|
услуга
|
||||||
|
рабочий
|
||||||
|
что-нибудь
|
||||||
|
глубокий
|
||||||
|
содержание
|
||||||
|
радость
|
||||||
|
безопасность
|
||||||
|
надеяться
|
||||||
|
продукт
|
||||||
|
видимо
|
||||||
|
комплекс
|
||||||
|
бизнес
|
||||||
|
подняться
|
||||||
|
вспоминать
|
||||||
|
мало
|
||||||
|
сад
|
||||||
|
долгий
|
||||||
|
одновременно
|
||||||
|
называться
|
||||||
|
сотрудник
|
||||||
|
лето
|
||||||
|
тихо
|
||||||
|
зато
|
||||||
|
прямой
|
||||||
|
курс
|
||||||
|
помогать
|
||||||
|
предложение
|
||||||
|
финансовый
|
||||||
|
открытый
|
||||||
|
почему-то
|
||||||
|
значить
|
||||||
|
возникнуть
|
||||||
|
рот
|
||||||
|
где-то
|
||||||
|
технология
|
||||||
|
знакомый
|
||||||
|
недавно
|
||||||
|
реформа
|
||||||
|
отсутствие
|
||||||
|
нынешний
|
||||||
|
собака
|
||||||
|
камень
|
||||||
|
будущее
|
||||||
|
звать
|
||||||
|
рассказ
|
||||||
|
контроль
|
||||||
|
позвонить
|
||||||
|
река
|
||||||
|
хватать
|
||||||
|
продукция
|
||||||
|
сумма
|
||||||
|
техника
|
||||||
|
исторический
|
||||||
|
вновь
|
||||||
|
народный
|
||||||
|
прямо
|
||||||
|
ибо
|
||||||
|
выпить
|
||||||
|
здание
|
||||||
|
сфера
|
||||||
|
знаменитый
|
||||||
|
иначе
|
||||||
|
потерять
|
||||||
|
необходимость
|
||||||
|
больший
|
||||||
|
фонд
|
||||||
|
иметься
|
||||||
|
вперед
|
||||||
|
подготовка
|
||||||
|
вчера
|
||||||
|
лист
|
||||||
|
пустой
|
||||||
|
очередной
|
||||||
|
республика
|
||||||
|
хозяйство
|
||||||
|
полностью
|
||||||
|
получаться
|
||||||
|
учиться
|
||||||
|
плохо
|
||||||
|
воля
|
||||||
|
судебный
|
||||||
|
бюджет
|
||||||
|
возвращаться
|
||||||
|
расти
|
||||||
|
снег
|
||||||
|
деревня
|
||||||
|
обнаружить
|
||||||
|
мужик
|
||||||
|
постоянно
|
||||||
|
зеленый
|
||||||
|
элемент
|
||||||
|
обстоятельство
|
||||||
|
почувствовать
|
||||||
|
немец
|
||||||
|
многое
|
||||||
|
победа
|
||||||
|
источник
|
||||||
|
немецкий
|
||||||
|
золотой
|
||||||
|
передать
|
||||||
|
технический
|
||||||
|
нормальный
|
||||||
|
едва
|
||||||
|
желать
|
||||||
|
ожидать
|
||||||
|
некий
|
||||||
|
звезда
|
||||||
|
городской
|
||||||
|
выбор
|
||||||
|
соответствующий
|
||||||
|
масса
|
||||||
|
составить
|
||||||
|
итог
|
||||||
|
сестра
|
||||||
|
что
|
||||||
|
шесть
|
||||||
|
ясно
|
||||||
|
практика
|
||||||
|
сто
|
||||||
|
нести
|
||||||
|
определить
|
||||||
|
проведение
|
||||||
|
карман
|
||||||
|
любимый
|
||||||
|
родной
|
||||||
|
западный
|
||||||
|
обязательно
|
||||||
|
слава
|
||||||
|
кухня
|
||||||
|
определение
|
||||||
|
пользоваться
|
||||||
|
быстрый
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,32 @@
|
|||||||
|
фрак
|
||||||
|
тина
|
||||||
|
зонт
|
||||||
|
некроз
|
||||||
|
норка
|
||||||
|
порка
|
||||||
|
фигня
|
||||||
|
понт
|
||||||
|
пони
|
||||||
|
рокот
|
||||||
|
топот
|
||||||
|
потоп
|
||||||
|
жакет
|
||||||
|
гопак
|
||||||
|
колпак
|
||||||
|
сено
|
||||||
|
навес
|
||||||
|
воск
|
||||||
|
хакер
|
||||||
|
рокер
|
||||||
|
срам
|
||||||
|
меркурий
|
||||||
|
венера
|
||||||
|
марс
|
||||||
|
юпитер
|
||||||
|
сатурн
|
||||||
|
уран
|
||||||
|
нептун
|
||||||
|
плутон
|
||||||
|
резка
|
||||||
|
резак
|
||||||
|
пилон
|
||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -11762,6 +11762,19 @@ word|def
|
|||||||
2: перен., разг. любой искусственный источник яркого света
|
2: перен., разг. любой искусственный источник яркого света
|
||||||
3: астрон. то же, что планета-гигант"
|
3: астрон. то же, что планета-гигант"
|
||||||
плутон|геол. крупный интрузивный массив магматических пород, расположенных в глубинах земной коры
|
плутон|геол. крупный интрузивный массив магматических пород, расположенных в глубинах земной коры
|
||||||
|
резка|"1: действие по значению гл. резать (разделять на части или делать надрезы с помощью различных инструментов)
|
||||||
|
2: результат такого действия
|
||||||
|
3: технология, используемая для резки [1]
|
||||||
|
4: устройство, предназначенное для резки [1]"
|
||||||
|
резак|"1: большой широкий нож
|
||||||
|
2: специалист по убою животных, птиц
|
||||||
|
3: техн. режущая часть какого-либо орудия, инструмента, машины
|
||||||
|
4: техн. инструмент для кислородной резки металлов
|
||||||
|
5: техн. острая лопаточка, применяемая в штукатурных работах
|
||||||
|
6: проф. резервный локомотив, вспомогательный локомотив"
|
||||||
|
пилон|"1: архит. массивные, обычно прямоугольные башни в виде усечённых пирамид, воздвигавшиеся по обеим сторонам входа в древнеегипетский храм
|
||||||
|
2: архит. опорный столб, несущий на себе свод, купол, арку или другое перекрытие
|
||||||
|
3: техн. протяжённая вертикальная стойка, предназначенная для крепления некоего узла на некотором удалении от корпуса"
|
||||||
функция|"1: перен., книжн. обязанность, круг деятельности чего-либо, подлежащая исполнению работа
|
функция|"1: перен., книжн. обязанность, круг деятельности чего-либо, подлежащая исполнению работа
|
||||||
2: книжн. значение, назначение, роль
|
2: книжн. значение, назначение, роль
|
||||||
3: матем. переменная величина, меняющаяся в зависимости от изменения другой величины, а также закон, определяющий свойства такого изменения
|
3: матем. переменная величина, меняющаяся в зависимости от изменения другой величины, а также закон, определяющий свойства такого изменения
|
||||||
|
|||||||
|
Can't render this file because it is too large.
|
@@ -10,6 +10,8 @@ from typing import Annotated
|
|||||||
|
|
||||||
from fastapi import Depends, FastAPI, Request
|
from fastapi import Depends, FastAPI, Request
|
||||||
|
|
||||||
|
from zangramru.utils.trie import TrieNode
|
||||||
|
|
||||||
CWD = Path(__file__).parent
|
CWD = Path(__file__).parent
|
||||||
|
|
||||||
# Weighted toward common Russian letters
|
# Weighted toward common Russian letters
|
||||||
@@ -42,61 +44,6 @@ class Puzzle:
|
|||||||
print(data) # noqa: T201
|
print(data) # noqa: T201
|
||||||
|
|
||||||
|
|
||||||
class TrieNode:
|
|
||||||
"""Prefix tree for optimized solution search."""
|
|
||||||
|
|
||||||
def __init__(self, value: str = "") -> None:
|
|
||||||
self.value = value
|
|
||||||
self.children: dict[str, TrieNode] = {}
|
|
||||||
self.valid_word = False
|
|
||||||
|
|
||||||
def get_next(self, symbol: str) -> "TrieNode | None":
|
|
||||||
"""
|
|
||||||
Get next possible node in from a given symobl.
|
|
||||||
|
|
||||||
Simple lookup in children of this prefix.
|
|
||||||
"""
|
|
||||||
return self.children.get(symbol)
|
|
||||||
|
|
||||||
def add(self, word: str) -> None:
|
|
||||||
"""Add a word to the trie."""
|
|
||||||
word = word.lower()
|
|
||||||
node = self
|
|
||||||
for i in range(len(word)):
|
|
||||||
if word[i] not in node.children:
|
|
||||||
node.children[word[i]] = TrieNode(word[: i + 1])
|
|
||||||
node = node.children[word[i]]
|
|
||||||
node.valid_word = True
|
|
||||||
|
|
||||||
def find_node(self, word: str) -> "TrieNode | None":
|
|
||||||
"""
|
|
||||||
Find a node in the trie.
|
|
||||||
|
|
||||||
The node will only be returned if
|
|
||||||
the word is in the trie, or
|
|
||||||
is a prefix of a longer word.
|
|
||||||
"""
|
|
||||||
word = word.lower()
|
|
||||||
node = self
|
|
||||||
for i in range(len(word)):
|
|
||||||
if word[i] not in node.children:
|
|
||||||
return None
|
|
||||||
node = node.children[word[i]]
|
|
||||||
return node
|
|
||||||
|
|
||||||
def __str__(self) -> str:
|
|
||||||
ret = "Node"
|
|
||||||
if self.value:
|
|
||||||
ret += f"(val={self.value})"
|
|
||||||
ret += "\n"
|
|
||||||
for prefix in self.children:
|
|
||||||
ret += f" {prefix}:\n"
|
|
||||||
child = str(self.children[prefix])
|
|
||||||
for line in child.splitlines():
|
|
||||||
ret += f" {line}\n"
|
|
||||||
return ret
|
|
||||||
|
|
||||||
|
|
||||||
class PuzzleGenerator:
|
class PuzzleGenerator:
|
||||||
"""Helper for generating puzzles."""
|
"""Helper for generating puzzles."""
|
||||||
|
|
||||||
|
|||||||
@@ -1060,7 +1060,7 @@
|
|||||||
let text;
|
let text;
|
||||||
if (puzzleNumber === null) {
|
if (puzzleNumber === null) {
|
||||||
const compressedBoard = board.flat().join('');
|
const compressedBoard = board.flat().join('');
|
||||||
const url = window.location.origin + window.location.pathname + '#' + encodeURIComponent(compressedBoard);
|
const url = window.location.origin + window.location.pathname + '#' + compressedBoard;
|
||||||
text = 'Занграммы!\n🎉 Мне потребовалось всего лишь ' + formatTime(elapsed) + '\n\n' + url;
|
text = 'Занграммы!\n🎉 Мне потребовалось всего лишь ' + formatTime(elapsed) + '\n\n' + url;
|
||||||
} else {
|
} else {
|
||||||
text = 'Занграммы #' + puzzleNumber +
|
text = 'Занграммы #' + puzzleNumber +
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
class TrieNode:
|
||||||
|
"""Prefix tree for optimized solution search."""
|
||||||
|
|
||||||
|
def __init__(self, value: str = "") -> None:
|
||||||
|
self.value = value
|
||||||
|
self.children: dict[str, TrieNode] = {}
|
||||||
|
self.valid_word = False
|
||||||
|
self.definitions: list[str] = []
|
||||||
|
|
||||||
|
def get_next(self, symbol: str) -> "TrieNode | None":
|
||||||
|
"""
|
||||||
|
Get next possible node in from a given symobl.
|
||||||
|
|
||||||
|
Simple lookup in children of this prefix.
|
||||||
|
"""
|
||||||
|
return self.children.get(symbol)
|
||||||
|
|
||||||
|
def add(self, word: str, definitions: list[str] | None = None) -> None:
|
||||||
|
"""Add a word to the trie."""
|
||||||
|
word = word.lower().strip().replace("ё", "е") # noqa: RUF001
|
||||||
|
node = self
|
||||||
|
for i in range(len(word)):
|
||||||
|
if word[i] not in node.children:
|
||||||
|
node.children[word[i]] = TrieNode(word[: i + 1])
|
||||||
|
node = node.children[word[i]]
|
||||||
|
node.valid_word = True
|
||||||
|
if definitions:
|
||||||
|
node.definitions.extend(definitions)
|
||||||
|
|
||||||
|
def find_node(self, word: str) -> "TrieNode | None":
|
||||||
|
"""
|
||||||
|
Find a node in the trie.
|
||||||
|
|
||||||
|
The node will only be returned if
|
||||||
|
the word is in the trie, or
|
||||||
|
is a prefix of a longer word.
|
||||||
|
"""
|
||||||
|
word = word.lower().strip().replace("ё", "е") # noqa: RUF001
|
||||||
|
node = self
|
||||||
|
for i in range(len(word)):
|
||||||
|
if word[i] not in node.children:
|
||||||
|
return None
|
||||||
|
node = node.children[word[i]]
|
||||||
|
return node
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
ret = "Node"
|
||||||
|
if self.value:
|
||||||
|
ret += f"(val={self.value})"
|
||||||
|
ret += "\n"
|
||||||
|
for prefix in self.children:
|
||||||
|
ret += f" {prefix}:\n"
|
||||||
|
child = str(self.children[prefix])
|
||||||
|
for line in child.splitlines():
|
||||||
|
ret += f" {line}\n"
|
||||||
|
return ret
|
||||||
Reference in New Issue
Block a user