बाइनरी स्ट्रिंग को आधा-उल्टा करें


12

यह मेरा करने के लिए एक अनुवर्ती सवाल यह है कि Puzzling.SE प्रश्न : मैंने पूछा कि एक समारोह हो, तो बूलियन तार करने के लिए बूलियन तार मानचित्रण, ताकि च (च (ख)) = रिवर्स (ख) सभी इनपुट स्ट्रिंग्स के लिए । ( रिवर्स द्वारा , मेरा मतलब है कि फ़ंक्शन जो बिट्स के क्रम को उलट देता है।)

उपर्युक्त लिंक में एक सकारात्मक उत्तर है, सबूत के साथ, महान f '' , लेकिन आप अपने लिए प्रश्न देखने से पहले विचार करना चाहते हैं।

इस तरह के एक समारोह को संभव के रूप में कुछ बाइट्स में लागू करें।

  • आप या तो STDIN से इनपुट पढ़ सकते हैं, या फ़ंक्शन तर्क ले सकते हैं; और या तो परिणाम स्ट्रिंग को STDOUT में लिखें, या इसे वापस करें।

  • किसी भी तरह से, आप दो अलग बाइट्स या अपनी पसंद के पात्रों की वास्तविक तार (कहते हैं कि साथ काम कर सकते 0हैं और 1, या \x00और \x01), या सरणियों के साथ / की सूची truthy और falsy मूल्यों । दो मान उठाओ और उन लोगों के साथ रहो, यद्यपि।

  • के एक भी आवेदन का परिणाम बाइनरी स्ट्रिंग ही होना चाहिए: जैसे मूर्खतापूर्ण जवाब नहीं b -> if b starts with 'x' then reverse(b[1:]) else 'x' + b...

  • आपका कार्य कुल होना चाहिए ; विशेष रूप से, इनपुट खाली स्ट्रिंग हो सकता है, या एक बिट लंबा हो सकता है, आदि स्ट्रिंग की लंबाई के लिए कोई ऊपरी बाध्य नहीं है।

  • यह भी शुद्ध होना चाहिए : फ़ंक्शन कॉल के बीच कोई वैश्विक स्थिति न रखें; इनपुट स्ट्रिंग को आउटपुट स्ट्रिंग को पूरी तरह से निर्धारित करना चाहिए।


क्या आउटपुट में इनपुट से अलग लंबाई हो सकती है?
लुइस मेन्डो

ज़रूर! (वास्तव में, अन्यथा, चुनौती काफी असंभव है।)
लिन

क्या इसे लंबाई एक या शून्य के तारों के लिए काम करना है?
कैलकुलेटरफाइनल

हाँ; फ़ंक्शन को कुल होना चाहिए। मैंने इस प्रश्न में स्पष्ट किया है!
लिन

जवाबों:



7

पायथन 2, 64 69 बाइट्स

def f(s):p=(s+s).find(s,1);return[s[~p::-1],s+s[:p]][len(s)/p%2]

Ungolfed:

def f(s):
    p = (s+s).find(s,1)
    n = len(s)/p
    return s[:p][::1|n%-2] * -~(n-1^1)

यह स्ट्रिंग की अवधि का पता लगाता है, यानी न्यूनतम pऐसा जो बार- बार sलंबाई का एक तार है (मुझे एसओ पर एक गोल्फ विधि मिली )। फिर अगर यह विषम है, तो यह अवधि के एक और पुनरावृत्ति को जोड़ता है। यदि है, तो भी यह अवधि के एक दोहराने को हटा देता है और इसे उलट देता है।pnnn

1 <-> 2, 3 <-> 4, आदि के बीच फंक्शन मैपिंग को लागू करने में मदद करने के लिए @ Sp3000 का धन्यवाद।


... अनलग कोड कब अपडेट किया जाएगा?
कैलक्यूलेटरफैनलाइन

@CatsAreFluffy मेरी कोई योजना नहीं है क्योंकि यह केवल एक मामूली अंतर के साथ एक ही विचार का उपयोग करता है। दूसरी ओर अंग्रेजी अप-टू-डेट है।
feersum

2

पर्ल, 49 47 बाइट्स

के लिए +2 शामिल है -lp

@ Feersum की बहुत अच्छी एल्गोरिथ्म पर आधारित है

STDIN पर इनपुट के साथ चलाएं, जैसे

perl -lp halfreverse.pl <<< "101001"

halfreverse.pl:

/^(.+?)((\1\1?)*)$/;$_=$3eq$1?reverse$2:$_.$1

व्याख्या

/^               $/         Match the complete input string
  (.+?)                     Non-greedy match. Try only one digit at the start,
                            if that doesn't work try 2, then 3 etc. The string
                            being tried is remembered in backreference \1
       ((\1\1?)*)           Try to repeat \1 as many times as possible but
                            prefer in groups of 2. Fall back to only 1 at the
                            end of the string if the trailing part has an odd
                            number of \1 (so the total count is even)

   $3eq$1                   So the last match $3 equals the first match $1
         ?                  if and only if the total count is even
          reverse$2         If total count is even drop the first instance of
                   :        \1 and reverse
                    $_.$1   If total count is odd extend $_ by one instance
$_=                         Assign result

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