Работает, но не со всеми именами. К примеру возникает проблема с именем "Зайра". Если ввести "Зойра", то нужно отклоняться от 0 аж на целых 0.6, что, конечно же, начинает находить многих других персонажей.
Мой же метод находит сходство более точно, но опять же, с отклонением по символам, будет так же тупить я думаю.
Хотя можно совместить один метод с другим, дабы сократить количество схожих имён и, соответственно, провести более точный поиск, но тут опять же не уверен.
Array := ["Атрокс","Ари","Акали","Акшан","Алистар","Амуму","Анивия","Энни","Афелий","Эш","Аурелион Сол","Азир","Бард","Бел'вет","Блицкранк","Брэнд","Браум","Кейтлин","Камилла","Кассиопея","Чо'Гат","Корки","Дариус","Диана","Доктор Мундо","Дрейвен","Экко","Элиза","Эвелинн","Эзреаль","Фиддлстикс","Фиора","Физз","Галио","Ганкпланк","Гарен","Гнар","Грагас","Грейвз","Гвен","Гекарим","Хеймердингер","Иллаой","Ирелия","Иверн","Жанна","Джарван IV","Джакс","Джейс","Джин","Джинкс","Кай'Са","Калиста","Карма","Картус","Кассадин","Катарина","Кейл","Кайн","Кеннен","Ка'Зикс","Киндред","Клед","Ког'Мао","Ле Блан","Ли Син","Леона","Лилия","Лиссандра","Люциан","Лулу","Люкс","Мальфит","Мальзахар","Маокай","Мастер Йи","Мисс Фортуна","Мордекайзер","Моргана","Нами","Насус","Наутилус","Нико","Нидали","Ноктюрн","Нуну и Виллумп","Олаф","Орианна","Орн","Пантеон","Поппи","Пайк","Киана","Квинн","Рэйкан","Раммус","Рек'Сай","Релл","Рената Гласк","Ренектон","Ренгар","Ривен","Рамбл","Райз","Самира","Седжуани","Сенна","Серафина","Сетт","Шако","Шен","Шивана","Синджед","Сион","Сивир","Скарнер","Сона","Сорака","Свейн","Сайлас","Синдра","Таам Кенч","Талия","Талон","Тарик","Тимо","Треш","Тристана","Трандл","Триндамир","Твистед Фэйт","Твич","Удир","Ургот","Варус","Вейн","Вейгар","Вел'Коз","Векс","Вай","Виего","Виктор","Владимир","Волибир","Варвик","Вуконг","Шая","Зерат","Ксин Жао","Ясуо","Ёнэ","Йорик","Юми","Зак","Зед","Зери","Зиггс","Зилиан","Зоя","Зайра"]
InputBox, string1, Введите имя персонажа,, 300, 200, 200, 200
for index, element in Array
{
string2 := element
ignoreRegister = 1
a := strDiff(string1, string2, ignoreRegister)
if a < 0.6 ;; отклонение от 0 до 1 с плавающей запятой.
{
c := string2
MsgBox, % "a = " a " Скорее всего вы ввели " c
}
strDiff(string1, string2, ignoreRegister, maxOffset = 5)
{
StringCaseSense, Locale
if (ignoreRegister && string1 = string2)
{
return (string1 == string2 ? 0 : 0.2 / StrLen(string1))
}
if (string1 == "" || string2 == "")
{
return (string1 = string2 ? 0 : 1)
}
StringSplit, n, string1
StringSplit, m, string2
ni := 1, mi := 1, lcs := 0
while(ni <= n0 && mi <= m0)
{
if (n%ni% == m%mi%)
{
EnvAdd, lcs, 1
}
else if (ignoreRegister && n%ni% = m%mi%)
{
EnvAdd, lcs, 0.8
}
else
{
loop, %maxOffset%
{
oi := ni + A_Index, pi := mi + A_Index
if (n%oi% = m%mi% && oi <= n0)
{
ni := oi, lcs += (n%oi% == m%mi% ? 1 : (ignoreRegister ? 0.8 : 0))
Break
}
if ((n%ni% = m%pi% && pi <= m0))
{
mi := pi, lcs += (n%ni% == m%pi% ? 1 : (ignoreRegister ? 0.8 : 0))
Break
}
}
}
EnvAdd, ni, 1
EnvAdd, mi, 1
}
return ((n0 + m0)/2 - lcs) / (n0 > m0 ? n0 : m0)
}
}