लेवेंसहाइट दूरी का प्रत्येक चरण


18

इस चुनौती में आप एक प्रोग्राम लिखेंगे जिसमें दो न्यूलाइन-सेपरेटेड स्ट्रिंग्स, s1 (पहली लाइन) और s2 (दूसरी लाइन), इनपुट (STDIN या निकटतम) के रूप में लिखा जाएगा। आप मान सकते हैं कि s1 की लंबाई हमेशा 30 से छोटी और s2 की लंबाई से बड़ी होगी। कार्यक्रम को तब s1 से s2 तक लेवेन्सटाइटिन दूरी में प्रत्येक चरण का उत्पादन करना चाहिए।

यह स्पष्ट करने के लिए कि लेवेन्सटाइटिन दूरी के प्रत्येक चरण का क्या अर्थ है, प्रोग्राम n स्ट्रिंग्स को प्रिंट करेगा, जहां n s1 और s2 के बीच लेवेन्सहाइट की दूरी है, और दो आसन्न स्ट्रिंग्स के बीच लेवेन्सेटिन दूरी हमेशा एक होगी। आदेश कोई फर्क नहीं पड़ता। आउटपुट न्यूलाइन-अलग होना चाहिए और इसमें s1 शामिल नहीं है, केवल इन-बेटवीन्स और 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

यहाँ एक अजगर लिपि की एक कड़ी है जो दूरी और चरणों को छापती है।

अतिरिक्त नियम:

यह कोड-गोल्फ है इसलिए आप कोड को छोटा रखें; सबसे छोटा कोड जीत!


1
अपने संपादन के लिए, मैंने यह माना कि इनपुट फॉर्म का होगा s1(newline)s2, हालाँकि, प्रश्न पर फिर से गौर करते हुए, मैं सोच रहा था कि क्या इसके बजाय आप प्रोग्राम के लिए 2 इनपुट स्ट्रिंग्स की लंबाई के आधार पर s1 और s2 का चयन करना चाहते हैं, आने वाले किसी भी क्रम में, क्या आप इस बिंदु को स्पष्ट करेंगे? यही है, क्या हम मानते हैं कि इनपुट s1 के बाद s2 है, या क्या हम दो इनपुट की लंबाई के आधार पर s1 और s2 का चयन करते हैं?
विजुअलमेल

क्या एक जवाब के लिए उचित समय में भागना पड़ता है?
केसाब

टूरिस्ट - एम्पीयर, दूरी 2, अजगर स्क्रिप्ट हमेशा के लिए चलती है ...
edc65

"STDIN या निकटतम से इनपुट लेना" कितना सख्त है? क्या मैं एक फ़ंक्शन लिख सकता हूं जो फ़ंक्शन तर्क के माध्यम से इनपुट लेता है? वर्तमान में स्वीकृत उत्तर ऐसा करता है।
nimi

जवाबों:


4

जावास्क्रिप्ट, 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

डीगोल्फ्ड (और एनोटेट) कोड (तारीख से बाहर लेकिन आपको विचार मिलता है):

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

function l (a, b, d) {s = "slice"; if (a! = b) {if (a.length> b.length) a = a [s] (1), d = -1; और; if (! एक [घ] = बी [घ]) एक = एक [एस] (0, घ) + बी [घ] ने एक [s] (घ + 1), document.write (अ + "<p>" ); l (a, b, ++ d)}}
डॉ। दर्द

@ निम्मी: यदि आप इसे दो तर्कों (जैसे l ("प्रोग्रामिंग", "कोडगॉल्फ")) के साथ कहते हैं, तो यह समान काम करता है, इसलिए मुझे लगता है कि आपकी बात निरर्थक है।
9999 साल 3

इसके अलावा, की घोषणा sके अंदर a=a[s](1)के रूप में a=a[s="slice"](1)कुछ बाइट्स बचाता है।
मामा फन रोल

1
कोडपेन के लिंक के अनुसार, आपका प्रोग्राम "Programming"-> के लिए 11 चरणों का आउटपुट देता है "Codegolf", लेकिन यह 10. होना चाहिए
nimi

10

हास्केल, 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

यह एक क्रूर शक्ति है जो बदलते और हटाने के बीच का निर्णय लेती है यदि प्रारंभिक वर्ण भिन्न होते हैं।


इसे चलाने में कितना समय लगता है?
लवोजो

मैं कैसे परीक्षण कर सकता हूं (शायद ideone)?
edc65

@ लोजोवो: आपके उदाहरणों की तरह छोटे तारों की गणना तुरंत की जाती है, सबसे खराब स्थिति लगभग 1: 30 मिनट की होती है। मैंने व्याख्या की है कि "एक मिनट के अंदर" चलना चाहिए "सख्त सीमा के रूप में नहीं (बनाम बनाम होना चाहिए)"। यदि यह आवश्यक है, तो मैं लगभग 20 बाइट्स के लिए "प्रदर्शन पैक" जोड़ सकता हूं।
nimi

@ edc65: हाँ, आइडोन, लेकिन यह उम्मीद करता है कि कार्य को "मुख्य" कहा जाएगा। कोशिश करें: ideone.com/CUgU8W
nimi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.