Levenshtein distance/Alignment: Difference between revisions

Content added Content deleted
Line 386: Line 386:


{{out}}<pre>8</pre>
{{out}}<pre>8</pre>

=={{header|Nim}}==
{{trans|Kotlin}}
<lang Nim>import algorithm, sequtils, strutils

proc levenshteinAlign(a, b: string): tuple[a, b: string] =
let a = a.toLower()
let b = b.toLower()
var costs = newSeqWith(a.len + 1, newSeq[int](b.len + 1))
for j in 0..b.len: costs[0][j] = j
for i in 1..a.len:
costs[i][0] = i
for j in 1..b.len:
let tmp = costs[i - 1][j - 1] + ord(a[i - 1] != b[j - 1])
costs[i][j] = min(1 + min(costs[i - 1][j], costs[i][j - 1]), tmp)

# Walk back through matrix to figure out path.
var aPathRev, bPathRev: string
var i = a.len
var j = b.len
while i != 0 and j != 0:
let tmp = costs[i - 1][j - 1] + ord(a[i - 1] != b[j - 1])
if costs[i][j] == tmp:
dec i
dec j
aPathRev.add a[i]
bPathRev.add b[j]
elif costs[i][j] == 1 + costs[i-1][j]:
dec i
aPathRev.add a[i]
bPathRev.add '-'
elif costs[i][j] == 1 + costs[i][j-1]:
dec j
aPathRev.add '-'
bPathRev.add b[j]
else:
quit "Internal error"

result = (reversed(aPathRev).join(), reversed(bPathRev).join())

when isMainModule:

var result = levenshteinAlign("place", "palace")
echo result.a
echo result.b
echo ""

result = levenshteinAlign("rosettacode","raisethysword")
echo result.a
echo result.b</lang>

{{out}}
<pre>p-lace
palace

r-oset-tacode
raisethysword</pre>


=={{header|Perl}}==
=={{header|Perl}}==