두 문자열 사이의 최소 편집 거리 찾기


13

설명

두 문자열 사이 의 편집 거리는 한 단어를 다른 단어로 변환하기위한 가능한 최소 삽입, 삭제 또는 대체 수의 함수입니다.

삽입 및 삭제 비용은 1이고 대체 비용은 2입니다.

예를 들어, 삭제 비용이 1이고 필요한 유일한 편집은 문자 삭제이기 때문에 AB와 사이의 거리는 A1 B입니다.

대체 비용이 2이기 때문에 CAR와 사이의 거리는 FAR2입니다.이를 보는 또 다른 방법은 하나의 삭제와 하나의 삽입입니다.

규칙

두 개의 입력 문자열이 제공되지만 (제공된 언어는 편리함) 프로그램에서 두 문자열 사이의 최소 편집 거리를 찾아야합니다.

문자열은 문자 만 포함하고 A-Z100 자 미만, 0 자 이상 이라고 가정 할 수 있습니다 .

이것은 코드 골프 이므로 가장 짧은 솔루션이 승리합니다.

샘플 테스트 사례

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

내 알고리즘 클래스에서 한 번 Excel 에서이 작업을 수행했습니다. 프로젝트를 .xls 문서로 바꾸는 것이 재미있었습니다. 실제로 꽤 잘 작동했습니다. 내가 찾을 수 있는지 보자.
captncraig

PHP는 이것을 쉽게 이길 것입니다.
st0le

@ st0le-내장 levenshtein함수는 대체를 두 개가 아닌 하나의 편집 (대체)으로 취급합니다 (삭제 + 삽입).
Mr. Llama

답변:


7

brainfuck, 2680

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

물론 동적 프로그래밍을 사용합니다.

입력 문자열은 공백으로 구분 한 다음 새 줄을 붙여야합니다. 예를 들면 다음과 같습니다.

INTENTION EXECUTION
008

1
깔끔하게 정렬되고 가독성이 좋습니다-좋아합니다, +1!
토마스

이것은 컴퓨터 언어입니까? : O

이 질문에 대한 가장 혼란스러운 제출은 ... BF이기 때문에 +1입니다.
HyperNeutrino 2012

5

파이썬, 138 148 152

좋아, 나는 원리를 알고 있었지만 이전에는 편집 거리를 구현 한 적이 없었으므로 여기에 간다.

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

명시된 규칙을 따르되 규칙의 정신은 아닙니다.

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

두 개의 매개 변수를 인수로 사용합니다. 호출 예 : php edit_dist.php word1 word2.
일반적으로 levenshtein()대체를 하나의 작업 으로 간주하지만 삽입 / 하위 / 삭제 가중치를 지정할 수있는 오버로드 된 형식을 갖습니다. 이 경우 1/2/1입니다.


3

APL (90 자)

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

Dyalog APL을 통역사로 ⎕IO사용하고 1로 ⎕ML설정하고 0으로 설정했습니다. 직접 함수 ( { ... })는 행을 입력으로 주어 거리 행렬의 다음 행을 계산합니다. (처음 행으로 시작합니다 : 0,⍳x.) 전력 연산자 ( )는 두 번째 문자열 ( ⊃⍴b) 의 각 문자에 대해 함수를 한 번 중첩하는 데 사용됩니다 . 그 후 마지막 행이 반전되고 ( ) 첫 번째 요소가 사용됩니다 ( ).

예:

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

사용자로부터 두 줄 (입력)을 읽은 다음 adist함수를 사용하여 거리를 계산합니다. 이 문제에 대한 대체 비용이 2이므로 adist의 비용 매개 변수에 명명 된 벡터를 추가해야합니다. adist에 대한 counts 매개 변수도 있기 때문에 cos에 대한 비용 만 줄일 수 있으므로 매개 변수 이름과 고유하게 일치합니다.

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

사용 예

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

0

루비 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 여기를 , 대체에 대한 무게를 두 배로 수정했습니다. 이 문자열의 첫 번째 문자를 제거하기 위해 7 개 문자를 취한다는 사실은 정말 상처, 그리고 그것을 대체하기 위해 냉각 할 것 (a[0]==b[0]?-1:1)같은 뭔가 -1**a[0]<=>b[0]하지만 작업의 순서 내 친구가 아닙니다.


0

스몰 토크 (Smalltalk / X), 34

운이 좋다-표준 "String"클래스에는 이미 levenshtein이 포함되어있다 :

입력 a, b :

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

(추가 매개 변수를 사용하면 대체, 삭제 등에 대한 가중치가 다릅니다.)

시운전 :

#( '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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.