diff --git a/game/engines/default/engine/utils.lua b/game/engines/default/engine/utils.lua index 117ae4a3bf177871ca5e365964f1b4ab5d79d887..23969f07da595a61c99236ce292eb230dfd2f575 100644 --- a/game/engines/default/engine/utils.lua +++ b/game/engines/default/engine/utils.lua @@ -1277,6 +1277,51 @@ function string.split(str, char, keep_separator) return lpeg.match(p, str) end +-- Returns the Levenshtein distance between the two given strings +function string.levenshtein(str1, str2) + local len1 = string.len(str1) + local len2 = string.len(str2) + local matrix = {} + local cost = 0 + + -- quick cut-offs to save time + if (len1 == 0) then + return len2 + elseif (len2 == 0) then + return len1 + elseif (str1 == str2) then + return 0 + end + + -- initialise the base matrix values + for i = 0, len1, 1 do + matrix[i] = {} + matrix[i][0] = i + end + for j = 0, len2, 1 do + matrix[0][j] = j + end + + -- actual Levenshtein algorithm + for i = 1, len1, 1 do + for j = 1, len2, 1 do + if (str1:byte(i) == str2:byte(j)) then + cost = 0 + else + cost = 1 + end + + matrix[i][j] = math.min(matrix[i-1][j] + 1, matrix[i][j-1] + 1, matrix[i-1][j-1] + cost) + end + end + + -- return the last value - this is the Levenshtein distance + return matrix[len1][len2] +end + +function string.levenshtein_p(str1, str2) + return string.levenshtein(str1, str2) / #str1 +end local hex_to_dec = { ["0"] = 0,