शून्य घोषित करें


25

एक शून्य सूची एक सूची है जिसमें किसी भी स्तर पर कोई गैर-सूची ऑब्जेक्ट शामिल नहीं है। या यदि आप एक पुनरावर्ती परिभाषा पसंद करते हैं

  • खाली सूची शून्य है

  • केवल अन्य शून्य सूची वाली सूची शून्य है

सभी शून्य सूचियों की परिमित गहराई है।

यहां शून्य सूचियों के कुछ उदाहरण दिए गए हैं (अजगर सिंटैक्स का उपयोग करके):

[]
[[]]
[[],[]]
[[[]]]
[[[]],[]]
[[],[[]]]

यहां कुछ चीजों के उदाहरण दिए गए हैं जो शून्य सूची नहीं हैं :

["a"]
[[...]]
[1]
2
[[],([],[])]

कार्य

दो अलग-अलग फ़ंक्शन (या यदि आप चाहें तो प्रोग्राम) लिखें। एक सकारात्मक पूर्णांक लेना चाहिए (यदि आप चाहें तो शून्य भी शामिल कर सकते हैं) एक तर्क के रूप में और एक शून्य सूची लौटाएं, दूसरे को शून्य सूची लेनी चाहिए और इसे पूर्णांक वापस करना चाहिए। इन दो कार्यों को हमेशा एक दूसरे के विपरीत होना चाहिए। यही कारण है कि अगर आप के उत्पादन में पारित है fमें gआप की मूल इनपुट मिलना चाहिए fके परिणाम के रूप g। इसका मतलब है कि मानचित्रण 1: 1 होना चाहिए, अर्थात प्रत्येक पूर्णांक के लिए, केवल एक शून्य सूची मौजूद हो सकती है जिसके लिए gवह पूर्णांक देता है और प्रत्येक शून्य सूची के लिए एक पूर्णांक होना चाहिए, जिसके लिए fवह शून्य सूची देता है।

आप अनिवार्य रूप से एक आपत्ति बना रहे हैं

आप अपनी भाषाओं के मूल सूची प्रकार के बजाय एक शून्य सूची (कॉमा और रिक्त स्थान के साथ या बिना) के स्ट्रिंग प्रतिनिधित्व का उपयोग करना चुन सकते हैं।

स्कोरिंग

आपका स्कोर एक साथ आपके दो कार्यों की लंबाई होगी। यह इसलिए आपको इस राशि को कम से कम करना चाहिए।



1
यह प्रश्न दो कार्यों के लिए पूछता है जबकि डुप्लिकेट केवल पहले छमाही के लिए पूछता है।
इयान मिलर

3
चूहे। मैंने लगभग सबसे अच्छा जवाब पोस्ट किया है जो मैंने अभी तक लिखा था, और यह अन्य चुनौती के लिए योग्य नहीं है।
कालेब क्लेवेटर

2
@IanMiller मैं यह कहना चाहूंगा कि दूसरी चुनौती में एन्कोडिंग के लिए अलग-अलग दिशा-निर्देश हैं।
कालेब क्लेवेटर

1
शायद यह इस सवाल के लिए सिर्फ डिकोडर होने के लिए अधिक समझ में आता है? क्योंकि एनकोडर के बारे में पहले से ही एक सवाल है।

जवाबों:


7

पायथ, 27 + 29 = 56 बाइट्स

f:

L?bol`NS{sm[d+d]Y]d)ytb]Y@y

परीक्षण सूट

g:

L?bol`NS{sm[d+d]Y]d)ytb]Yxyl`

परीक्षण सूट

यह प्रणाली बहुत सरल है: मैं सभी संभावित सूचियों को एक निश्चित संख्या से अधिक नहीं के साथ उत्पन्न करता हूं [। फिर, मैं उन्हें इस तरह से सॉर्ट करता हूं कि जो सूची मैंने अभी तक नहीं बनाई है वह अंत के पास होगी। यह सभी कार्य y, दोनों कार्यक्रमों में समान है। के रूप में लिखा है

L?bol`NS{sm[d+d]Y]d)ytb]Y

फिर, मैं इस सूची में इसके लिए सूची बनाता हूं f, और इसके लिए खोज करता हूं g

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

कार्यक्रम एक विकल्प के रूप में 0 / वापसी की अनुमति देते हैं।


5

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

इसे ऑनलाइन आज़माएं! जीव परीक्षण करने के लिए।

f=lambda l:len(l)and f(l[0])*2+1<<f(l[1:])

गैर-नकारात्मक पूर्णांक में शून्य सूची बनाता है। 42 बाइट्स।

g=lambda n:n*[g]and[g(n/(n&-n)/2)]+g(len(bin(n&-n))-3)

गैर-नकारात्मक पूर्णांकों को सूचियों को शून्य में ले जाता है। 54 बाइट्स। अधिक पुनरावर्ती प्रयास ने एक ही लंबाई दी।

g=lambda n,i=0:n*[g]and[g(n/2,i+1),[g(n/2)]+g(i)][n%2]

1

जावा 7, 725 बाइट्स

f(int)( 325 बाइट्स ):

String f(int i){String s="";for(int j=0,e=0;e<i;e+=v(s))s=Integer.toBinaryString(j++);return"["+s.replace("1","[").replace("0","]")+"]";}int v(String s){for(;!s.isEmpty();s=s.replaceFirst("1","").replaceFirst("0",""))if(s.replace("1","").length()!=s.replace("0","").length()|s.charAt(0)<49|s.endsWith("1"))return 0;return 1;}

g(String)( 75 + 325 बाइट्स ):

int g(String s){int r=0;for(String i="10";!i.equals(s);i=f(++r));return r;}

चूंकि विधि gपद्धति fकी गणना करने के लिए विधि का उपयोग करती है, यह संभव शून्य-सूची पर लूपिंग द्वारा परिणामित होता है जब तक कि यह एक इनपुट के बराबर नहीं मिलता है, बाइट्स को fदो बार गिना जाता है (चूंकि दोनों तरीके इस चुनौती के लिए दूसरे के बिना चलने में सक्षम होना चाहिए)।

स्पष्टीकरण:

सामान्य तौर पर, विधि fकेवल पूर्णांक के सभी बाइनरी स्ट्रिंग-अभ्यावेदन पर लूप करती है, और हर बार एक वैध मिलने पर एक काउंटर बढ़ाती है। इस चुनौती के लिए मान्य बाइनरी-स्ट्रिंग्स निम्नलिखित नियमों का पालन करते हैं: वे ए से शुरू करते हैं 1, और ए के साथ समाप्त होते हैं0 ; उनके पास 1s और 0s की समान संख्या है; और हर बार जब आप पहली हटाने 1और 0और मान्य क्या फिर से छोड़ दिया है, इन दो नियम अब भी लागू होते हैं। काउंटर इनपुट के बराबर होने के बाद, यह सभी के 1साथ [और सभी के 0साथ बदलकर, बाइनरी-स्ट्रिंग को स्ट्रिंग शून्य-सूची में कनवर्ट करता है ]

विधि के रूप में g: हम साथ शुरू करते हैं"[]" (शून्य-सूची का प्रतिनिधित्व करते हुए 0) के करते हैं , और तब fपूर्णांक को बढ़ाते समय विधि का उपयोग करना जारी रखते हैं , जब तक कि यह इनपुट-स्ट्रिंग से मेल नहीं खाता।

String f(int i){         // Method `f` with integer parameter and String return-type
  String s="";           //  Start with an empty String
  for(int j=0,e=0;e<i;   //  Loop as long as `e` does not equal the input
      e+=v(s))           //    And append increase integer `e` if String `s` is valid
    s=Integer.toBinaryString(j++);
                         //   Change `s` to the next byte-String of integer `j`
                         //  End of loop (implicit / single-line body)
  return"["+             //  Return the result String encapsulated in "[" and "]"
    s.replace("1","[").replace("0","]")+"]";
                         //  after we've replaced all 1s with "[" and all 0s with "]"
}                        // End of method `f`

int v(String s){         // Separate method with String parameter and integer return-type
  for(;!s.isEmpty();     //  Loop as long as String `s` isn't empty
      s=s.replaceFirst("1","").replaceFirst("0",""))
                         //    After each iteration: Remove the first "1" and "0"
    if(s.replace("1","").length()!=s.replace("0","").length()
                         //   If there isn't an equal amount of 1s and 0s
       |s.charAt(0)<49   //   or the String doesn't start with a 1
       |s.endsWith("1")) //   or the String doesn't end with a 0
      return 0;          //    Return 0 (String is not valid)
                         //  End of loop (implicit / single-line body)
  return 1;              //  Return 1 (String is valid)
}                        // End of separate method

int g(String s){         // Method `g` with String parameter and integer return-type
  int r=0;               // Result integer
  for(String i="[]";!i.equals(s);
                         //  Loop as long as `i` does not equal the input String
      i=f(++r));         //   After each iteration: Set `i` to the next String in line
  return r;              //  Return the result integer
}                        // End of method `g`

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

इसे यहाँ आज़माएँ। (नोट: यह पिछले कुछ परीक्षण मामलों के लिए बहुत धीमा है। इन सभी के लिए लगभग 10-15 सेकंड लगेंगे।)

0   <-> []
1   <-> [[]]
2   <-> [[][]]
3   <-> [[[]]]
4   <-> [[][][]]
5   <-> [[][[]]]
6   <-> [[[]][]]
7   <-> [[[][]]]
8   <-> [[[[]]]]
9   <-> [[][][][]]
10  <-> [[][][[]]]
11  <-> [[][[]][]]
12  <-> [[][[][]]]
13  <-> [[][[[]]]]
14  <-> [[[]][][]]
50  <-> [[[][[[]]]]]
383 <-> [[[][]][[[][]]]]

1
मुझे नहीं लगता कि [][]यह एक सूची है। शायद मुझे गलतफहमी हो रही है कि जावा जो कुछ भी करता है। [...]उन सभी के चारों ओर जोड़ना और 0 मानचित्र को []चाल करना चाहिए।
गेहूं जादूगर

@HeatWizard आह, अच्छी कॉल। इसे ठीक करने का प्रयास करेंगे। मैं वैसे भी अभी तक पर्याप्त बाइट्स नहीं था। ; पी
केविन क्रूज़सेन

@WheatWizard ठीक है, इसे अब ठीक किया जाना चाहिए। कठिन लेकिन मजेदार चुनौती btw। मुझे यह समझने में कुछ समय लगा कि आपका क्या मतलब है, और यहां तक ​​कि इस उत्तर को लिखने के लिए लंबे समय तक, लेकिन यह मजेदार था। :)
केविन क्रूज़सेन



0

पायथन 3 - साइन / एब्स, 73 बाइट्स

f=lambda n:[[[]]*(n<0),[[]]*abs(n)]
g=lambda l:[-1,1][not l[0]]*len(l[1])

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

सीधे आगे कार्यान्वयन, नकारात्मक संख्याओं का समर्थन करता है।

इंटीजर iको एन्कोड किया गया है [sign(i), abs(i)], जहां sign(i)=[] if i > 0 else [[]]और abs(i)=[[]] * i, यानी लंबाई सूची के साथ खाली सूची की सूची (i)।

अजगर ३ - बाइनरी, 126 बाइट्स

यह एक अधिक विस्तृत संस्करण है (और बहुत लंबा ...), जहां पूर्ण मान द्विआधारी सूची प्रतिनिधित्व में एन्कोडेड है।

f=lambda n:[[[]]*(n<0),[[[]]*int(i)for i in f"{n:+b}"[1:]]]
g=lambda l:[-1,1][not l[0]]*int(''.join(map(str,map(len,l[1]))),2)

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


1
अधिक जटिल शून्य सूचियों के लिए काम नहीं करता है: इसे ऑनलाइन आज़माएं!
जितेश

आह, मैं किसी भी तरह से चूक गया, कि हर शून्य सूची के लिए एक मानचित्रण होना चाहिए ... आप सही हैं।
चलित

0

स्टैक्स , 33 कुल बाइट्स

ये कार्यक्रम एक-दूसरे के व्युत्क्रम हैं। वे सभी शून्य सूचियों और सभी गैर-नकारात्मक पूर्णांकों में परिवर्तित होते हैं, जिसमें 0. शामिल है। ऐसा लगता है कि यह शायद किसी प्रकार के बीजगणित का एक प्रसिद्ध कार्य है जो मुझे नहीं पता है। इसके चारों ओर अपने सिर को लपेटने के लिए, मैंने पहले कार्यक्रमों को अजगर के कार्यों के रूप में लागू किया।

def convert_to_void(n):
    lst = []
    while n > 0:
        n -= 1
        choices = len(lst) + 1
        choice = n % choices
        cutpoint = len(lst) - choice
        n //= choices
        newgroup = lst[cutpoint:]
        del lst[cutpoint:]
        lst.append(newgroup)
    return lst

def convert_from_void(lst):
    n = 0
    while lst != []:
        newgroup = lst.pop()
        n *= len(lst) + len(newgroup) + 1
        n += len(newgroup) + 1
        lst.extend(newgroup)
    return n

स्टैक्स कार्यक्रमों का व्यवहार समान होता है।

गैर-नकारात्मक पूर्णांक → शून्य सूची, 15 बाइट्स

ƒâ₧~└3BI─¿-rÅ;ì

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

शून्य सूची → गैर-नकारात्मक पूर्णांक, 18 बाइट्स

Çäê[!σ`c↑Ö§░NR╥ç=Æ

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

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