44 lines
1.1 KiB
Nim
44 lines
1.1 KiB
Nim
import strutils
|
|
|
|
const
|
|
Wovel = 'W' # Character code used to specify a wovel.
|
|
Ignore = ' ' # Character code used to specify a character to ignore ('h', 'w' or non-letter).
|
|
|
|
|
|
proc code(ch: char): char =
|
|
## Return the soundex code for a character.
|
|
case ch.toLowerAscii()
|
|
of 'b', 'f', 'p', 'v': '1'
|
|
of 'c', 'g', 'j', 'k', 'q', 's', 'x', 'z': '2'
|
|
of 'd', 't': '3'
|
|
of 'l': '4'
|
|
of 'm', 'n': '5'
|
|
of 'r': '6'
|
|
of 'a', 'e', 'i', 'o', 'u', 'y': Wovel
|
|
else: Ignore
|
|
|
|
proc soundex(str: string): string =
|
|
## Return the soundex for the given string.
|
|
|
|
result.add str[0] # Store the first letter.
|
|
|
|
# Process characters.
|
|
var prev = code(str[0])
|
|
for i in 1..str.high:
|
|
let curr = code(str[i])
|
|
if curr != Ignore:
|
|
if curr != Wovel and curr != prev:
|
|
result.add curr
|
|
prev = curr
|
|
|
|
# Make sure the result has four characters.
|
|
if result.len > 4:
|
|
result.setLen(4)
|
|
else:
|
|
for _ in result.len..3:
|
|
result.add '0'
|
|
|
|
|
|
for name in ["Robert", "Rupert", "Rubin", "Ashcraft", "Ashcroft", "Tymczak",
|
|
"Pfister", "Honeyman", "Moses", "O'Mally", "O'Hara", "D day"]:
|
|
echo name.align(8), " ", soundex(name)
|