Levenshtein distance/Alignment: Difference between revisions
Content added Content deleted
m (whitespace cleanup) |
(+ D entry) |
||
Line 11: | Line 11: | ||
You can either implement an algorithm, or use a dedicated library (thus showing us how it is named in your language). |
You can either implement an algorithm, or use a dedicated library (thus showing us how it is named in your language). |
||
=={{header|D}}== |
|||
Using the standard library. |
|||
<lang d>void main() { |
|||
import std.stdio, std.algorithm; |
|||
immutable s1 = "rosettacode"; |
|||
immutable s2 = "raisethysword"; |
|||
const dd = levenshteinDistanceAndPath(s1, s2); |
|||
// EditOp Key: |
|||
// n = none. Current items are equal, no editing is necessary. |
|||
// s = substitute current target item with current source item. |
|||
// i = insert current item from the source into the target. |
|||
// r = remove current item from the target. |
|||
writeln("Levenshtein distance and edit operations:\n", dd, "\n"); |
|||
string s1b, s2b; |
|||
size_t pos1, pos2; |
|||
foreach (immutable c; dd[1]) { |
|||
final switch (c) with (EditOp) { |
|||
case none, substitute: |
|||
s1b ~= s1[pos1++]; |
|||
s2b ~= s2[pos2++]; |
|||
break; |
|||
case insert: |
|||
s1b ~= "_"; |
|||
s2b ~= s2[pos2++]; |
|||
break; |
|||
case remove: |
|||
s1b ~= s1[pos1++]; |
|||
s2b ~= "_"; |
|||
break; |
|||
} |
|||
} |
|||
writeln("Alignments:\n", s1b, "\n", s2b); |
|||
}</lang> |
|||
{{out}} |
|||
<pre>Levenshtein distance and edit operations: |
|||
const(Tuple!(uint, EditOp[]))(8, nisnnnisssnss) |
|||
Alignments: |
|||
r_oset_tacode |
|||
raisethysword</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |