Setiap langkah dari jarak Levenshtein

18

Dalam tantangan ini, Anda akan menulis sebuah program yang mengambil dua string yang dipisahkan oleh baris baru, s1 (baris pertama) dan s2 (baris kedua), sebagai input (STDIN atau yang terdekat). Anda dapat mengasumsikan bahwa panjang s1 akan selalu lebih kecil dari 30 dan lebih besar dari panjang s2. Program kemudian harus menampilkan setiap langkah dalam jarak levenshtein dari s1 ke s2.

Untuk memperjelas apa arti setiap langkah dalam jarak levenshtein, program akan mencetak n string, di mana n adalah jarak levenshtein antara s1 dan s2, dan jarak levenshtein antara dua string yang berdekatan akan selalu menjadi satu. Perintahnya tidak masalah. Outputnya harus dipisahkan dengan baris baru dan tidak termasuk s1, hanya in-betweens dan s2. Program ini juga harus berjalan dalam waktu kurang dari satu menit pada komputer modern.

Contoh:

Memasukkan:

Programming
Codegolf

Keluaran:

rogramming
Cogramming
Coramming
Coamming
Codmming
Codeming
Codeging
Codegong
Codegolg
Codegolf

Memasukkan:

Questions
Answers

Keluaran:

uestions
Aestions
Anstions
Ansions
Answons
Answens
Answers

Memasukkan:

Offline
Online

Keluaran:

Ofline
Online

Memasukkan:

Saturday
Sunday

Keluaran:

Sturday
Surday
Sunday

Berikut ini tautan ke skrip python yang mencetak jarak dan langkah-langkahnya.

Aturan tambahan:

Ini kode-golf, jadi buatlah kode Anda singkat; kode menang paling pendek!

Loovjo
sumber
1
Untuk edit saya, saya agak mengira bahwa input akan berupa s1(newline)s2, namun, setelah melihat kembali pertanyaan itu, saya bertanya-tanya apakah sebaliknya Anda berniat untuk program untuk memilih s1 dan s2 berdasarkan pada panjang 2 string yang dimasukkan, datang dalam urutan mana pun, maukah Anda mengklarifikasi hal ini? Yaitu, apakah kita mengasumsikan inputnya adalah s1 diikuti oleh s2, atau apakah kita memilih s1 dan s2 berdasarkan panjang dari dua input?
VisualMelon
Apakah jawaban harus dijalankan dalam jumlah waktu yang wajar?
KSab
Camper - Ampere, jarak 2, skrip python berjalan selamanya ...
edc65
Seberapa ketat "mengambil input dari STDIN atau terdekat"? Bisakah saya menulis fungsi yang mengambil input melalui argumen fungsi? Jawaban yang saat ini diterima melakukannya.
nimi

Jawaban:

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

Telepon dengan l("Programming","golf")

Codepen

Kode degolfed (dan beranotasi) (kedaluwarsa tetapi Anda mendapatkan ide):

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
  }
}
9999 tahun
sumber
fungsi l (a, b, d) {s = "slice"; if (a! = b) {if (a.length> b.length) a = a [s] (1), d = -1; selain itu jika (a [d]! = b [d]) a = a [s] (0, d) + b [d] + a [s] (d + 1); document.write (a + "<p>" ); l (a, b, ++ d)}}
Dr. Pain
@nimi: Jika Anda menyebutnya dengan dua argumen (mis. l ("pemrograman", "codegolf")) itu berfungsi sama, jadi saya kira poin Anda adalah nol.
9999tahun
Juga, mendeklarasikan sinside a=a[s](1)sebagai a=a[s="slice"](1)menyimpan beberapa byte.
Mama Fun Roll
1
Menurut tautan ke codepen, program Anda menghasilkan 11 langkah untuk "Programming"-> "Codegolf", tetapi harus 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

Lebih lama dari yang diharapkan. Mungkin saya bisa bermain golf sedikit ...

Contoh penggunaan:

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

Ini adalah kekuatan kasar yang memutuskan antara mengubah dan menghapus jika karakter awal berbeda.

nimi
sumber
Berapa lama untuk berjalan?
Loovjo
Bagaimana saya bisa menguji (mungkin ideone)?
edc65
@ Loojo: string lebih pendek seperti contoh Anda dihitung secara instan, kasus terburuk adalah sekitar 1: 30 menit. Saya telah menafsirkan "harus" dalam "harus berjalan di bawah satu menit" bukan sebagai batas yang ketat (harus vs harus). Jika ini suatu keharusan, saya dapat menambahkan "paket kinerja" sekitar 20 byte.
nimi
@ edc65: ya, ideone, tetapi mengharapkan fungsi yang akan dieksekusi disebut "utama". Coba: ideone.com/CUgU8W
Nimi