Levenshtein distance/Alignment: Difference between revisions
Content added Content deleted
(Go solution) |
(→Tcl: Added implementation) |
||
Line 297: | Line 297: | ||
<lang racket>(levenshtein (string->list "rosettacode") |
<lang racket>(levenshtein (string->list "rosettacode") |
||
(string->list "raisethysword"))</lang> |
(string->list "raisethysword"))</lang> |
||
=={{header|Tcl}}== |
|||
{{tcllib|struct::list}} |
|||
<lang tcl>package require struct::list |
|||
proc levenshtein/align {a b} { |
|||
lassign [struct::list longestCommonSubsequence [split $a ""] [split $b ""]]\ |
|||
apos bpos |
|||
set c "" |
|||
set d "" |
|||
set x0 [set y0 -1] |
|||
set dx [set dy 0] |
|||
foreach x $apos y $bpos { |
|||
if {$x+$dx < $y+$dy} { |
|||
set n [expr {($y+$dy)-($x+$dx)}] |
|||
incr dx $n |
|||
append c [string repeat "-" $n] |
|||
} elseif {$x+$dx > $y+$dy} { |
|||
set n [expr {($x+$dx)-($y+$dy)}] |
|||
incr dy $n |
|||
append d [string repeat "-" $n] |
|||
} |
|||
append c [string range $a $x0+1 $x] |
|||
set x0 $x |
|||
append d [string range $b $y0+1 $y] |
|||
set y0 $y |
|||
} |
|||
append c [string range $a $x0+1 end] |
|||
append d [string range $b $y0+1 end] |
|||
set al [string length $a] |
|||
set bl [string length $b] |
|||
if {$al+$y0 < $bl+$x0} { |
|||
append c [string repeat "-" [expr {$bl+$x0-$y0-$al}]] |
|||
} elseif {$bl+$x0 < $al+$y0} { |
|||
append d [string repeat "-" [expr {$al+$y0-$x0-$bl}]] |
|||
} |
|||
return $c\n$d |
|||
} |
|||
puts [levenshtein/align "rosettacode" "raisethysword"]</lang> |
|||
{{out}} |
|||
<pre> |
|||
r-oset-taco-de |
|||
raisethysword- |
|||
</pre> |