use strict; my $replacecost = 2; my $insertcost = 1; my $deletecost = 1; sub min(@) { my $minval = shift; my ($i, $j, $k); $j = 0; $k = 0; while ($i = shift) { $j++; if ($i < $minval) { $minval = $i; $k = $j; } } return ($minval, $k); } ($#ARGV >= 1) or die "$0 target source\n"; my @target = split('', shift); my @source = split('', shift); my $n = @target; my $m = @source; my @dist = (); my @B = (); $dist[0][0] = 0; #for (my $i = 1; $i <= $n; $i++) { $dist[$i][0] = $i; $B[$i][0] = [$i-1,0]; } #for (my $j = 1; $j <= $m; $j++) { $dist[0][$j] = $j; $B[0][$j] = [0,$j-1]; } for (my $i = 1; $i <= $n; $i++) { $dist[$i][0] = $dist[$i-1][0]+$insertcost; $B[$i][0] = [$i-1,0]; } for (my $j = 1; $j <= $m; $j++) { $dist[0][$j] = $dist[0][$j-1]+$deletecost; $B[0][$j] = [0,$j-1]; } print < 15); print '\begin{tabular}{|cc|', 'c' x ($n+1), '|}', "\n"; print < 15); # match the footnotesize command above my $current = [$n,$m]; print "\\nodeoval{$n-$m}\n"; while (1) { my ($n, $m) = @{$current}; last if (!defined $B[$n][$m]); my ($bn,$bm) = @{$B[$n][$m]}; print "\\nodeoval{$bn-$bm}\n"; if ($n == $bn) { print "\\anodecurve[r]{$n-$m}[r]{$bn-$bm}{10pt}\n"; } else { print "\\anodecurve[l]{$n-$m}[r]{$bn-$bm}{10pt}\n"; } $current = [$bn, $bm]; } my $target = join('', @target); my $source = join('', @source); print <