Trouver la distance d'édition minimale entre deux chaînes

13

Explication

La distance d'édition entre deux chaînes est fonction du nombre minimal possible d'insertions, de suppressions ou de substitutions pour convertir un mot en un autre mot.

Les insertions et les suppressions coûtent 1 et les substitutions coûtent 2.

Par exemple, la distance entre ABet Aest 1, car les suppressions coûtent 1 et la seule modification nécessaire est la suppression du Bcaractère.

La distance entre CARet FARest 2, car les substitutions coûtent 2. Une autre façon de voir cela est une suppression et une insertion.

Règles

Étant donné deux chaînes d'entrée (fournies cependant est pratique dans votre langue), votre programme doit trouver la distance d'édition minimale entre les deux chaînes.

Vous pouvez supposer que les chaînes contiennent uniquement les caractères A-Zet ont moins de 100 caractères et plus de 0 caractères.

C'est le golf de code , donc la solution la plus courte l'emporte.

Exemples de cas de test

ISLANDER, SLANDER
> 1
MART, KARMA
> 5
KITTEN, SITTING
> 5
INTENTION, EXECUTION
> 8
Peter Olson
la source
J'ai fait cela dans Excel dans ma classe d'algorithmes une fois. C'était assez amusant de transformer le projet en document .xls. Cela a plutôt bien fonctionné. Je vais voir si je peux le trouver.
captncraig
PHP devrait gagner cela facilement.
st0le
@ st0le - La levenshteinfonction intégrée traite les substitutions comme une seule modification (substitut) et non deux (suppression + insertion).
M. Llama

Réponses:

7

brainfuck, 2680

+>>>>>>>>>>>>>>>>>>>>>>++++++>,<[->-----<]>--[+++++++++++++++++++++
+++++++++++>>[->>+<<]>>+<<,--------------------------------]>>[-<<<
+>>>]<<<<[>[-<<+>>]<<<]>[-<<<<<+>>>>>]>[>>],----------[++++++++++>>
[->>+<<]>>+<<,----------]>>[-<<<+>>>]<<<<[>[-<<+>>]<<<]>[-<<+>>]<<[
-<+>>+<]<<<[->+<]>[-<+>>>>+<<<]>>>[-<+>]<[->+>+<<]<[-<+>]<[->+>+<<]
<[-<+>>+<]<[->+<]>>>>>>[-[->>+<<]<<[->>+<<]<<[->>+<<]>>>>>>]<<[->>+
>+<<<]>>>[-<<<+>>>]<[->>+[->+>+<<]<<[->>+<<]>>]>>[-]<[<<]<<<+[->>>+
<<<]>>>[-<+<<+>>>]<<<<<[->>[->>>>[->>+<<]<<[->>+<<]<<[->>+<<]<<[->>
+<<]>>>>]>>[->>>>+<<<<]>>>>[-<<<<+<<+>>>>>>]<<+[->>+<<]>>[-<<+<+>>>
]<<<<<<<<]>>[-]>>[-]>>[-]-[+<<-]+>>>>>>>>>>>>>>>>>[-<+>]<[->+<<<<+>
>>]<<<[->>>>>>[-<+>]<[->+<<<<+>>>]<<<<<<<[-]<<+>>>>>>[-<<<<+>>>>>>>
>>>[-<+>]<[->+>+<<]<<<<<<<<<[->+<]>[->>>>>>>>+<<<<<<<<<+>]<<<[->+<]
>[->>>>>>>>+<<<<<<<<<+>]>>>>>>>>>[-<<<<<+>>>>>]<<<<<[->>+>>>+<<<<<]
>>>>>>>>[-[->>+<<]<<[->>+<<]<<[->>+<<]<<[->>+<<]>>>>>>>>]<<<<<<+>>-
[-<<[-<<<<+>>>>]<<<<[->>+>>+<<<<]>>[->>>>>>[->>+<<]<<[->>+<<]<<[->>
+<<]<<[->>+<<]>>]>>>>]>>[->>+<<]>>[-<<+>>>>+<<]->>-[-[->>+<<]>>]>[-
>+<]>[-<+>>>+<<]<<<[->+<]>[-<+>>>+<<]+[->>[-<<+>>]>>[-<<+>>]<<<<<<+
]<<<<<<[->>>>>>+<<<<<<]>>>>>>>>[-<<<<<<<<+>>>>>>>>]<<<<[->>>>+<<<<]
-<<[-]>>>>>>>>[-<<<<<<<<+>>>>>>>>]<<<<[->>[->>+<<]<<[->>+<<]>>]>>-[
-[->>+<<]>>]<[->+<]>[-<+>>>+<<]+[->>[-<<+>>]<<<<+]>>[-<<+>>]<<<<<<<
<-[+>>[-<<+>>]>>[-<<+>>]>>[-<<+>>]<<<<<<<<-]+>>>[-]<[->+<]>>>[-]<[-
>+<]>>>[-]<[->+<]>>>[->+<]>[-<+>>>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>>>>>
>>>-[-[->>+<<]>>]>[->+<]>[-<+<+>>]<<<<-[+>>[-<<+>>]<<<<-]+>>[-<+>]>
>>>>>>>>[->+<]>[-<+>>>>>>>>>>>+<<<<<<<<<<]>>>>>[->+<]>[-<+>>>>>+<<<
<]>>>>-[-[->>+<<]>>]>[->+<]>[-<+<+>>]<<<<-[+>>[-<<+>>]<<<<-]+>[->-<
]>[-<[-]+>]<[->>>+<<<]>>>[-<<+<+>>>]<<-[+>[->+<]<]<[->>+<-[[-]>[->+
<]>[-<+>>>+<<]+>>[-<<[-]>>]<[->+<]>[-<+>>>+<<]+>>[-<<[-]>>]<[->+<]>
[-<+>>>+<<]+>>[-<<[-]>>]<<[-<<[-]+>>]<<[-<<[-]+>>]<<[-<<[-]+>>]<<<+
>->->>->>-<<<<<]<[->+<]]>[-<+>]>>[-<<<+>>>]<<<[->>>>>>>>>>>>>+<<<<<
<<<<<<<<]>>>>>>>>[->+<]>[-<+>>>>>>>>>+<<<<<<<<]>[->+<]>[-<+>>>>>>>>
>+<<<<<<<<]>>>>>>>>>[->>>+<<<]>>>[-<<+<+>>>]<<<<<[->>>>>+<<<<<]>>>>
>[-<<<<<+<<<+>>>>>>>>]<<<<<<<<+>>>>>>[-[->>+<<]<<[->>+<<]<<[->>+<<]
<<[->>+<<]<<[->>+<<]>>>>>>>>>>]<<<<[-<<[-<<<<<<+>>>>>>]<<<<<<[->>+>
>>>+<<<<<<]>>[->>>>>>>>[->>+<<]<<[->>+<<]<<[->>+<<]<<[->>+<<]<<[->>
+<<]>>]>>>>>>]<<[-]<<[->>>>+<<<<]>>>>>>[-[->>+<<]<<[->>+<<]>>>>]<<[
->>>>>+<<<<<]-[+<<-]+>>>>>>>>>>>>>>>]<<]>>>>>>>>[->+<]<<[->+<]<<[->
+<]>>>>>[-[->>+<<]<<[->>+<<]<<[->>+<<]>>>>>>]<<<<[->>[->>>>+<<<<]>>
>>[-<<+<<+>>>>]<<+[-[->>+<<]<<[->>+<<]<<[->>+<<]>>>>>>]<<<<]>>[-[->
>+<<]>>]>>>>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>>>[->-[>+>>]>
[+[-<+>]>+>>]<<<<<]>[-]<++++++[->++++++++[->+>+<<<<+>>]<]>>>.<.<<<.

Bien sûr, en utilisant la programmation dynamique.

Les chaînes d'entrée doivent être séparées par un espace et suivies d'une nouvelle ligne. Par exemple:

INTENTION EXECUTION
008
boîte en carton
la source
1
Bien aligné et très lisible - j'aime ça, +1!
Thomas
S'agit-il d'un langage informatique? : O
C'est la soumission la plus déroutante à cette question ... +1 juste parce que c'est BF.
HyperNeutrino
5

Python, 138 148 152 152 caractères

Ok, je connaissais le principe mais je n'avais jamais implémenté la distance d'édition auparavant, alors voici:

x,y=raw_input().split()
d=range(99)
for a in x:
 c=d;d=[d[0]+1]
 for b,p,q in zip(y,c[1:],c):d+=[min(d[-1]+1,p+1,q+2*(a!=b))]
print d[-1]
han
la source
4

PHP, 40

Suit les règles comme indiqué, mais pas l'esprit des règles:

<?=levenshtein($argv[1],$argv[2],1,2,1);

Prend ses deux paramètres comme arguments. Exemple d' appel: php edit_dist.php word1 word2.
Considère normalement levenshtein()une substitution comme une opération, mais elle a une forme surchargée où les poids d'insertion / sous / suppression peuvent être spécifiés. Dans ce cas, son 1/2/1.

M. Llama
la source
3

APL (90 caractères)

⊃⌽({h←1+c←⊃⍵⋄d←h,1↓⍵⋄h,(⊂⍵){y←⍵+1⋄d[y]←⍺{h⌷b=⍵⌷a:⍵⌷⍺⋄1+d[⍵]⌊y⌷⍺}⍵}¨⍳x}⍣(⊃⍴b←,⍞))0,⍳x←⍴a←,⍞

J'utilise Dyalog APL comme interprète, avec ⎕IOla valeur 1 et ⎕MLla valeur 0. La fonction directe ( { ... }) calcule, en fonction d'une ligne en entrée, la ligne suivante dans la matrice de distance. (Il commence par la ligne initiale:. 0,⍳x) L'opérateur de puissance ( ) est utilisé pour imbriquer la fonction une fois pour chaque caractère de la deuxième chaîne ( ⊃⍴b). Après tout cela, la dernière ligne est inversée ( ) et son premier élément est pris ( ).

Exemple:

      ⊃⌽({h←1+c←⊃⍵⋄d←h,1↓⍵⋄h,(⊂⍵){y←⍵+1⋄d[y]←⍺{h⌷b=⍵⌷a:⍵⌷⍺⋄1+d[⍵]⌊y⌷⍺}⍵}¨⍳x}⍣(⊃⍴b←,⍞))0,⍳x←⍴a←,⍞
LOCKSMITH
BLACKSMITH
3
      ⊃⌽({h←1+c←⊃⍵⋄d←h,1↓⍵⋄h,(⊂⍵){y←⍵+1⋄d[y]←⍺{h⌷b=⍵⌷a:⍵⌷⍺⋄1+d[⍵]⌊y⌷⍺}⍵}¨⍳x}⍣(⊃⍴b←,⍞))0,⍳x←⍴a←,⍞
GATTTGTGACGCACCCTCAGAACTGCAGTAATGGTCCAGCTGCTTCACAGGCAACTGGTAACCACCTCATTTGGGGATGTTTCTGCCTTGCTAGCAGTGCCAGAGAGAACTTCATCATTGTCACCTCATCAAAGACTACTTTTTCAGACATCTCCTGTAG
AAGTACTGAACTCCTAATATCACCAATTCTTCTAAGTTCCTGGACATTGATCCGGAGGAGGATTCGCAGTTCAACATCAAGGTAAGGAAGGATACAGCATTGTTATCGTTGTTGAGATATTAGTAAGAAATACGCCTTTCCCCATGTTGTAAACGGGCTA
118
Dillon Cower
la source
3

R 51

Cela lit sur deux lignes de l'utilisateur (qui sont l'entrée), puis utilise simplement la adistfonction pour calculer la distance. Étant donné que les substitutions coûtent 2 pour ce problème, nous devons ajouter un vecteur nommé pour le paramètre des coûts pour adist. Puisqu'il existe également un paramètre count pour adist, nous ne pouvons que réduire les coûts en cos, nous avons donc toujours une correspondance unique pour les noms des paramètres.

x=readLines(n=2);adist(x[1],x[2],cos=c(i=1,d=1,s=2))

Exemple d'utilisation

> x=readLines(n=2);adist(x[1],x[2],cos=c(i=1,d=1,s=2))
MART
KARMA
     [,1]
[1,]    5
Dason
la source
0

Rubis 1.9, 124

l=->a,b{a[0]?b[0]?[(a[0]==b[0]?-1:1)+l[a[1..-1],b[1..-1]],l[a[1..-1],b],l[a,b[1..-1]]].min+1: a.size: b.size}
puts l[*ARGV]

Version golfée de la méthode Ruby lente et récursive ici , modifiée pour doubler le poids des substitutions. Le fait qu'il faut 7 caractères pour supprimer le premier caractère d'une chaîne fait vraiment mal, et ce serait cool de le remplacer (a[0]==b[0]?-1:1)par quelque chose comme, -1**a[0]<=>b[0]mais l'ordre des opérations n'est pas mon ami.

histocrate
la source
0

Smalltalk (Smalltalk / X), 34

J'ai de la chance - la classe "String" standard contient déjà levenshtein:

entrée a, b:

a levenshteinTo:b s:2 k:2 c:1 i:1 d:1

(les paramètres supplémentaires permettent différents poids sur la substitution, la suppression, etc.)

Essai:

#( 'ISLANDER'  'SLANDER' 
   'MART'      'KARMA'   
   'KITTEN'    'SITTING' 
   'INTENTION' 'EXECUTION'  
) pairWiseDo:[:a :b|
    a print. ' ' print. b print. ' ' print.
    (a levenshteinTo:b
            s:2 k:2 c:1 i:1 d:1) printCR.
].

->

ISLANDER SLANDER 1
MART KARMA 5
KITTEN SITTING 5
INTENTION EXECUTION 8
blabla999
la source