एक पोर्टमंटआउट उत्पन्न करें!


16

पृष्ठभूमि

तीन साल पहले, इस लड़के टॉम मर्फी ने एक भाषा में सभी शब्दों के लिए एक पोर्टमंट्यू के विचार का विस्तार करने के लिए इसे अपने सिर में मिला लिया और इसे पोर्टमांउटआउट ( पोर्टमैंटेओ प्लस टाउट [ सभी के लिए फ्रेंच ]) कहा। अंग्रेजी को 108,709 शब्दों की सूची के रूप में परिभाषित करते हुए, वह निम्नलिखित दो गुणों के साथ 611,820 अक्षरों का एक क्रम खोजने में कामयाब रहे:

  • हर अंग्रेजी शब्द स्ट्रिंग में समाहित है।
  • स्ट्रिंग में किसी भी दो आसन्न अक्षरों वाले कुछ पड़ोस एक अंग्रेजी शब्द है।

यहां एक पृष्ठ का लिंक दिया गया है, जिस पर यह पोर्टमंटआउट पाया जा सकता है (एक वीडियो स्पष्टीकरण के साथ)।

एक पोर्टमांउटआउट

पोर्टमैटआउट के दो गुणों में से पहला समझना आसान है। दूसरे को कुछ स्पष्टीकरण की आवश्यकता हो सकती है।

मूल रूप से, शब्दों को ओवरलैप करना होगा। "गोल्फकोड" कभी भी अंग्रेजी के किसी पोर्टमिंटआउट में दिखाई नहीं देगा, क्योंकि इसमें कोई शब्द नहीं है जिसमें "एफसी" शामिल है। हालाँकि, आपको "कोडगोल्फ" एक पोर्टमांउटआउट में मिल सकता है, "अहंकार" के अंतर को पाटता है (और अन्य सभी अक्षर "कोड" या "गोल्फ" में हैं)।

आपका कार्य:

एक प्रोग्राम या फ़ंक्शन लिखें जो स्ट्रिंग्स की एक सूची लेता है और सूची के किसी भी पोर्टमंटआउट को वापस करता है।

यह पायथन 3 कोड एक पोर्टमिंटआउट को सत्यापित करेगा।

परीक्षण के मामलों

सभी सूचियां अनियंत्रित हैं; अर्थात्,

{"code", "ego", "golf"} -> "codegolf"
{"more", "elm", "maniac"} -> "morelmaniac" or "morelmorelmaniac" or "morelmorelmorelmaniac" or...
    Would a morelmaniac be some sort of mycologist?
{"ab", "bc", "cd", "de", "ef", "fg", "gh", "hi", "ij", "jk", "kl", "lm", "mn", "no", "op", "pq", "qr", "rs", "st", "tu", "uv", "vw", "wx", "xy", "yz", "za"} -> "abcdefghijklmnopqrstuvwxyza" or "rstuvwxyzabcdefghijklmnopqrstuvwxyzabcdef" or any 27+ letters in order

और क्यों नहीं? यदि आपका कोड उचित समय के भीतर निष्पादित होता है, तो मर्फी की साइट पर विशाल।

नियम

  • आपके कोड को रोकना होगा।
  • आपको प्रत्येक निष्पादन के साथ एक ही पोर्टमिंटआउट वापस करने की आवश्यकता नहीं है।
  • आप मान सकते हैं कि सभी तार केवल निचले अक्षरों aसे मिलकर बने होते हैं z
  • यदि कोई पोर्टमेन्टआउट संभव नहीं है, तो आपका प्रोग्राम कुछ भी कर सकता है। उदाहरण के लिए:{"most", "short", "lists"}
  • आई / ओ और खामियों के लिए मानक नियम लागू होते हैं।

यह , इसलिए प्रत्येक भाषा में सबसे छोटा समाधान (बाइट्स में) जीतता है! हैप्पी गोल्फिंग!



1
शायद कुछ परीक्षण मामलों?
अड्म

{"sic", "bar", "rabbits", "cradle"} -> "barabbitsicradle" {"mauve", "elated", "cast", "electric", "tame"} -> "mauvelectricastamelated"(अधिक परीक्षण के मामले)
सूंदर - मोनिका

2
हाँ, शायद एक टेस्टकेस जहाँ एक शब्द का दो बार उपयोग करने की आवश्यकता हो
ASCII-only

2
क्या हमें कभी १ अक्षर वाले शब्द मिलेंगे?

जवाबों:


3

पायथन 2 , 204 202 बाइट्स

def f(l,s=''):
 if all(w in s for w in l):return s
 for i,w in enumerate(l):
	a=next((s+w[i:]for i in range(len(w)-1,0,-1)if s[-i:]==w[:i]),0)if s else w;x=a and f(l[:i]+l[i+1:]+[l[i]],a)
	if x:return x

इसे ऑनलाइन आज़माएं!


बचाया

  • -2 बाइट्स, पुनरावर्ती के लिए धन्यवाद

2 बाइट्स को बचाने के लिए आप अंतिम दो लाइनों पर टैब का उपयोग कर सकते हैं।
पुनरावर्ती


यह सही आउटपुट नहीं देता है ["ab", "ba", "ca"]। मेरे समाधान में एक ही बग है।
पुनरावर्ती

1

पायथ, 39 बाइट्स

JQW}_1mxbdQ=+J|=b*qKOQ<=T+OP._KOJlKTY)b

इसे यहाँ आज़माएँ

व्याख्या

JQW}_1mxbdQ=+J|=b*qKOQ<=T+OP._KOJlKTY)b
JQ                                        Get a copy of the input.
  W}_1mxbdQ                          )    While there are words in the input
                                          that aren't in b (initially space)...
                   KOQ    OP._KOJ         ... get a random input word, a random
                                          prefix, and a random joined word...
                       =T+                ... stick them together...
                  q   <          lKT      ... and check if joining them together
                                          is valid...
               =b*                        ... then update b accordingly...
           =+J|                     Y     ... and stick the new word into J.
                                      b   Output the final result.

1

सन , 39 36 बाइट्स

ä▬│•.k=╠lƒ☺╜00║¿~,▓╕╠7ÉΔB<e┼>☼Θ²└ô┴\

इसे चलाएं और डीबग करें

लगभग एक सेकंड में सभी परीक्षण मामलों को निर्धारित करता है।

यह एक पुनरावर्ती एल्गोरिदम है।

  • उम्मीदवार के रूप में इनपुट के प्रत्येक शब्द से शुरू करें
  • प्रत्येक चरण में, शब्द को उम्मीदवार की सबस्ट्रिंग के रूप में होने वाली संख्या से क्रमबद्ध करें।
  • वर्तमान उम्मीदवार के अंत के साथ संगत प्रत्येक शब्द के लिए, एक नया उम्मीदवार बनाने के लिए शब्द से जुड़ें, और एक पुनरावर्ती कॉल करें।

यहाँ प्रोग्राम अनपैक्ड, अनगुल्फेड और कमेंट किया गया है।

FG              for each word in input, call target block
}               unbalanced closing brace represents call target
  x{[#o         sort input words by their number of occurrences in the current candidate
  Y             store it in register Y
  h[#{,}M       if all of the words occur at least once, pop from input stack
                input stack is empty, so this causes immediate termination,
                followed by implicitly printing the top of the main stack
  yF            for each word in register y, do the following
    [n|]_1T|[|& intersect the suffixes of the candidate with prefixes of the current word
    z]+h        get the first fragment in the intersection, or a blank array
    Y           store it in register Y
    %t+         join the candidate with the current word, eliminating the duplicate fragment
    y{G}M       if the fragment was non-blank, recursively call to the call target
    d           pop the top of stack

इसको चलाओ

संपादित करें: यह इनपुट के एक वर्ग के लिए विफल रहता है जिसमें एक लूप होता है, जैसे ["ab", "ba", "ca"], अन्य पोस्ट किए गए उत्तर में से अधिकांश।


0

जावास्क्रिप्ट (ईएस 6), 138 130 बाइट्स

f=a=>a[1]?a.map((c,i)=>a.map((w,j,[...b])=>i!=j&&!/0/.test(m=(c+0+w).split(/(.+)0\1/).join``)?t=f(b,b[i]=m,b.splice(j,1)):0))&&t:a

उन सूचियों के लिए एक त्रुटि देता है जो पूरी तरह से चित्रित नहीं की जा सकती हैं।

Ungolfed:

f = a =>
  a[1] ?                                        //if more than one element ...
    a.map((c, i)=>                              // for each element
      a.map((w, j, [...b])=>                    //  for each element
        i != j &&                               //   if not the same element
        !/0/.test(m=(c+0+w).split(/(.+)0\1/).join``) &&  //   and the elements overlap
        (t = f(b,                               //   and f recursed is true when
               b[i] = m,    //    replacing the ith element with the 2-element portmanteau
               b.splice(j, 1)                   //    and removing the jth element
              )
        )
      )
    ) &&
    t :                                         //return the recursed function value
    a                                           //else return a

कोड उत्कृष्ट है पूर्ण वर्णमाला उदाहरण (स्निपेट के ऊपर में है कि कारण के लिए नहीं शामिल है) पर धीमी गति से।

यह 2 बाइट्स के नुकसान के लिए mapएस को someएस में बदलकर किया जाता है :

f=a=>a[1]?a.some((c,i)=>a.((w,j,[...b])=>i!=j&&!/0/.test(m=(c+0+w).split(/(.+)0\1/).join``)?t=f(b,b[i]=m,b.splice(j,1)):0))&&t:a


1
लगता है मैंने गलती कर दी है। मैं उस व्यवहार को पुन: पेश नहीं कर सकता जिसे मैंने सोचा था कि मैंने कल देखा। मेरे भ्रम के लिए क्षमा करें और अपना समय बर्बाद कर रहे हैं। मैं इस विषय पर अपनी टिप्पणियों को हटा दूंगा, क्योंकि वे सभी गलत और भ्रामक हैं।
पुनरावर्ती
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.