แต่ละขั้นตอนของระยะทาง Levenshtein


18

ในการท้าทายนี้คุณจะเขียนโปรแกรมที่รับสตริงที่คั่นด้วยสองบรรทัดใหม่คือ s1 (บรรทัดแรก) และ s2 (บรรทัดที่สอง) เป็นอินพุต (STDIN หรือใกล้เคียงที่สุด) คุณสามารถสันนิษฐานได้ว่าความยาวของ s1 นั้นจะเล็กกว่า 30 และใหญ่กว่าความยาวของ s2 เสมอ โปรแกรมควรแสดงผลแต่ละขั้นตอนในระยะทางของ levenshtein จาก s1 ถึง s2

เพื่ออธิบายความหมายของแต่ละขั้นตอนในระยะทางของ levenshtein โปรแกรมจะพิมพ์สตริง n โดยที่ n คือระยะทาง levenshtein ระหว่าง s1 และ s2 และระยะทาง levenshtein ระหว่างสองสายที่อยู่ติดกันจะเป็นหนึ่งเสมอ ลำดับไม่สำคัญ เอาต์พุตควรคั่นด้วยบรรทัดใหม่และไม่รวม s1 เฉพาะ in-betweens และ 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อย่างไรก็ตามหลังจากดูคำถามอีกครั้งฉันสงสัยว่าถ้าคุณตั้งใจให้โปรแกรมเลือก s1 และ s2 ตามความยาวของ 2 สตริงที่กำลังมา คุณคิดว่าจะอธิบายประเด็นนี้ในลำดับใด นั่นคือเราสมมติว่าอินพุตเป็น s1 ตามด้วย s2 หรือเราเลือก s1 และ s2 ตามความยาวของอินพุตทั้งสองหรือไม่
VisualMelon

คำตอบต้องทำงานในระยะเวลาที่เหมาะสมหรือไม่?
KSab

Camper - แอมป์, ระยะทาง 2, สคริปต์ไพ ธ อนทำงานตลอดไป ...
edc65

"รับข้อมูลจาก STDIN หรือใกล้เคียง" มากแค่ไหน? ฉันสามารถเขียนฟังก์ชั่นที่รับอินพุตผ่านอาร์กิวเมนต์ของฟังก์ชันได้หรือไม่ คำตอบที่ยอมรับในปัจจุบันทำเช่นนั้น
nimi

คำตอบ:


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

Codepen

รหัส 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 = "ชิ้น"; ถ้า (a! = b) {ถ้า (a.length> b.length) a = a [s] (1), d = -1; อื่น ถ้า (! a [D] = b [D]) A = a [s] (0, d) + B [D] + A [s] (1 + d); document.write (A + "<p>" ); l (a, b, ++ d)}}
Dr. Pain

@nimi: ถ้าคุณเรียกมันว่ามีสองข้อโต้แย้ง (เช่น l ("การเขียนโปรแกรม", "codegolf")) มันใช้งานได้เหมือนกันดังนั้นฉันคิดว่าจุดของคุณเป็นโมฆะ
9999 ปีที่

นอกจากนี้ประกาศsภายในa=a[s](1)เป็นa=a[s="slice"](1)บันทึกบางไบต์
Mama Fun Roll

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

ฉันจะทดสอบ (อาจจะเป็น ideone) ได้อย่างไร?
edc65

@Loovjo: มีการคำนวณสตริงที่สั้นกว่าเช่นตัวอย่างของคุณทันทีกรณีที่แย่ที่สุดคือประมาณ 1: 30 นาที ฉันตีความว่า "ควร" ใน "ควรทำงานในภายใต้หนึ่งนาที" ไม่เป็นขีด จำกัด ที่เข้มงวด (ควรเทียบกับต้อง) ถ้านี่เป็นสิ่งที่ต้องทำฉันสามารถเพิ่ม "แพ็คประสิทธิภาพ" ได้ประมาณ 20 ไบต์
nimi

@ edc65: ใช่, ideone แต่มันคาดว่าฟังก์ชั่นที่จะดำเนินการจะเรียกว่า "main" ลอง: ideone.com/CUgU8W
nimi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.