दोतरफा पैलिंड्रोमिक क्लोजर जेनरेटर


24

परिचय

एक इनपुट स्ट्रिंग का एक पैलिंड्रोमिक बंद होना सबसे छोटा पैलिंड्रोम है जिसका निर्माण इनपुट स्ट्रिंग से किया जा सकता है, जहां अंतिम पैलेंड्रोम इनपुट स्ट्रिंग से शुरू होता है।

इस चुनौती के लिए, हम इस तरह के एक दो-तरफ़ा विखंडन को बंद करने पर विचार करेंगे

  • इनपुट स्ट्रिंग के साथ बाईं पलिंड्रोमिक क्लोजर संभव सबसे कम पैलिंड्रोम है जो इनपुट स्ट्रिंग से शुरू होता है।
  • एक इनपुट स्ट्रिंग का राइट पैलिंड्रोमिक क्लोजर सबसे कम संभव है जो इनपुट स्ट्रिंग के साथ समाप्त होता है।
  • इनपुट स्ट्रिंग के दो-तरफ़ा पलिंड्रोमिक क्लोज़िंग , इनपुट स्ट्रिंग के बाएँ या दाएँ पैलिंड्रोमिक क्लोज़र में से किसी एक से छोटा होता है।

कार्य

आपका कार्य सरल है। एक स्ट्रिंग (केवल मुद्रण योग्य ASCII, नई लाइनों और सफेद रिक्त स्थान) को देखते हुए, उस स्ट्रिंग के दो-तरफा पलिंडोमिक बंद होने का उत्पादन करता है। टाई के मामले में, बाएं या दाएं पलिंडोमिक क्लोजर में से कोई भी वैध आउटपुट है।

आप STDIN (या निकटतम विकल्प), कमांड-लाइन तर्क या फ़ंक्शन तर्क के माध्यम से इनपुट लेते हुए, एक प्रोग्राम या फ़ंक्शन लिख सकते हैं, और परिणाम को STDOUT (या निकटतम विकल्प) पर प्रिंट कर सकते हैं या इसे एक स्ट्रिंग के रूप में वापस कर सकते हैं।

आप मान सकते हैं कि इनपुट कभी भी रिक्त स्ट्रिंग नहीं होगी।

कुछ उदाहरण:

<Input>   -> <Output>
"abcdef"  -> "abcdefedcba"  (or "fedcbabcdef")
"abcba"   -> "abcba"
"abcb"    -> "abcba"
"cbca"    -> "acbca"

प्रारंभिक आइडिया का श्रेय VisualMelon को जाता है, मार्टिन और जर्बर्ग की मदद से अंतिम विचार

पैलिंड्रोमिक क्लोजर, लेफ्ट-पेलिंड्रोमिक क्लोजर और राईट-पेलिंड्रोमिक क्लोजर शब्द का उपयोग पहली बार इस पेपर द्वारा किया गया था


1
मैं एक
विचित्र

2
@ मैं एक बोनस के रूप में इसे जोड़ने के बारे में सोच रहा था, लेकिन मुझे पूरा यकीन है कि ज्यादातर जवाबों ने सिर्फ टिप्पणियों का इस्तेमाल किया होगा। यदि कुछ उत्तर वास्तव में एक पैलिंड्रोम हो सकते हैं, तो टिप्पणियों पर भरोसा किए बिना, मैं उस उत्तर के लिए एक इनाम छोड़ दूंगा!
ऑप्टिमाइज़र

जवाबों:


11

पायथ, २२ १ ९

hfq_TTsm,+z_d+_dzyz

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

व्याख्या

दो-तरफा पलिंडोमिक क्लोजर या तो फॉर्म का है AXया XA, Xइनपुट स्ट्रिंग कहां है और Aइसका एक विकल्प है X। मुझे वास्तव में X, एक रूप के लिए एक प्रत्यय होना चाहिए, एक रूप के लिए एक उपसर्ग, दूसरे रूप के लिए एक प्रत्यय। लेकिन मुझे इन डिफेल्स की परवाह नहीं है। एक सबस्ट्रिंग (सन्निहित या नहीं) यह सब मुझे पाइथ में चाहिए।

                        Implicit: z = raw_input() // Read a string
                 yz     A list with all substrings (contiguous or not) of z
       m                For each of these substrings d, build
        ,                  a pair of two strings:
         +z_d              ( z + inveres(d) ,
             +_dz            inverse(d) + z )
      s                 Sum (put all created pairs into a list)
 fq_TT                  filter elements T, where inverse(T) == T (Palindrom)
h                          Take the first element

संपादित करें

पुराने संस्करण ने लंबाई द्वारा फ़िल्टर करने के बाद स्ट्रिंग्स का आदेश दिया .olN...। बस एहसास हुआ, कि yलंबे समय से आदेश दिया substrings देता है। तो ये पलिंड्रोम पहले से ही छंटे हुए हैं।


6

क्लिप , ४०

(sl`f[a=ava}+m[i+v+ixx}Rlxm[i+xvu0ix}Rlx

उदाहरण

Documents>java -jar Clip4.jar palindrome.clip
abcb
abcba

व्याख्या

(sl`                                        .- The shortest                     -.
    f[a=ava}                                .- palindrome                       -.
            +                               .- among the following two sets:    -.
             m[i      }Rlx                  .- For each number up to length(x)  -.
                +                           .- combine                          -.
                 v+ix                       .- the last i chars of x, reversed  -.
                     x                      .- and x.                           -.
                          m[i       }Rlx    .- For each number up to length(x)  -.
                             +              .- combine                          -.
                              x             .- x and                            -.
                               vu0ix        .- the first i chars of x, reversed.-.

6

सीजेएम, 30 बाइट्स

क्या अब तक सीजेएम के उत्तर को देखने की उम्मीद की जा रही थी

q:Q,{)QW%/(Q+Q@+s}%{,}${_W%=}=

मैं वास्तव में उस {,}$ब्लॉक से नफरत करता हूं , लेकिन मुझे उस पीढ़ी के एल्गोरिथ्म के कारण संभावित palindromes की एक अनियंत्रित सूची मिलती है जिसका मैं उपयोग कर रहा हूं।

कोड स्पष्टीकरण

q:Q,{            }%             "Read the input string, store in Q, take length and";
                                "run the code block that many times";
     )QW%                       "Increment the iteration index and Put reversed Q on stack";
         /                      "Split reversed Q into parts of incremented iteration index";
          (Q+                   "Take out the first part and prepend it to Q";
             Q@+s               "Take the rest of the parts and append them to Q";
                   {,}$         "At this point, we have all possible prepended and appended";
                                "sequences of the input string. Sort them by length";
                       {_W%=}=  "Take the first sequence which is a palindrome";

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


6
मुझे वास्तव में उस {,}$ब्लॉक से भी नफरत है ! सिर्फ मजाक करते हुए, मुझे नहीं पता कि सीजेएम में क्या कुछ है।
एलेक्स ए।

4

अजगर 2, 115 113 109 105 96 बाइट्स

f=lambda x:[x for x in sum([[x[:~i:-1]+x,x+x[i::-1]]for i in range(len(x))],[])if x==x[::-1]][0]

उम्मीद है कि और नीचे गोल्फ कर सकते हैं। संभवतः नोट के योग्य बिट्स:

  • एक में दो सूची समझ के लिए राशि का उपयोग करना
  • मिनट की आवश्यकता से बचने के लिए सॉर्ट किए गए आदेश में शर्तों का निर्माण (@Jakube द्वारा सुझाया गया)

1
आइटम क्रमबद्ध क्रम में काफी नहीं हैं, इसलिए यह तार की तरह विफल रहता है a
Sp3000

4

गणितज्ञ, 96 बाइट्स

इस से अधिक सुंदर तरीका होना चाहिए ...

""<>#&@@SortBy[r=Reverse;#/.{b___,a__/;r@{a}=={a}}:>{b,r@{b,a}}&/@{r@#,#}&@Characters@#,Length]&

यह एक अनाम फ़ंक्शन को परिभाषित करता है जो एक स्ट्रिंग लेता है और परिणाम देता है।

मूल विचार है

  • में स्ट्रिंग विभाजित करें Characters
  • इस सूची और इसके रिवर्स के साथ एक सरणी बनाएं।
  • उनमें से प्रत्येक का सही तालमेल खोजने के लिए पैटर्न मिलान का उपयोग करें:

    {b___,a__/;r@{a}=={a}}:>{b,r@{b,a}}
    

    ध्यान दें कि यह वास्तव में एक फ्लैट सूची वापस नहीं करता है। जैसे {a,b,c}आप प्राप्त करेंगे

    {a,b,{c,b,a}}
    
  • लंबाई के आधार पर दो परिणामों को क्रमबद्ध करें।

  • छोटे को चुनें और इसे वापस स्ट्रिंग के साथ जोड़ दें ""<>#&@@

abacabaइनपुट होने पर यह आउटपुट करता है abac। सही जवाब है cabac। मुझे लगता है कि आपको लंबाई के अनुसार छँटाई करने से पहले उन्हें समतल करना चाहिए।
एलेफाल्फा

1
@alephalpha को एक बेहतर फिक्स मिला जिसे कोड आकार बदलने की आवश्यकता नहीं थी (और जो वास्तव में इसे छांटने के पीछे मेरा उद्देश्य नहीं था)।
मार्टिन एंडर

2

ब्रेकीलॉग (2), 6 बाइट्स, भाषा चुनौती देती है

~{↔?a}

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

हमेशा की तरह Brachylog के लिए, यह एक फंक्शन है, न कि पूरा प्रोग्राम।

व्याख्या

~{↔?a}
~{   }   Find a value that produces {the input} upon doing the following:
  ↔        reversing it;
   ?       asserting that we still have the same value;
    a      and taking either a prefix, or a suffix.

जहां तक ​​मुझे पता है (यह मेरी भाषा नहीं है, लेकिन इसकी संभावना कम लगती है), तो aइस चुनौती के लिए ब्राचीग्लॉग में नहीं जोड़ा गया था, लेकिन यह वास्तव में यहाँ काम आता है। हम "रिवर्स का उपयोग करते हैं, और यह नहीं बदला है" विधि को जोर देने के लिए कि हम जो मूल्य पाते हैं वह एक palindrome है।

यह सबसे छोटा तालमेल क्यों पैदा करता है , इसके लिए प्रोलॉग्स (और इसलिए ब्रेकीलॉग का) मूल्यांकन क्रम पहली चीज के मूल्यांकन से काफी प्रभावित है। इस मामले में, यह एक "रिवर्स" कमांड है, और (अधिकांश सूची संचालन की तरह) यह एक मूल्यांकन क्रम निर्धारित करता है जिसका उद्देश्य परिणामी सूची के आकार को कम करना है। जैसा कि आउटपुट के आकार के समान है, कार्यक्रम खुशी से समाप्त होता है संयोग से बिल्कुल सही चीज को न्यूनतम करना, जिसका अर्थ है कि मुझे किसी भी स्पष्ट संकेत को जोड़ने की आवश्यकता नहीं है।


a- इस चुनौती के लिए Adfix को नहीं जोड़ा गया था। मेरे पास उपसर्ग और प्रत्यय के लिए अच्छे वर्णसंकर के साथ कोई उपलब्ध प्रतीक नहीं था, इसलिए मैंने दोनों को उपसर्ग में विलय कर दिया जो जरूरत पड़ने पर ही उपसर्ग या प्रत्यय चुनने के लिए सदस्यता ले सकते हैं।
घातक

1

रूबी, 76 + 2 = 78

कमांड-लाइन फ्लैग के साथ -pl( lइनपुट कैसे कर रहे हैं, इसके आधार पर आपकी ज़रूरत नहीं हो सकती है), चलाएं

$_=[[$_,r=$_.reverse]*"\0",r+"\0#$_"].min_by{|s|s.sub!(/(.*)\0\1/){$1}.size}

एक स्ट्रिंग 'Abaa' को देखते हुए उत्पन्न तार 'cbca 0 acbc' और 'acbc 0 cbca' है, जहां 0 ascii कोड 0. यह तो सबसे लंबे समय तक बार-बार स्ट्रिंग तैयार की एक प्रति को हटा देता है के साथ गंदा चरित्र है 0 यह प्रत्येक में पाता है, पहले में 'ए' और दूसरे में 'सीबीसी', दो क्लोजर पाने के लिए। यह तब सबसे छोटा परिणाम उत्पन्न करता है।

गोल्फ कोड के बारे में वास्तव में केवल अजीब बात यह है कि यह जगह में तारों को छांटते समय छोटा कर देता है, जिसे हम दूर कर सकते हैं क्योंकि min_byकेवल एक बार प्रति तत्व की तुलना में ब्लॉक को निष्पादित करता है (दोनों क्योंकि यह एक श्वार्त्जियन रूपांतर है और क्योंकि केवल दो हैं तुलना करने के लिए तत्व)।


1

पायथन 3, 107 बाइट्स


f=lambda a:[i for i in[a[:i:-1]*j+a+a[-1-i::-1]*(1-j)for i in range(len(a))for j in(0,1)]if i==i[::-1]][-1]

परीक्षा करना:

>>> print("\n".join(map(f, ["abcdef", "abcba", "abcb", "cbca"])))
abcdefedcba
abcba
abcba
acbca

1

हास्केल, 107 बाइट्स

import Data.List
r=reverse
f s=snd$minimum[(length x,x)|x<-map(s++)(tails$r s)++map(++s)(inits$r s),x==r x]

परीक्षा:

*Main> mapM_ (putStrLn.f) ["abcdef", "abcba", "abcb", "cbca"]
abcdefedcba
abcba
abcba
acbca

1

जे, 66 62 बाइट्स

3 :'>({~[:(i.>./)(#%~[-:|.)@>),(<@([,|.@{.~)"#:i.@#"1)y,:|.y'

काफी निष्कपट। मेरे द्वारा उपयोग की जाने वाली दो तरकीबें:

दाएं पलिंडोमिक क्लोजर उल्टे हुए स्ट्रिंग के बाएं पैलिंड्रोमिक क्लोजर है।

अभिव्यक्ति की न्यूनतम (is_palindrome / लंबाई) के साथ न्यूनतम लंबाई और ताल के साथ स्ट्रिंग की लंबाई का पता लगाना।

   f=.3 :'>({~[:(i.>./)(#%~[-:|.)@>),(<@([,|.@{.~)"#:i.@#"1)y,:|.y'

   f 'lama'
lamal

इसे यहाँ ऑनलाइन आज़माएँ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.