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

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

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]

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.


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

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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.