Jump to content

Levenshtein distance: Difference between revisions

m
→‎{{header|ALGOL 68}}: Adjusted formating, adjust output, extra test
m (Fixed formatting that will not let this code compile with latest F# version (tested with F# 6))
m (→‎{{header|ALGOL 68}}: Adjusted formating, adjust output, extra test)
Line 417:
=={{header|ALGOL 68}}==
{{Trans|Action!}}
Non-recursive algorithm - although Algol 68 supports recursion, Action! doesn't.
<lang algol68># Calculate Levenshtein distance between strings - translated from the Action! sample #
BEGIN
 
PROC damerau levenshtein distance = (STRING str1, str2)INT:
BEGIN
 
INT m=UPB str1;
INT n=UPB str2;
 
(0:m,0:n)INT matrix;
FOR i FROM 0 TO m DO FOR j FROM 0 TO n DO matrix(i,j):=0 OD OD;
FOR i TO m DO matrix(i,1):=i OD;
FOR j TO n DO matrix(1,j):=j OD;
FOR j FROM 1 TO n DO
FOR i FROM 1 TO m DO
IF str1(i) = str2(j) THEN
matrix(i,j):=matrix(i-1, j-1) # no operation required #
ELSE
INT min := matrix(i-1,j)+1 ; # REMdeletion delete #
INT k = matrix(i,j-1)+1 ; # REMinsertion insert #
INT l = matrix(i-1, j-1)+1 ; # REM substitution #
IF k < min THEN min:=k FI;
IF l < min THEN min:=l FI;
matrix(i,j):=min
COMMENT
;
# transposition for Damerau Levenshtein Distance #
IF i>1 AND j>1 THEN
IF str1(i) = str2(j-1) AND str1(i-1) = str2(j) THEN
INT min:=matrix(i,j);
INT tmp=matrix(i-2,j-2)+1;
IF min>tmp THEN min=tmp FI;
matrix(i,j):=min # REM transposition #
FI
FI
;OD
COMMENT
FIOD;
ODmatrix(m,n)
ODEND;
matrix(m,n)
END;
 
STRING word 1, word 2;
word 1 :="kitten"; word 2 := "sitting";
print((word 1," -> ",word 2,newline": "));
print(("Levenshtein Distance=: ",whole(damerau levenshtein distance(word 1,word 2),0),newline));
word 1 := "rosettacode"; word 2 := "raisethysword";
print((word 1," -> ",word 2,newline": "));
print(("Levenshtein Distance=: ",whole(damerau levenshtein distance(word 1,word 2),0),newline));
word 1 := "qwerty"; word 2 := "qweryt";
print((word 1," -> ",word 2,newline": "));
print(("Levenshtein Distance=: ",whole(damerau levenshtein distance(word 1,word 2),0),newline));
 
word 1 := "Action!"; word 2 := "Algol 68";
print((word 1," -> ",word 2,": "));
print(("Levenshtein Distance: ",whole(damerau levenshtein distance(word 1,word 2),0),newline))
END</lang>
{{out}}
<pre>
kitten -> sitting: Levenshtein Distance: 3
rosettacode -> raisethysword: Levenshtein Distance=3: 8
qwerty -> qweryt: Levenshtein Distance=: 2
rosettacode - raisethysword
Action! -> Algol 68: Levenshtein Distance=8: 7
qwerty - qweryt
Levenshtein Distance=2
</pre>
 
3,045

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.