summaryrefslogtreecommitdiff
path: root/spellfix.fnl
blob: 24d381ce3d3b973b4c28ee43b22d587598c3c5b1 (plain)
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
(import-macros {: map : filter} :lib.macro)
(local array (require :lib.array))
(local str (require :lib.string))
(local {: must} (require :lib.utils))

(local vocabulary ["абрикосовый" "агар" "агарвуд" "агат" "агатис" "алая" "али"
                   "алишань" "алтарь" "альба" "амазонка" "аметист" "амино"
                   "антивирус" "антиквариат" "антикварный" "антилопа" "ань"
                   "аньси" "аньхуа" "аравана" "арахис" "арахисом" "арован"
                   "арована" "аромат" "ароматный" "ароматов" "ароматы" "архат"
                   "архатов" "архаты" "ассортименте" "асфальт" "атомы"
                   "атрибуты" "аура" "бабочка" "бабочки" "багрянник" "базальт"
                   "базовая" "бай" "бакелит" "баклажан" "баклажане" "бамбук"
                   "бамбука" "бамбуке" "бамбуковая" "бамбуковые" "бамбуковый"
                   "бан" "банвэй" "бандун" "банка" "бань" "бао" "баоянь"
                   "барабанчик" "баран" "бацзе" "бегемот" "бежевая" "бежевый"
                   "беззаботный" "бекас" "белая" "белые" "белый" "беседа"
                   "беседка" "бесконечное" "бессмертие" "бессмертия"
                   "бессмертных" "билочунь" "бин" "биндао" "бирюза"
                   "благовоний" "благовония" "благоденствие" "благопожелание"
                   "благостей" "ближе" "блик" "блин" "блина" "блэк" "блюдо"
                   "бмм" "богатство" "богомол" "бодрящий" "бодхи"
                   "бодхидхарма" "боковая" "большая" "большеротая" "больших"
                   "большое" "большой" "борец" "бохун" "бочонка" "бочонок"
                   "браслет" "бронза" "бронзовая" "будда" "будде" "будды"
                   "будет" "буйвол" "булан" "бульдог" "бумаги" "буонарроти"
                   "бусин" "бусина" "бусинмм" "бусины" "бутон" "бутылка"
                   "бутылки" "бхмм" "бык" "быки" "быть" "бьянка" "бэй"
                   "бюрюза" "бяо" "ваджра" "ваза" "вазочка" "вальдшнеп" "ван"
                   "вань" "варки" "васнецов" "ведрко" "великая" "великий"
                   "венге" "версия" "весеннее" "весенние" "весна" "весны"
                   "весы" "ветвях" "ветка" "ветке" "веточка" "вечным" "вижу"
                   "виктор" "винил" "винсент" "вишнвое" "вместе" "внеземной"
                   "вода" "водопад" "воды" "водяная" "водяной" "волнам"
                   "воробей" "воробьиные" "восемь" "восьми" "врата"
                   "встроенным" "выдвижным" "выдержанный" "выращивание"
                   "высокая" "высокий" "высокой" "высокотемпературный"
                   "высший" "вьюнки" "вэй" "вэн" "вэнь" "габа" "габаулун"
                   "габашен" "гайван" "гайвань" "гайваньсиборидаси" "галька"
                   "гамма" "ган" "гань" "гао" "гаомиду" "гаошань" "гармония"
                   "гаруда" "гвоздика" "ггр" "гейша" "геккон" "гималайский"
                   "гинкго" "главных" "гладкий" "глаз" "глазурь" "глазурью"
                   "глина" "глины" "глициния" "гог" "год" "годов" "гои"
                   "голова" "головы" "голубая" "голубой" "голубь" "гор" "гора"
                   "горах" "горизонтом" "горная" "горном" "горный" "горшок"
                   "горшочек" "горы" "гоу" "грамм" "гранат" "гранатами"
                   "граненый" "графит" "грецкий" "гриб" "грибной" "грибом"
                   "грибы" "грин" "грифовая" "груша" "грушевый" "гуа" "гуан"
                   "гуанси" "гуань" "гуаньинь" "гуй" "гун" "гунтин" "гунфу"
                   "гуси" "густав" "гусь" "гушу" "гэланхэ" "дабайхао"
                   "дабайча" "дали" "дан" "дань" "дао" "даос" "даоское"
                   "дарума" "дарумы" "дарующий" "дары" "дасюэшань" "дахунпао"
                   "два" "двоих" "двойное" "дворянский" "денежная" "день"
                   "дерева" "деревня" "дерево" "деревьев" "деревянная"
                   "деревянном" "деревянный" "деревянным" "дескрипторов"
                   "дети" "джу" "джэй" "дикая" "дикие" "дикий" "диких"
                   "дикого" "дикой" "дин" "динь" "диск" "длинный" "для" "дном"
                   "добродушный" "долголетие" "долголетия" "дораэмон" "доска"
                   "достаток" "доу" "драгоценная" "дракон" "дракона"
                   "драконом" "драконхранитель" "драконы" "древа" "древесина"
                   "древний" "дровяной" "дуань" "дуаньни" "дун" "дух" "дымка"
                   "дьен" "дэхуа" "дянь" "дяньхун" "дяочань" "европейский"
                   "естественность" "жаба" "жабадракон" "жабе" "жан" "жаровня"
                   "жасминовый" "жезл" "жезлом" "железо" "желтая" "желтые"
                   "желтый" "жемчуг" "жемчужина" "жемчужиной" "жемчужины"
                   "жен" "жень" "жернов" "жертвенный" "жесть" "жестяная"
                   "жидкое" "жизнь" "жлтая" "жлтой" "жлтый" "жоу" "жуйтюань"
                   "жунтянь" "журавлей" "журавли" "журавль" "жэнь" "забором"
                   "заваривай" "заваривания" "заварочная" "заварочный"
                   "завертка" "загадка" "зайчик" "заря" "затерянные"
                   "затеряться" "заяц" "звезда" "зверк" "зеленая" "зеленый"
                   "зелная" "зелное" "зелной" "зелные" "зелный" "земли"
                   "земляники" "земной" "зернами" "зимний" "зимняя"
                   "зимородок" "зип" "знакомства" "знакомство" "значок"
                   "золота" "золотая" "золоте" "золотистая" "золотистый"
                   "золото" "золотое" "золотой" "золотом" "золотые" "золотым"
                   "зрнах" "игла" "иглы" "игра" "играют" "игрунка" "иероглиф"
                   "иероглифы" "извергающая" "изгиб" "изобилия" "изображением"
                   "изогнутый" "изумрудная" "изумрудные" "изящество" "или"
                   "император" "императора" "индэ" "инженерное" "инкрустацией"
                   "инструмент" "инструментов" "инструменты" "инь" "исинская"
                   "исинский" "исинской" "искусство" "истинная" "истинно"
                   "история" "йеллоу" "йон" "йоу" "каждый" "каи" "каллиграфии"
                   "каллиграфия" "камень" "камне" "камня" "камфара"
                   "камфорный" "камфоры" "као" "капля" "капюшоне" "карамель"
                   "карамельный" "карпы" "картина" "картины" "кашпо"
                   "каштановая" "каштаны" "квадрат" "квадратная" "квадратное"
                   "квадратный" "кварц" "кедр" "керамика" "керамики" "кибер"
                   "киноварная" "киноварный" "киноварь" "киноварьбхмм"
                   "кипячения" "кирпич" "кирпичик" "кисет" "кистей" "кисть"
                   "китайский" "китайским" "классика" "классическая" "клетка"
                   "климт" "клипса" "книгами" "кнопкой" "коала" "кобальт"
                   "кобальтовая" "кобальтовые" "кобальтовый" "ковка" "кожа"
                   "колба" "колбы" "коленце" "коллекционная" "колодец"
                   "колокол" "колосья" "колотый" "кольцами" "кольцо" "кольцом"
                   "комбо" "комковой" "комплект" "конверт" "консоль" "контур"
                   "конусов" "коралл" "корень" "корзина" "корзинка" "корица"
                   "коричневая" "коричневое" "коричневый" "кормилица"
                   "коробка" "коробке" "коробочка" "коробочке" "корпусе"
                   "кости" "кость" "костяной" "кот" "котелок" "котик" "котики"
                   "котнок" "краб" "крабы" "край" "красавица" "красная"
                   "краснобелый" "красного" "красное" "красной" "красносиний"
                   "красные" "красный" "красных" "кратер" "крафткартон"
                   "креветка" "креветки" "кристалл" "кровавый" "кровать"
                   "кролик" "кролики" "крольчонок" "круг" "круглая" "круглое"
                   "круглый" "круглым" "кружка" "крупная" "крыло" "крыса"
                   "крыски" "крышки" "крышкой" "крышку" "крышу" "куан" "кубок"
                   "кувшин" "кузнечик" "куй" "культура" "кун" "кунь" "купаж"
                   "курильница" "куропатка" "куропатки" "кучжушань" "кха"
                   "лабранг" "лавр" "лазуревая" "лазурит" "лазурь" "лак"
                   "лаконичная" "лаконичное" "лаконичный" "лампада" "лан"
                   "лань" "ланьбмм" "ланьянь" "лао" "лаодуань" "лаошу"
                   "латунь" "лев" "лед" "ледяная" "лежанка" "лепестки"
                   "лепешка" "лес" "леса" "лесная" "лесной" "летающая"
                   "летний" "летучая" "летучей" "летучие" "ликов" "лилия"
                   "лимин" "лин" "линчжи" "линь" "линьцан" "линьцана" "лист"
                   "листве" "листе" "листопад" "листья" "листьях" "личи"
                   "лодка" "лопаточка" "лоск" "лотос" "лотоса" "лотосе"
                   "лотосовом" "лотосовый" "лотосом" "лотосы" "лошадей"
                   "лошадь" "лун" "луна" "лунная" "лунный" "луны" "львов"
                   "львы" "льду" "любимого" "люйтан" "люкс" "люфа" "лягушка"
                   "лягушки" "лян" "лянь" "магнолии" "магнолия" "магритт"
                   "май" "майтрейя" "малая" "маленькая" "малые" "малый"
                   "мальки" "мальчик" "мандарине" "мандаринки" "маньлан"
                   "маньно" "мао" "маофэн" "марка" "мастер" "маття" "матура"
                   "матча" "медитации" "медитирующий" "медная" "медный"
                   "медовые" "медь" "между" "мей" "менхай" "менхайский"
                   "меняющая" "металл" "металлик" "металлической" "мешочек"
                   "микеланджело" "микрофибра" "мин" "миндаль" "мини"
                   "мининабор" "миниточа" "минитун" "минцзян" "мир" "мира"
                   "мистер" "ммб" "мокрый" "моллюск" "молочная" "монах"
                   "монетами" "монете" "монетка" "монеты" "мопс" "море" "моша"
                   "мощный" "мощь" "мудрец" "мудрый" "мун" "муравей" "мушмула"
                   "мыши" "мышки" "мышонок" "мышь" "мышью" "мэй" "мэйхуа"
                   "мэн" "мэнку" "мэнсун" "мэнхай" "мэнхайская" "мэнхая"
                   "мятный" "набор" "награда" "нака" "наклейки" "нан" "нань"
                   "наньно" "наньтоу" "наполированный" "наработанный"
                   "нарухина" "нарцисс" "нарциссы" "наследие" "настроение"
                   "натюрморт" "наук" "начало" "небесной" "небесный" "небо"
                   "неведомый" "нежная" "нежный" "нектар" "нержавеющая"
                   "нефрит" "нефритовая" "нефритовое" "нижним" "низкий"
                   "нитка" "нить" "новая" "новый" "нож" "ножках" "ножке" "нос"
                   "ночи" "ночь" "нун" "нюгай" "оазис" "обеденный" "обезьян"
                   "обезьянка" "обезьянки" "обезьяны" "обжиг" "облака"
                   "облаками" "облаках" "облако" "ободком" "обратных"
                   "обсидиан" "овал" "овальная" "овальный" "огненная"
                   "огнеупорная" "огнеупорного" "огнеупорное" "одуванчик"
                   "озера" "окаменелая" "океана" "окихиро" "округлый"
                   "олдскул" "олень" "олово" "оплетка" "оплеткой" "оплткой"
                   "оранжевой" "оранжевый" "органик" "органическая" "орех"
                   "орехи" "ореховый" "орнамент" "орнаментом" "орхидеи"
                   "орхидея" "осень" "осетр" "османтус" "основных" "особая"
                   "отбивное" "отдых" "охраняющий" "очиститель" "пабло"
                   "павлин" "пакет" "пакетов" "палисандр" "палисандра"
                   "палочка" "палочки" "панда" "панцирь" "пань" "пао" "пара"
                   "парный" "пару" "парча" "патра" "пачка" "пейзаж"
                   "пейзажная" "пеликан" "первый" "перепелиное"
                   "перепрыгивают" "перламутром" "персик" "персика" "персике"
                   "персики" "персиковый" "персиком" "персон" "персоны"
                   "петух" "печать" "пиал" "пиала" "пиалу" "пиалы" "пикассо"
                   "пин" "пиньгэ" "пион" "пиона" "пионы" "пирамида" "письмо"
                   "пламя" "плант" "плантационный" "плантация" "пластиковое"
                   "пластиковым" "пластина" "пластинки" "плато" "плетеное"
                   "плетное" "плетной" "плитка" "плоды" "пломбир" "плоская"
                   "побеги" "погружение" "под" "подарочная" "подарочной"
                   "подачей" "подводный" "поддоном" "поднос" "подносом"
                   "подсвечник" "подставка" "подставкаподогреватель"
                   "подставке" "подставки" "подставкой" "подушкой" "познания"
                   "покой" "поколений" "покров" "полной" "полный" "полотенце"
                   "полотно" "полочка" "полуавтоматическая" "полудикий"
                   "полудиких" "полусладкий" "помпа" "пороснок" "постижение"
                   "посуды" "поталь" "походная" "походный" "почка" "праздник"
                   "предел" "предмет" "предметов" "премиум" "пресс" "природе"
                   "пробуждение" "прозрачная" "прозрачный" "прохладе"
                   "процветание" "прочность" "пруд" "пруду" "пряжка"
                   "прямоугольная" "прямоугольный" "прятки" "птица" "птицы"
                   "птички" "пурпур" "пурпурный" "путь" "пушинка" "пуэр"
                   "пуэра" "пуэрмобиль" "пуэров" "пчела" "пышная" "пяо"
                   "пятнистый" "пять" "работа" "работы" "радости" "разделки"
                   "размер" "размышлений" "райские" "раковина" "ранневесенний"
                   "распускающиеся" "распустившиеся" "расслабляющий"
                   "рассыпной" "растительный" "раухтопаз" "реактор" "ребенок"
                   "ребнок" "регион" "резвящихся" "резьба" "река" "реки"
                   "рельеф" "рене" "репа" "рецепт" "рештка" "риса" "рисовый"
                   "рисовыми" "рисовых" "рисунком" "ритуальный" "рог"
                   "рододендрон" "роза" "розовый" "розы" "ромашке" "роса"
                   "роспись" "россия" "руб" "рубин" "рудра" "рутилом" "ручка"
                   "ручками" "ручкой" "ручная" "рыба" "рыбадракон" "рыбаки"
                   "рыбка" "рыбки" "рыбой" "рыбы" "рыжая" "рыжий" "саванна"
                   "сад" "сакральной" "сакура" "саламандра" "салатовая"
                   "салфетница" "сандал" "сандала" "саоган" "сахарок" "сбор"
                   "сверчок" "свет" "светлая" "светлое" "светлорыжая"
                   "светлые" "светлый" "свинка" "свиньи" "свинья" "свитком"
                   "связь" "священного" "северный" "секции" "селадон" "семена"
                   "семь" "семян" "серая" "сердечки" "сердолик" "сердца"
                   "сердце" "серебре" "серебро" "серебряная" "серебряные"
                   "серия" "серое" "серый" "сиборидаси" "сигара" "сизоворонка"
                   "сила" "силу" "символы" "син" "синебежевый" "синее" "синей"
                   "синие" "синий" "синь" "синяя" "сипин" "сиреневый" "сито"
                   "ситом" "сифон" "сияние" "склада" "скоропись" "скрученный"
                   "скульптура" "сладкий" "сладость" "слив" "слива" "сливник"
                   "сливы" "слитке" "слитком" "слово" "сложная" "слон"
                   "слоновой" "слоном" "слоны" "смола" "сна" "снежная"
                   "снежный" "собака" "советский" "совок" "совочек"
                   "согревающий" "солнца" "солнце" "сорт" "сосна" "сосны"
                   "сосуд" "спирали" "спираль" "спиртовка" "спокойствие"
                   "спящий" "средняя" "стакан" "стакантермос" "сталь"
                   "станция" "старая" "старого" "старое" "старый" "старых"
                   "статуэтка" "стекла" "стекло" "стеклянная" "стекляный"
                   "стикер" "стикерпак" "стикеры" "стиле" "стилов" "стиль"
                   "сто" "стол" "столик" "столика" "стопы" "странствующий"
                   "стрекоза" "строк" "стул" "стула" "ступа" "суаньджи" "суй"
                   "сумка" "сумо" "сун" "сундук" "сунская" "сунском" "сунь"
                   "суровая" "сутра" "сутры" "сухого" "сухое" "сферы"
                   "счастливая" "счастливое" "счастливый" "счастье" "счастья"
                   "сытый" "сюань" "сюнь" "сюэ" "сягуань" "сян" "сянь"
                   "сяньхуа" "сяо" "тай" "тайванский" "тайвань" "тайваньская"
                   "тайваньского" "тайхэ" "такинава" "тан" "танская" "танские"
                   "танцуют" "тань" "тао" "тарелка" "тарзан" "творцы" "твоя"
                   "тегуаньинь" "телец" "темная" "темное" "темнокоричневая"
                   "тентяо" "термоз" "термос" "термоса" "термоскувшин" "тигр"
                   "тигра" "тигровый" "тин" "типот" "тираж" "тисбмм" "титан"
                   "титестера" "тишине" "ткань" "тмная" "тмное" "тмные"
                   "тмный" "тобой" "тонкое" "тоу" "точа" "трав" "травы"
                   "трапеция" "треножник" "трепет" "треугольная" "трехлапая"
                   "три" "трио" "трионикс" "троих" "трон" "трона" "трубками"
                   "трубкой" "трхлапая" "тулоу" "тун" "тунь" "тушечница"
                   "тушью" "тхи" "тыква" "тьен" "тюльпан" "тяван" "тян" "тянь"
                   "тяоша" "угря" "удачи" "узор" "улун" "улунов" "улуны"
                   "улыбка" "уляншань" "упаковка" "уруши" "уся" "утешения"
                   "утнок" "уточки" "утро" "утун" "ухват" "уцай" "учатся"
                   "ушастый" "фан" "фаньгу" "фарфор" "фарфора" "фарфоровая"
                   "феникс" "феникса" "фениксовый" "фермерский" "фигурка"
                   "фильтрпакеты" "финиковый" "фиолетового" "фиолетовый"
                   "фирма" "флакон" "форма" "формикарий" "фосян" "фруктовый"
                   "фугу" "фудин" "фун" "футболка" "фуцзянь" "фуцзяньском"
                   "фэй" "фэйчжоу" "фэн" "фэнхуан" "фэнцин" "фэншуй" "хай"
                   "хайвань" "халат" "ханой" "хань" "ханьской" "хао" "хгр"
                   "хищная" "хлопок" "хлопушками" "хлоритом" "хмм" "хомяк"
                   "хороший" "хотеи" "хотей" "хотэй" "хоу" "хохин" "хранения"
                   "хранящий" "хризантема" "хризантемы" "хрусталь" "хсм" "хуа"
                   "хуан" "хуацзинань" "хун" "хунни" "хуолун" "хупитан"
                   "хурма" "хурмы" "хуэй" "ххсм" "хэй" "хэйтан" "хэйхуали"
                   "хэйча" "хэн" "хэтян" "хэхуань" "цан" "цаплей" "цапля"
                   "царь" "цвет" "цвета" "цветами" "цветов" "цветок"
                   "цветочки" "цветочная" "цветочный" "цветущие" "цветущий"
                   "цветы" "целеустремленность" "цельная" "церемонии" "цза"
                   "цзао" "цзе" "цзи" "цзин" "цзингу" "цзиндэчжень"
                   "цзиндэчжэнь" "цзиндэчжэньгоры" "цзинмай" "цзиношань"
                   "цзинь" "цзиньгу" "цзиньдечжень" "цзиньдэчжень"
                   "цзиньдэчжэнь" "цзу" "цзун" "цзы" "цзыни" "цзытан" "цзю"
                   "цзюй" "цзюнь" "цзюэнь" "цзя" "цзянь" "цзяньшуй"
                   "цзяньшуйская" "цзяо" "цикада" "цикадки" "цикады" "цикл"
                   "цилиндр" "цилинь" "цимень" "цин" "цинния" "цинхуа"
                   "циньчжоу" "цуй" "цун" "цюй" "цюэ" "цяньлян" "цяо" "чабани"
                   "чабань" "чаегуань" "чаем" "чаепития" "чай" "чайнатаун"
                   "чайная" "чайник" "чайника" "чайники" "чайником"
                   "чайниксифон" "чайница" "чайничек" "чайного" "чайное"
                   "чайной" "чайные" "чайный" "чайных" "чак" "чаньчжи"
                   "чаочжоу" "чато" "чахай" "чаху" "чахэ" "чацзя" "чаша"
                   "чашао" "чашек" "чашка" "чашкатермо" "чашке" "чашки" "чая"
                   "чен" "черенками" "черепаха" "черепахадракон" "черепаший"
                   "черный" "черпак" "четки" "четыре" "чехлом" "чжай" "чжан"
                   "чжанлан" "чжань" "чжаоцзюнь" "чжен" "чжень" "чжи" "чжима"
                   "чжу" "чжуань" "чжун" "чжуни" "чжэн" "чжэнь" "чизкейк"
                   "чилл" "чин" "чиновника" "чиновников" "чицзыму" "чоу"
                   "чрная" "чрное" "чрный" "чтки" "чток" "чугун" "чудо" "чун"
                   "чунь" "чуньхуа" "чха" "чхан" "чхин" "чхэн" "чхэнсян" "чэн"
                   "чэнь" "чэньсян" "чэньсяо" "шай" "шайхун" "шан" "шань"
                   "шар" "шаром" "шары" "шен" "шестигранный" "шестиугольник"
                   "шило" "шипяо" "шисянь" "шиюань" "шкатулка" "шкаф"
                   "шкафчик" "школа" "шнурок" "шоколад" "шоу" "шрек" "шуй"
                   "шуйпин" "шуйсянь" "шумахер" "шупу" "шурикен" "шутливый"
                   "шуэй" "шэн" "шэнтай" "шэнши" "щипцы" "экстра"
                   "электрический" "электронные" "элементов" "юйчэн" "юлэ"
                   "юндэ" "юнь" "юньнани" "юньнань" "юпитер" "юэнань" "яблоко"
                   "ядерный" "язычки" "яйцо" "якотза" "яма" "янгуйфэй"
                   "янтарная" "янтарь" "янтаряв" "янь" "японская" "японский"
                   "ясный" "яшма"])

(fn levenshtein [str1 str2]
  (let [len1 (must (luna.utf.len str1))
        len2 (must (luna.utf.len str2))
        matrix {}]
    (var cost 0)
    (if (= len1 0) (lua "return len2")
        (= len2 0) (lua "return len1")
        (= str1 str2) (lua "return 0"))
    (for [i 0 len1] (tset matrix i {}) (tset (. matrix i) 0 i))
    (for [j 0 len2] (tset (. matrix 0) j j))
    (for [i 1 len1]
      (for [j 1 len2]
        (if (= (must (luna.utf.sub str1 i 1)) (must (luna.utf.sub str2 j 1)))
          (set cost 0) (set cost 1))
        (tset (. matrix i) j
              (math.min (+ (. matrix (- i 1) j) 1) (+ (. matrix i (- j 1)) 1)
                        (+ (. matrix (- i 1) (- j 1)) cost)))))
    (. matrix len1 len2)))

(fn diff-letters [str1 str2]
  (# (array.diff (str.letters str1) (str.letters str2))))

(fn guess [string]
  (local result
    (array.join
      (map
        (fn [_ token]
          (local index
            (map (fn [_ v]
                   {:word v :distance (levenshtein token v)})
                 vocabulary))
          (local sorted-index
            (array.sort index #(< $1.distance $2.distance)))
          (local most-similar (. sorted-index 1))
          (if (< most-similar.distance 3)
            (do
              ;; compare letters in candidates to choose the best option
              (local same-distance-words
                (filter
                  #(= $2.distance most-similar.distance)
                  sorted-index))
              (local sorted-candidates
                (array.sort
                  (map
                    (fn [_ v] {:word v.word
                               :diff-letters (diff-letters token v.word)})
                    same-distance-words)
                  #(< $1.diff-letters $2.diff-letters)))
              (. sorted-candidates 1 :word))
            token))
        (str.split string))
      " "))
  (if (~= result string)
    result
    nil))

{: guess}