#!/usr/bin/ruby
func levenshtein(s, t) is cached {
s.is_empty && return t.len;
t.is_empty && return s.len;
var s1 = s.slice(1);
var t1 = t.slice(1);
s[0] == t[0]
? __FUNC__(s1, t1)
: (1 + [
__FUNC__(s1, t1),
__FUNC__(s, t1),
__FUNC__(s1, t ),
].min
);
}
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!";