Mỗi bước của khoảng cách Levenshtein


18

Trong thử thách này, bạn sẽ viết một chương trình lấy hai chuỗi phân tách dòng mới, s1 (dòng đầu tiên) và s2 (dòng thứ hai), làm đầu vào (STDIN hoặc gần nhất). Bạn có thể giả sử rằng chiều dài của s1 sẽ luôn nhỏ hơn 30 và lớn hơn chiều dài của s2. Chương trình sau đó sẽ xuất từng bước trong khoảng cách levenshtein từ s1 đến s2.

Để làm rõ mỗi bước trong khoảng cách levenshtein có nghĩa là gì, chương trình sẽ in n chuỗi, trong đó n là khoảng cách levenshtein giữa s1 và s2 và khoảng cách levenshtein giữa hai chuỗi liền kề sẽ luôn là một. Thứ tự không quan trọng. Đầu ra phải được phân tách bằng dòng mới và không bao gồm s1, chỉ bao gồm các betwress và s2. Chương trình cũng nên chạy dưới một phút trên một máy tính hiện đại.

Ví dụ:

Đầu vào:

Programming
Codegolf

Đầu ra:

rogramming
Cogramming
Coramming
Coamming
Codmming
Codeming
Codeging
Codegong
Codegolg
Codegolf

Đầu vào:

Questions
Answers

Đầu ra:

uestions
Aestions
Anstions
Ansions
Answons
Answens
Answers

Đầu vào:

Offline
Online

Đầu ra:

Ofline
Online

Đầu vào:

Saturday
Sunday

Đầu ra:

Sturday
Surday
Sunday

Đây là một liên kết đến một kịch bản python in ra khoảng cách và các bước.

Quy tắc bổ sung:

Đây là mã golf, vì vậy hãy giữ cho bạn mã ngắn; chiến thắng mã ngắn nhất!


1
Đối với chỉnh sửa của tôi, tôi cho rằng đầu vào sẽ có dạng s1(newline)s2, tuy nhiên, khi xem lại câu hỏi, tôi tự hỏi liệu thay vào đó bạn có dự định chọn chương trình chọn s1 và s2 dựa trên độ dài của 2 chuỗi được nhập không, sắp tới theo thứ tự nào, bạn có phiền làm rõ điểm này không? Nghĩa là, chúng ta giả sử đầu vào là s1 theo sau là s2 hay chúng ta chọn s1 và s2 dựa trên độ dài của hai đầu vào?
VisualMelon

Có một câu trả lời phải chạy trong một khoảng thời gian hợp lý?
KSab

Camper - Ampe, khoảng cách 2, tập lệnh python chạy mãi mãi ...
edc65

Làm thế nào nghiêm ngặt là "lấy đầu vào từ STDIN hoặc gần nhất"? Tôi có thể viết một hàm lấy đầu vào thông qua đối số hàm không? Câu trả lời hiện được chấp nhận làm như vậy.
nimi

Câu trả lời:


4

Javascript, 167 161 154 byte

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)}}

Gọi với l("Programming","golf")

Codepen

Mã khử (và chú thích) (hết hạn nhưng bạn có ý tưởng):

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

hàm l (a, b, d) {s = "lát"; if (a! = b) {if (a.length> b.length) a = a [s] (1), d = -1; khác if (a [d]! = b [d]) a = a [s] (0, d) + b [d] + a [s] (d + 1); document.write (a + "<p>" ); l (a, b, ++ d)}}
Bác sĩ Đau

@nimi: Nếu bạn gọi nó bằng hai đối số (ví dụ l ("lập trình", "codegolf")) thì nó hoạt động như nhau, vì vậy tôi cho rằng quan điểm của bạn là null.
9999 năm 7/03/2016

Ngoài ra, khai báo sbên trong a=a[s](1)a=a[s="slice"](1)tiết kiệm một số byte.
Mama Fun Roll

1
Theo liên kết đến codepen, chương trình của bạn xuất ra 11 bước cho "Programming"-> "Codegolf", nhưng phải là 10.
nimi

10

Haskell, 201 194 byte

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

Lâu hơn dự kiến. Có lẽ tôi có thể đánh nó xuống một chút ...

Ví dụ sử dụng:

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

Đó là một lực lượng quyết định giữa thay đổi và xóa nếu các ký tự ban đầu khác nhau.


Mất bao lâu để chạy?
Loovjo

Làm thế nào tôi có thể kiểm tra (có thể là ideone)?
edc65

@Loovjo: các chuỗi ngắn hơn như ví dụ của bạn được tính ngay lập tức, trường hợp xấu nhất là khoảng 1: 30 phút. Tôi đã giải thích "nên" trong "nên chạy trong dưới một phút" không phải là một giới hạn nghiêm ngặt (nên so với phải). Nếu đây là điều bắt buộc, tôi có thể thêm "gói hiệu suất" cho khoảng 20 byte.
nimi

@ edc65: có, ideone, nhưng nó hy vọng chức năng sẽ được thực thi để được gọi là "chính". Hãy thử: ideone.com/CUgU8W
Tên mẫu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.