Levenshtein mesafesinin her adımı


18

Bu meydan okumada, girdi olarak (STDIN veya en yakın) s2 (ilk satır) ve s2 (ikinci satır) olmak üzere iki satır satırla ayrılmış iki dizgi alan bir program yazacaksınız. S1 uzunluğunun her zaman 30'dan küçük ve s2 uzunluğundan daha büyük olacağını varsayabilirsiniz. Program daha sonra her adımı s1'den s2'ye levenshtein mesafesinden çıkarmalıdır.

Levenshtein mesafesindeki her adımın ne anlama geldiğini açıklığa kavuşturmak için, program n dizeleri yazdıracaktır, burada n s1 ve s2 arasındaki levenshtein mesafesidir ve iki bitişik dize arasındaki levenshtein mesafesi her zaman bir olacaktır. Sıra önemli değil. Çıktı satırsonu ile ayrılmalı ve s1'i içermemeli, sadece aradaki ve s2'yi içermelidir. Program ayrıca modern bir bilgisayarda bir dakikadan az bir sürede çalışmalıdır.

Örnekler:

Giriş:

Programming
Codegolf

Çıktı:

rogramming
Cogramming
Coramming
Coamming
Codmming
Codeming
Codeging
Codegong
Codegolg
Codegolf

Giriş:

Questions
Answers

Çıktı:

uestions
Aestions
Anstions
Ansions
Answons
Answens
Answers

Giriş:

Offline
Online

Çıktı:

Ofline
Online

Giriş:

Saturday
Sunday

Çıktı:

Sturday
Surday
Sunday

Burada , mesafeyi ve adımları yazdıran bir python betiği bağlantısı bulunmaktadır.

Ek kurallar:

Bu kod golf yani kısa kod tutmak; en kısa kod kazanır!


1
Düzenlemem için, girdinin formda olacağını varsaydım s1(newline)s2, ancak soruyu tekrar gözden geçirdikten sonra, programın yerine girilen 2 dizenin uzunluğuna göre s1 ve s2'yi seçmesini isteyip istemediğinizi merak ediyorum her iki sırayla, bu noktayı açıklığa kavuşturmak ister misiniz? Yani, girdinin s1 ve ardından s2 olduğunu varsayar mıyız, yoksa iki girişin uzunluğuna göre s1 ve s2'yi seçer miyiz?
VisualMelon

Bir yanıtın makul bir süre içinde çalışması gerekiyor mu?
KSab

Camper - Amper, mesafe 2, python betiği sonsuza dek çalışır ...
edc65

"STDIN'den veya en yakınından girdi al" ne kadar katıdır? Girdiyi işlev bağımsız değişkeni ile alan bir işlev yazabilir miyim? Şu anda kabul edilen cevap bunu yapıyor.
nimi

Yanıtlar:


4

JavaScript, 167 161 154 bayt

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

İle ara l("Programming","golf")

Codepen

Degolfed (ve açıklamalı) kodu (güncel değil, ancak fikri anladınız):

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

işlev l (a, b, d) {s = "dilim"; eğer (a! = b) {if (a.length> b.length) a = a [s] (1), d = -1; başka (b = [d] bir [d]!) a + b [d] bir [s] (d + 1) [s] (0, d) = durumunda, document.write (a + "<p>" ); l (a, b, ++ d)}}
Dr. Pain

@nimi: İki argümanla çağırırsanız (örneğin, l ("programlama", "kodgolf")) aynı şekilde çalışır, bu yüzden noktanızın boş olduğunu varsayalım.
9999years

Ayrıca, ilan siçeride a=a[s](1)olarak a=a[s="slice"](1)bazı bayt kaydeder.
Mama Fun Roll

1
Kodlama bağlantısına göre, programınız "Programming"-> için 11 adım çıkarır, "Codegolf"ancak 10 olmalıdır.
nimi

10

Haskell, 201 194 bayt

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

Beklenenden daha uzun. Belki biraz golf oynayabilirim ...

Kullanım örneği:

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

İlk karakterler farklıysa değiştirme ve silme arasında karar veren kaba bir kuvvettir.


Kaçmak ne kadar sürer?
Loovjo

Nasıl test edebilirim (belki ideone)?
edc65

@Loovjo: örnekleriniz gibi daha kısa dizeler anında hesaplanır, en kötü durum yaklaşık 1: 30 dakikadır. Ben "gerekir" in "bir dakika altında çalıştırmak gerekir" olarak yorumladı katı bir sınır (gerekir vs gerekir). Bu bir zorunluluksa, yaklaşık 20 bayt için bir "performans paketi" ekleyebilirim.
nimi

@ edc65: evet, ideone, ama yürütülecek işlevin "ana" olarak adlandırılmasını bekliyor. Deneyin: ideone.com/CUgU8W
nimi
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.