Levenshtein distance/Alignment: Difference between revisions

→‎{{header|Perl}}: put everything in one array for a shorter code
(→‎{{header|Perl}}: put everything in one array for a shorter code)
Line 13:
 
=={{header|Perl}}==
<lang perl>use List::Util qw(min)strict;
use warnings;
 
use List::Util qw(min);
sub levenshtein_distance_alignment {
my @s = ('^', split //, shift);
my @t = ('^', split //, shift);
 
my @dA;
@{$dA[$_][0]}{qw(d s t)} = ($_, join('', @s[1 .. $_]), ('~' x $_)) for 0 .. $#s;
@{$dA[0][$_]}{qw(d s t)} = ($_, ('-' x $_), join '', @t[1 .. $_]) for 0 .. $#t;
 
my (@AS, @AT);
$AS[$_][0] = join '', @s[1 .. $_] for 0 .. $#s;
$AS[0][$_] = '-' x $_ for 0 .. $#t;
$AT[0][$_] = join '', @t[1 .. $_] for 0 .. $#t;
$AT[$_][0] = '-' x $_ for 0 .. $#s;
 
for my $i (1 .. $#s) {
for my $j (1 .. $#t) {
if ($s[$i] eqne $t[$j]) {
$ASA[$i][$j]{d} = $AS[$i-1][$j-1] .+ $s[$i];(
my $min = min $ATA[$i-1][$j] ={d}, $ATA[$i-1][$j-1] .{d}, $tA[$i-1][$j-1];{d}
);
$d[$i][$j] = $d[$i-1][$j-1];
@{$A[$i][$j]}{qw(s t)} =
next;
$A[$i-1][$j]{d} == $min ? ($A[$i-1][$j]{s}.$s[$i], $A[$i-1][$j]{t}.'-') :
}
$A[$i][$j-1]{d} == $min ? ($A[$i][$j-1]{s}.'-', $A[$i][$j-1]{t}.$t[$j]) :
$d[$i][$j] = 1 + (
my $min = min ($dA[$i-1][$j-1], {s}.$ds[$i][$j-1], $dA[$i-1][$j-1]{t}.$t[$j]);
);}
if ($d[$i-1][$j] == $min) {
$AS[$i][$j] = $AS[$i-1][$j] . $s[$i];
$AT[$i][$j] = $AT[$i-1][$j] . '-';
}
elsif ($d[$i][$j-1] == $min) {
$AS[$i][$j] = $AS[$i][$j-1] . '-';
$AT[$i][$j] = $AT[$i][$j-1] . $t[$j];
}
else {
@{$ASA[$i][$j]}{qw(d =s $AS[$i-1][$j-1]t)} .= $s[$i];(
$AT[$i][$j] = $ATA[$i-1][$j-1] . $t[$j];{d},
$A[$i-1][$j-1]{s}.$s[$i],
$A[$i-1][$j-1]{t}.$t[$j]
);
}
}
}
return @{$ASA[-1][-1]}{'s', $AT[-1][-1]'t'};
}
 
print join "\n", levenshtein_distance_alignment "rosettacode", "raisethysword";</lang>
</lang>
{{out}}
<pre>ro-settac-o-de
1,934

edits