48 lines
1.3 KiB
Plaintext
48 lines
1.3 KiB
Plaintext
import "./str" for Char
|
|
import "./fmt" for Fmt
|
|
|
|
var getCode = Fn.new { |c|
|
|
return "BFPV".contains(c) ? "1" :
|
|
"CGJKQSXZ".contains(c) ? "2" :
|
|
c == "D" || c == "T" ? "3" :
|
|
c == "L" ? "4" :
|
|
c == "M" || c == "N" ? "5" :
|
|
c == "R" ? "6" :
|
|
c == "H" || c == "W" ? "-" : ""
|
|
}
|
|
|
|
var soundex = Fn.new { |s|
|
|
if (s == "") return ""
|
|
var sb = Char.upper(s[0])
|
|
var prev = getCode.call(sb[0])
|
|
for (c in s.skip(1)) {
|
|
var curr = getCode.call(Char.upper(c))
|
|
if (curr != "" && curr != "-" && curr != prev) sb = sb + curr
|
|
if (curr != "-") prev = curr
|
|
}
|
|
return Fmt.ljust(4, sb, "0")[0..3]
|
|
}
|
|
|
|
var pairs = [
|
|
["Ashcraft", "A261"],
|
|
["Ashcroft", "A261"],
|
|
["Gauss", "G200"],
|
|
["Ghosh", "G200"],
|
|
["Hilbert", "H416"],
|
|
["Heilbronn", "H416"],
|
|
["Lee", "L000"],
|
|
["Lloyd", "L300"],
|
|
["Moses", "M220"],
|
|
["Pfister", "P236"],
|
|
["Robert", "R163"],
|
|
["Rupert", "R163"],
|
|
["Rubin", "R150"],
|
|
["Tymczak", "T522"],
|
|
["Soundex", "S532"],
|
|
["Example", "E251"]
|
|
]
|
|
|
|
for (pair in pairs) {
|
|
Fmt.print("$-9s -> $s -> $s", pair[0], pair[1], soundex.call(pair[0]) == pair[1])
|
|
}
|