स्विचिंग अनुक्रम


11

पहचान

स्विचिंग अनुक्रम को इस तरह परिभाषित किया गया है:

nएक सर्कल में खड़े लोगों के साथ शुरू करें ( 6इस उदाहरण के लिए)।

 1  2
6    3
 5  4

व्यक्ति से शुरू होकर 1, वह व्यक्ति जो "चुने हुए" व्यक्ति के बाईं ओर है उसे हटा दिया जाता है।

 1
6    3
 5  4

हटाया गया व्यक्ति निष्कासन विधि को "स्विच" कर सकता है:

  • यदि हटाया गया व्यक्ति सम है (जो इस मामले में है), तो अगला हटाया गया व्यक्ति अगले "चुने हुए" व्यक्ति के दाईं ओर होगा।
  • यदि हटाया गया व्यक्ति विषम है, तो अगला हटाया गया व्यक्ति अगले "चुने हुए" व्यक्ति के बाईं ओर होगा।

अगला चुना गया व्यक्ति पहले हटाए गए व्यक्ति पर भी निर्भर है।

  • यदि हटाया गया व्यक्ति समान है, तो अगला चुना गया व्यक्ति पिछले चुने हुए व्यक्ति के अधिकार में होगा।
  • यदि हटाया गया व्यक्ति विषम है, तो ऊपर देखें, लेकिन "दाएं" को "बाएं" से बदलें।

तो अगले चुने हुए व्यक्ति तो है 6

अब हम उस व्यक्ति के दाईं ओर हटाते हैं 6, जो है 5:

 1
6    3
    4

क्योंकि 5विषम है, हटा दिया गया व्यक्ति अब बाईं ओर है। नया चुना हुआ व्यक्ति है 1

अब हम हटा देते हैं 3:

 1
6
    4

हम इस प्रक्रिया को जारी रखते हैं, जब तक कि हम 1 नंबर के साथ नहीं रहते - इस उदाहरण में, अंतिम संख्या है 1। तो इसलिए S(6) = 1

पहले कुछ नंबर हैं:

 n | S(n)
---------
 1 | 1
 2 | 1
 3 | 3
 4 | 1
 5 | 5
 6 | 1
 7 | 3
 8 | 6
 9 | 5
10 | 6
11 | 9

कार्य

आपका कार्य एक प्रोग्राम (या एक फ़ंक्शन) बनाना है जो कम से कम बाइट्स का उपयोग करके दिए गए S(n)( nस्विचिंग अनुक्रम में वें नंबर ) देता है n

उदाहरण इनपुट और आउटपुट:

1  -> 1
10 -> 6
13 -> 13

आपको सकारात्मक पूर्णांक प्राप्त करने की गारंटी है।

यह , इसलिए बाइट्स जीत में सबसे छोटा कोड है!

नोट: आपको खोज की परेशानी से बचाने के लिए कोई OEIS अनुक्रम (क्या?) नहीं है।


7
लोगों को खोज को बचाने के लिए, ओईस पर कोई हिट नहीं।
xnor

जाहिर है 2कभी नहीं रहता है, लेकिन करता है 7?
जोनाथन एलन

1
@JonathanAllan I ने केवल पहले 1000 शब्दों के लिए जाँच की, और परिणाम वर्तमान में "नहीं" है। मुझे यकीन नहीं है कि - क्या मुझे इसे "साइड चैलेंज" के रूप में रखना चाहिए जो लोग साबित करने का प्रयास कर सकते हैं या कुछ और? यह ब्राउनी पॉइंट्स के लिए है, इसलिए यह चुनौती से अलग नहीं होता है।
6

हो सकता है एक बार आपके निर्देशों का पालन करने के अलावा कोई अन्य विधि के साथ आने पर यह स्पष्ट हो जाए ...
जोनाथन एलन

3
आप कैसे उम्मीद करते हैं कि लोग इसे बिना OEIS के हल कर सकते हैं? किसी को OEIS धक्का, कृपया?
आउटगॉल्फ

जवाबों:


4

पायथन 2, 183 94 बाइट्स

-4 Artyer करने के लिए धन्यवाद बाइट्स (उपयोग input()और printके बजाय defऔर return)
(उपयोग FlipTack -1 बाइट धन्यवाद print-~p[0]के बजाय print p[0]+1)

p=range(input())
d=i=1
while p[1:]:m=p.pop(i)%2;i-=m+m-(d<0);d=-m|1;i+=d;i%=len(p)
print-~p[0]

repl.it

यह सिर्फ दिए गए निर्देशों का पालन करता है, मैंने कुछ पैटर्न पर ध्यान दिया है, शायद इसका फायदा उठाया जा सकता है?

केवल परिवर्तन हैं:

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

Ungolfed:

def circle(n):
    people = range(n) # p
    direction = 1 # d
    removeIndex = 1 # i
    while n > 1:
        removingMod2 = people.pop(removeIndex) % 2 # m
        removeIndex -= removingMod2 + removingMod2 - (direction == -1)
        direction = -removingMod2 or 1
        removeIndex += direction
        n -= 1
        removeIndex %= n
    return people[0] + 1

क्या अंतिम पंक्ति हो सकती है print-~p[0]?
फ्लिपकार्ट

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