Ermitteln Sie den minimalen Bearbeitungsabstand zwischen zwei Zeichenfolgen

13

Erläuterung

Der Bearbeitungsabstand zwischen zwei Zeichenfolgen ist eine Funktion der minimal möglichen Anzahl von Einfügungen, Löschungen oder Ersetzungen, um ein Wort in ein anderes Wort umzuwandeln.

Einfügungen und Löschungen kosten 1 und Ersetzungen 2.

Der Abstand zwischen ABund Abeträgt beispielsweise 1, da Löschvorgänge 1 kosten und nur die Löschung des BZeichens erforderlich ist .

Der Abstand zwischen CARund FARist 2, weil Ersetzungen 2 kosten. Eine andere Sichtweise ist eine Löschung und eine Einfügung.

Regeln

Wenn Sie zwei eingegebene Zeichenfolgen angeben (dies ist jedoch in Ihrer Sprache praktisch), muss Ihr Programm den minimalen Bearbeitungsabstand zwischen den beiden Zeichenfolgen ermitteln.

Sie können davon ausgehen, dass die Zeichenfolgen nur die Zeichen enthalten A-Zund weniger als 100 Zeichen und mehr als 0 Zeichen haben.

Das ist Codegolf , also gewinnt die kürzeste Lösung.

Beispiel-Testfälle

ISLANDER, SLANDER
> 1
MART, KARMA
> 5
KITTEN, SITTING
> 5
INTENTION, EXECUTION
> 8
Peter Olson
quelle
Ich habe das in meiner Algorithmusklasse einmal exzellent gemacht. Es hat Spaß gemacht, das Projekt als XLS-Dokument einzureichen. Es hat tatsächlich ziemlich gut funktioniert. Ich werde sehen, ob ich es finden kann.
Captncraig
PHP sollte dies leicht gewinnen.
st0le
@ st0le - Die eingebaute levenshteinFunktion behandelt Ersetzungen als eine Bearbeitung (Ersetzung), nicht als zwei (Löschen + Einfügen).
Mr. Llama

Antworten:

7

Gehirnfick, 2680

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

Natürlich mit dynamischer Programmierung.

Eingabezeichenfolgen sollten durch ein Leerzeichen und eine neue Zeile getrennt werden. Beispielsweise:

INTENTION EXECUTION
008
Pappschachtel
quelle
1
Ordentlich ausgerichtet und sehr gut lesbar - ich mag es, +1!
Thomas
Ist das eine Computersprache? : O
Dies ist die verwirrendste Übermittlung zu dieser Frage ... +1, nur weil es BF ist.
HyperNeutrino
5

Python, 138 148 152 Zeichen

Ok, ich kannte das Prinzip, hatte es aber noch nie implementiert.

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
quelle
4

PHP, 40

Befolgen Sie die angegebenen Regeln, aber nicht den Geist der Regeln:

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

Nimmt zwei Parameter als Argumente. Beispiel Aufruf: php edit_dist.php word1 word2.
Normalerweise wird levenshtein()eine Ersetzung als eine Operation betrachtet, sie hat jedoch eine überladene Form, in der die Einfüge- / Unter- / Löschgewichte angegeben werden können. In diesem Fall ist es 1/2/1.

Herr Lama
quelle
3

APL (90 Zeichen)

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

Ich benutze Dyalog APL als Dolmetscher mit ⎕IO 1 und ⎕ML0 gesetzt sind. Die direkte Funktion ( { ... }) berechnet bei einer gegebenen Zeile als Eingabe die nächste Zeile in der Entfernungsmatrix. (Begonnen wird mit der ersten Zeile:. 0,⍳x) Mit dem Operator power ( ) wird die Funktion für jedes Zeichen in der zweiten Zeichenfolge ( ⊃⍴b) einmal verschachtelt . Danach wird die letzte Zeile umgekehrt ( ) und das erste Element wird genommen ( ).

Beispiel:

      ⊃⌽({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
quelle
3

R 51

Dies liest zwei Zeilen vom Benutzer ein (das sind die Eingaben) und verwendet dann nur die adist Funktion, um die Entfernung zu berechnen. Da Ersetzungen für dieses Problem 2 kosten, müssen wir einen benannten Vektor für den Kostenparameter für adist hinzufügen. Da es auch einen counts-Parameter für adist gibt, können wir die Kosten nur auf cos kürzen, sodass wir immer noch eine eindeutige Übereinstimmung für die Parameternamen haben.

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

Beispielgebrauch

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

Ruby 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]

Golfed Version der langsamen, Methode rekursive Rubins hier , modifizierte , um das Gewicht für Substitutionen zu verdoppeln. Die Tatsache, dass es 7 Zeichen dauert, um das erste Zeichen eines Strings zu entfernen, tut wirklich weh, und es wäre cool, es durch so (a[0]==b[0]?-1:1)etwas wie zu ersetzen , -1**a[0]<=>b[0]aber die Reihenfolge der Operationen ist nicht mein Freund.

Histokrat
quelle
0

Smalltalk (Smalltalk / X), 34

Ich habe Glück - die Standardklasse "String" enthält bereits levenshtein:

Eingabe a, b:

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

(Die zusätzlichen Parameter ermöglichen unterschiedliche Gewichte beim Ersetzen, Löschen usw.)

Testlauf:

#( '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
quelle