aboutsummaryrefslogtreecommitdiff
path: root/challenge-096/paulo-custodio/lua/ch-2.lua
blob: 8ed87ff524bcc789c7ad7c59d0ca38652210ab42 (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
#!/usr/bin/env lua

--[[
Challenge 096

# TASK #2 > Edit Distance
# Submitted by: Mohammad S Anwar
# You are given two strings $S1 and $S2.
#
# Write a script to find out the minimum operations required to convert $S1
# into $S2. The operations can be insert, remove or replace a character. Please
# check out Wikipedia page for more information.
#
# Example 1:
# Input: $S1 = "kitten"; $S2 = "sitting"
# Output: 3
#
# Operation 1: replace 'k' with 's'
# Operation 2: replace 'e' with 'i'
# Operation 3: insert 'g' at the end
# Example 2:
# Input: $S1 = "sunday"; $S2 = "monday"
# Output: 2
#
# Operation 1: replace 's' with 'm'
# Operation 2: replace 'u' with 'o'
--]]

function wag_fis_dist(a, b)
    -- define a table where d[i,j] is the Levenshtein distance between
    -- first i chars of a and first j chars of b
    local d = {}

    -- source prefixes can be transformed into empty string by dropping chars
    for i=0,#a do
        d[i] = {}
        d[i][0] = i
    end

    -- target prefixes can be reached from empty source prefix by inserting chars
    for j=0,#b do
        d[0][j] = j
    end

    -- flood-fill the rest of the table
    for j=1,#b do
        for i=1,#a do
            local subst_cost = 0
            if string.sub(a,i,i) ~= string.sub(b,j,j) then subst_cost = 1; end
            d[i][j] = math.min(d[i-1][j]+1,              -- deletion
                               d[i][j-1]+1,              -- insertion
                               d[i-1][j-1]+subst_cost)   -- substitution
        end
    end

    -- distance is in lower bottom cell
    return d[#a][#b]
end

io.write(wag_fis_dist(arg[1], arg[2]), "\n")