Trova la distanza minima di modifica tra due stringhe


13

Spiegazione

La distanza di modifica tra due stringhe è una funzione del numero minimo possibile di inserzioni, eliminazioni o sostituzioni per convertire una parola in un'altra parola.

Gli inserimenti e le eliminazioni costano 1 e le sostituzioni costano 2.

Ad esempio, la distanza tra ABe Aè 1, poiché le eliminazioni costano 1 e l'unica modifica necessaria è l'eliminazione del Bpersonaggio.

La distanza tra CARe FARè 2, poiché le sostituzioni costano 2. Un altro modo di vedere questo è una cancellazione e un inserimento.

Regole

Date due stringhe di input (fornite tuttavia è conveniente nella tua lingua), il tuo programma deve trovare la distanza minima di modifica tra le due stringhe.

Si può presumere che le stringhe contengano solo i caratteri A-Ze abbiano meno di 100 caratteri e più di 0 caratteri.

Questo è il golf del codice , quindi vince la soluzione più breve.

Esempi di casi di test

ISLANDER, SLANDER
> 1
MART, KARMA
> 5
KITTEN, SITTING
> 5
INTENTION, EXECUTION
> 8

L'ho fatto una volta in Excel nella mia classe di algoritmi. È stato abbastanza divertente trasformare il progetto in un documento .xls. In realtà ha funzionato abbastanza bene. Vedrò se riesco a trovarlo.
captncraig

PHP dovrebbe vincere facilmente.
st0le

@ st0le: la levenshteinfunzione integrata considera le sostituzioni come una modifica (sostituzione), non due (cancellazione + inserimento).
Mr. Llama,

Risposte:


7

brainfuck, 2680

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

Utilizzando la programmazione dinamica, ovviamente.

Le stringhe di input devono essere separate da uno spazio e seguite da una nuova riga. Per esempio:

INTENTION EXECUTION
008

1
Ben allineato e molto leggibile - Mi piace, +1!
Thomas,

È un linguaggio informatico? : O

Questa è la presentazione più confusa a questa domanda ... +1 solo perché è BF.
HyperNeutrino,

5

Python, 138 148 152 caratteri

Ok, conoscevo il principio ma non avevo mai implementato la modifica distanza prima, quindi ecco qui:

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

Segue le regole come indicato, ma non lo spirito delle regole:

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

Prende due parametri come argomenti. Esempio chiamando: php edit_dist.php word1 word2.
Normalmente levenshtein()considera una sostituzione come una sola operazione, ma ha una forma sovraccaricata in cui è possibile specificare i pesi insert / sub / delete. In questo caso, è 1/2/1.


3

APL (90 caratteri)

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

Sto usando Dyalog APL come mio interprete, con ⎕IOimpostato su 1 e ⎕MLimpostato su 0. La funzione diretta ( { ... }) calcola, data una riga come input, la riga successiva nella matrice della distanza. (Viene avviato con la riga iniziale:. 0,⍳x) L'operatore di potenza ( ) viene utilizzato per nidificare la funzione una volta per ogni carattere nella seconda stringa ( ⊃⍴b). Dopo tutto ciò, la riga finale viene invertita ( ) e viene preso il suo primo elemento ( ).

Esempio:

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

Questo viene letto in due righe dall'utente (che sono l'input) e quindi utilizza solo la adistfunzione per calcolare la distanza. Poiché le sostituzioni costano 2 per questo problema, è necessario aggiungere un vettore denominato per il parametro dei costi per l'adist. Poiché esiste anche un parametro conteggi per adist, possiamo solo abbreviare i costi in cos, quindi abbiamo ancora una corrispondenza univoca per i nomi dei parametri.

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

Esempio di utilizzo

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

Versione golfizzata del metodo Ruby lento e ricorsivo qui , modificato per raddoppiare il peso delle sostituzioni. Il fatto che siano necessari 7 caratteri per rimuovere il primo carattere di una stringa fa davvero male, e sarebbe bello sostituirlo (a[0]==b[0]?-1:1)con qualcosa di simile -1**a[0]<=>b[0]ma l'ordine delle operazioni non è mio amico.


0

Smalltalk (Smalltalk / X), 34

Sono fortunato - la classe standard "String" contiene già levenshtein:

inserire a, b:

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

(i parametri aggiuntivi consentono pesi diversi su sostituzione, cancellazione, ecc.)

Prova:

#( '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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.