莱文施泰因距离的每一步


18

在此挑战中,您将编写一个程序,该程序将两个换行符分隔的字符串s1(第一行)和s2(第二行)作为输入(STDIN或最接近)。您可以假设s1的长度始终小于30且大于s2的长度。然后,程序应输出从s1到s2的levenshtein距离中的每个步骤。

为了弄清楚levenshtein距离中每个步骤的含义,程序将打印n个字符串,其中n是s1和s2之间的levenshtein距离,两个相邻字符串之间的levenshtein距离将始终为1。顺序无关紧要。输出应以换行符分隔,并且不包括s1,仅包括in和s2。该程序还应在一台现代计算机上在一分钟内运行。

例子:

输入:

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 2015年

答案是否必须在合理的时间内运行?
KSab 2015年

Camper-Ampere,距离2,python脚本会永远运行...
edc65 2015年

“从STDIN或最接近的输入接受”有多严格?我可以编写一个通过函数参数接受输入的函数吗?当前接受的答案是这样做的。
nimi 2016年

Answers:


4

Javascript 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")

码笔

已去噪(和带注释)的代码(已过期,但您知道了):

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;否则if(a [d]!= b [d])a = a [s](0,d)+ b [d] + a [s](d + 1); document.write(a +“ <p>” ); l(a,b,++ d)}}
Pain博士

@nimi:如果用两个参数(例如l(“ programming”,“ codegolf”)调用它,则它的工作原理相同,所以我想您的观点是空的。
9999

另外,将sinside 声明a=a[s](1)为as a=a[s="slice"](1)可以节省一些字节。
Mama Fun Roll'3

1
据到codepen的链接,你的程序将输出11个步骤"Programming"- > "Codegolf",但它应该是10
NIMI

10

Haskell中,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 2015年

我该如何测试(也许是ideone)?
edc65 2015年

@Loovjo:像您的示例这样的较短字符串会立即计算出来,最坏的情况是大约1:30min。我已经将“应该在一分钟内运行”中的“应该”解释为严格的限制(应该与必须)。如果必须这样做,我可以添加大约20个字节的“性能包”。
NIMI

@ edc65:是的,ideone,但它希望将要执行的功能称为“ main”。尝试:ideone.com/CUgU8W
NIMI
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.