İki dize arasındaki minimum düzenleme mesafesini bulun


13

açıklama

Düzenlemek mesafesi iki dizeleri arasındaki başka bir kelime haline bir kelime dönüştürmek için ekleme, silme veya değiştirmeler minimum sayısının bir fonksiyonudur.

Ekleme ve silme işlemleri 1, ikame ücretleri 2.

Örneğin, arasındaki mesafe ABve Asilme maliyeti 1 ve gerektiğinde tek düzenleme silinmesi, çünkü 1'dir Bkarakteri.

Arasındaki mesafe CARve FARikameler, bu bakmak için başka bir yol, bir silme ve araya sokma olduğu 2. maliyeti nedeniyle, 2'dir.

kurallar

İki giriş dizesi göz önüne alındığında (birlikte verilir, ancak kendi dilinizde uygundur), programınızın iki dize arasındaki minimum düzenleme mesafesini bulması gerekir.

Dizelerin yalnızca karakter içerdiğini A-Zve 100 karakterden az ve 0 karakterden fazla olduğunu varsayabilirsiniz .

Bu kod golf , bu yüzden en kısa çözüm kazanır.

Örnek Test Durumları

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

Bunu algoritma sınıfımda bir kez excel yaptım. Projeyi bir .xls belgesi olarak teslim etmek çok eğlenceliydi. Aslında oldukça iyi çalıştı. Bulabilir miyim bakacağım.
captncraig

PHP bunu kolayca kazanmalıdır.
12'de st0le

@ st0le - Yerleşik levenshteinişlev ikameleri ikiye değil (silme + ekleme) tek bir düzenleme (yerine geçme) olarak ele alır.
Bay Llama

Yanıtlar:


7

beyin sapı, 2680

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

Elbette dinamik programlamayı kullanmak.

Giriş dizeleri bir boşlukla ve ardından yeni bir satırla ayrılmalıdır. Örneğin:

INTENTION EXECUTION
008

1
Düzgün hizalanmış ve çok okunabilir - Sevdim +1!
Thomas

Bu bir bilgisayar dili mi? : O

Bu, bu sorunun en kafa karıştırıcı sunumu ... +1 sadece BF olduğu için.
HyperNeutrino

5

Python, 138 148 152 karakter

Tamam, prensibi biliyordum ama daha önce düzenleme mesafesini hiç uygulamamıştım, işte gidiyor:

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

Belirtilen kurallara uyar, ancak kuralların ruhuna uymaz:

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

Bağımsız değişken olarak iki parametreyi alır. Örnek çağırarak: php edit_dist.php word1 word2.
Normalde levenshtein()bir ikameyi tek bir işlem olarak kabul eder, ancak ekleme / alt / silme ağırlıklarının belirtilebileceği aşırı yüklenmiş bir biçime sahiptir. Bu durumda, 1/2/1.


3

APL (90 karakter)

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

Yorumcum olarak ⎕IO1'e ⎕MLayarlanmış ve 0'a ayarlanmış olarak Dyalog APL kullanıyorum . Doğrudan fonksiyon ( { ... }) girdi olarak bir satır, mesafe matrisinde bir sonraki satır olarak hesaplar. (İlk satırla başlar:. 0,⍳x) Güç operatörü ( ), işlevi ikinci dizgideki ( ⊃⍴b) her karakter için bir kez yuvalamak için kullanılır . Tüm bunlardan sonra, son satır ters çevrilir ( ) ve ilk öğesi alınır ( ).

Misal:

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

Bu, kullanıcıdan (giriş olan) iki satır okur ve sonra sadece adistmesafeyi hesaplamak için işlevi kullanır . Değişiklikler bu sorun için 2 maliyet olduğundan, adist için maliyet parametresi için adlandırılmış bir vektör eklememiz gerekir. Adist için bir counts parametresi olduğundan, cos için maliyetleri sadece kısaltabiliriz, bu nedenle parametre adları için hala benzersiz bir eşleşmemiz olur.

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

Örnek kullanım

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

0

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

Yavaş, yinelemeli Ruby yöntemin versiyonu golfed burada , ikameler için ağırlık çift için modifiye edilir. Bir dizenin ilk karakterini kaldırmanın 7 karakter alması gerçekten acıyor ve yerine (a[0]==b[0]?-1:1)benzer bir şey koymak hoş olurdu -1**a[0]<=>b[0]ama işlem sırası benim arkadaşım değil.


0

Küçük konuşma (Küçük konuşma / X), 34

Şanslıyım - standart "String" sınıfı zaten levenshtein içerir:

giriş a, b:

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

(ek parametreler, değiştirme, silme, vb. gibi farklı ağırlıklara izin verir.)

Test sürüşü:

#( '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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.