레 벤슈 테인 거리의 각 단계


18

이 과제에서는 줄 바꿈으로 구분 된 두 개의 문자열 인 s1 (첫 번째 줄)과 s2 (두 번째 줄)를 입력 (STDIN 또는 가장 가까운)으로 사용하는 프로그램을 작성합니다. s1의 길이가 항상 30보다 작고 s2의 길이보다 크다고 가정 할 수 있습니다. 그런 다음 프로그램은 s1에서 s2까지의 거리에서 각 단계를 출력해야합니다.

레벤 슈타인 거리의 각 단계가 의미하는 바를 명확히하기 위해 프로그램은 n 개의 문자열을 인쇄합니다. 여기서 n은 s1과 s2 사이의 레벤 슈타인 거리이며, 인접한 두 스트링 사이의 레벤 슈타인 거리는 항상 1입니다. 순서는 중요하지 않습니다. 출력은 개행으로 분리되어야하며 s1, 중간 및 s2 만 포함해야합니다. 이 프로그램은 최신 컴퓨터에서 1 분 안에 실행되어야합니다.

예 :

입력:

Programming
Codegolf

산출:

rogramming
Cogramming
Coramming
Coamming
Codmming
Codeming
Codeging
Codegong
Codegolg
Codegolf

입력:

Questions
Answers

산출:

uestions
Aestions
Anstions
Ansions
Answons
Answens
Answers

입력:

Offline
Online

산출:

Ofline
Online

입력:

Saturday
Sunday

산출:

Sturday
Surday
Sunday

여기 은 거리와 단계를 인쇄하는 Python 스크립트에 대한 링크입니다.

추가 규칙 :

이것은 코드 골프이므로 코드를 짧게 유지하십시오. 최단 코드 승리!


1
편집을 위해 입력이 형식이라고 가정 s1(newline)s2했지만 질문을 다시 살펴본 결과 프로그램이 입력 된 2 개의 문자열 길이를 기반으로 s1과 s2를 선택하려고했는지 궁금합니다. 어느 쪽이든,이 점을 명확하게 설명 하시겠습니까? 즉, 입력이 s1 다음에 s2라고 가정합니까, 아니면 두 입력의 길이에 따라 s1과 s2를 선택합니까?
VisualMelon

적절한 시간 내에 답변을 실행해야합니까?
KSab

야영 자
-Ampere

"STDIN에서 입력을 받거나 가장 가깝습니다"는 얼마나 엄격합니까? 함수 인수를 통해 입력을받는 함수를 작성할 수 있습니까? 현재 받아 들여지는 대답은 그렇게합니다.
nimi

답변:


4

자바 스크립트, 167 161 154 바이트

function l(a,b,d){if(a!=b){if(a[l="length"]>b[l])a=a[s="slice"](1),d=-1;else if(a[d]!=b[d])a=a[s](0,d)+b[d]+a[s](d+1);document.write(a+"<p>");l(a,b,++d)}}

와 전화 l("Programming","golf")

코드 펜

degolfed 및 주석이 달린 코드 (오래되었지만 아이디어가 있음) :

function l(a, b, d) {
  s = "substring"; //saving this to a string lets us call it with a[s] later
  if (a != b) { //if the strings aren't the same, continue
    if (a.length > b.length) { //if a is still greater than b we can delete characters
      a = a[s](1); //delete the first character from a
      d = -1 //when we start swapping characters, we'll need d to start at 0
    } else if (a[d] != b[d]) { //if the d'th character isn't the same, we can swap them
      a = a[s](0, d) + b[d] + a[s](d + 1) //swap the d'th character of b into a
    }
    document.write(a + "<p>"); //the first call to document.write overwrites the page but successive calls append the output 
    l(a, b, ++d) //increment d and recurse
  }
}

함수 l (a, b, d) {s = "slice"; if (a! = b) {if (a.length> b.length) a = a [s] (1), d = -1; else if (a [d]! = b [d]) a = a [s] (0, d) + b [d] + a [s] (d + 1); document.write (a + "<p>" ); l (a, b, ++ d)}}
통증 박사 Dr.

@nimi : 두 개의 인수 (예 : l ( "programming", "codegolf"))로 호출하면 동일하게 작동하므로 포인트가 null이라고 가정합니다.
9999 년

또한 s내부 a=a[s](1)를 선언 a=a[s="slice"](1)하면 일부 바이트가 절약됩니다.
Mama Fun Roll

1
코드 펜 링크에 따르면 프로그램은 "Programming"->에 대해 11 단계를 출력 "Codegolf"하지만 10이어야합니다.
nimi

10

하스켈, 201 194 바이트

l=length
g[]n u=map(\_->"")n
g(b:c)[]u=(u++c):g c[]u
g(b:c)n@(o:p)u|b==o=g c p(u++[o])|1<2=((u++o:c):g c p(u++[o]))!((u++c):g c n u)
a!b|l a<l b=a|1<2=b
p[a,n]=g a n""
f=interact$unlines.p.lines

예상보다 깁니다. 어쩌면 나는 조금 아래로 골프를 칠 수 있습니다 ...

사용 예 :

*Main> f                     -- call via f
Questions                    -- User input
Answers                      -- no newline after second line!
uestions                     -- Output starts here
Aestions
Anstions
Ansions
Answons
Answens
Answers

초기 문자가 다른 경우 변경과 삭제를 결정하는 것은 무차별적인 힘입니다.


실행하는 데 얼마나 걸립니까?
Loovjo 2016 년

어떻게 테스트 할 수 있습니까?
edc65

@Loovjo : 예제와 같은 짧은 문자열은 즉시 계산되며 최악의 경우는 약 1:30 분입니다. 나는 "1 분 안에 실행해야한다"의 "해야한다"는 엄격한 제한이 아니라고 해석해야한다. 이것이 필수 인 경우 약 20 바이트의 "성능 팩"을 추가 할 수 있습니다.
nimi

@ edc65 : 그렇습니다. 그러나이 함수는 "main"이라고 불리 울 것으로 예상됩니다. 시도 : ideone.com/CUgU8W
nimi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.