#!/usr/bin/ruby

# Translation of: https://rosettacode.org/wiki/Levenshtein_distance#Go

func levenshtein(s, t) {

    var d = (
        s.len+1 -> of {
            t.len+1 -> of(0)
        }
    )

    d.range.each { |i| d[i][0] = i }
    d[0].range.each { |i| d[0][i] = i }

    for j in (1 .. t.len) {
        for i in (1 .. s.len) {

            if (s[i-1] == t[j-1]) {
                d[i][j] = d[i-1][j-1];
            }
            else {
                var min = d[i-1][j];

                d[i][j-1] < min && (
                    min = d[i][j-1];
                )
                d[i-1][j-1] < min && (
                    min = d[i-1][j-1];
                )

                d[i][j] = (min + 1);
            }
        }
    }

    return d[s.len][t.len];
}

assert_eq(levenshtein(%c"kitten", %c"sitting"), 3);
assert_eq(levenshtein(%c"rosettacode", %c"raisethysword"), 8);
assert_eq(levenshtein(%G"J\x{332}o\x{332}s\x{332}e\x{301}\x{332}", %G"J\x{332}o\x{332}s\x{332}"), 1);

say "** Test passed!";