चुनौती
आपकी चुनौती एक लिस्प जैसी भाषा के लिए दुभाषिया तैयार करना है, जो आगे से गढ़ा जाएगा: GLisp । GLisp के कार्यक्रम कोड में निम्न रूप में कोष्ठक द्वारा निरूपित नेस्टेड अभिव्यक्तियों की एक मनमानी राशि शामिल होगी:
(func arg1 arg2 ...)
ध्यान दें कि दुभाषिए को पहले और बाद में कोष्ठक, कार्यों और तर्कों के लिए बाहरी व्हाट्सएप वर्णों की अनुमति देनी चाहिए।
प्रकार
आप चार प्रकारों को लागू करेंगे, Integer, List, Boolean, और Function। पूर्णांक और बूलियन मान को स्पष्ट रूप से अपने स्वयं के सिंटैक्स के साथ स्रोत कोड में डाला जा सकता है। आपके दुभाषिया को यह मान लेना चाहिए कि संख्यात्मक वर्णों का एक भाग एक पूर्णांक को दर्शाता है (आपको नकारात्मक पूर्णांक डालने के लिए वाक्यविन्यास को लागू करने की आवश्यकता नहीं है)। आपके दुभाषिया को यह भी मानना चाहिए कि true
और false
बूलियन मान निर्दिष्ट हैं। कार्यों को उपयोगकर्ता द्वारा स्पष्ट रूप से परिभाषित नहीं किया जा सकता है, और हमेशा एक ही मूल्य (किसी भी लम्बाई की सूची की एक एकल मान के रूप में) लौटाएगा।
कार्य
निम्नलिखित कार्यों को लागू करने की आवश्यकता है, और प्रारूप फ़ंक्शन , एरीटी में हैं । यदि किसी Arity n
को एक धन चिह्न द्वारा आगे बढ़ाया जाता है, तो वह निरूपित करता है n
या अधिक तर्क देता है। आप मान सकते हैं कि किसी फ़ंक्शन के लिए दिए गए सभी तर्क एक ही प्रकार के हैं, जब तक कि अन्यथा निर्दिष्ट न हो। आप यह भी मान सकते हैं कि यदि कोई व्यवहार किसी प्रमाणित प्रकार के लिए निर्दिष्ट नहीं है, तो आप मान सकते हैं कि उस फ़ंक्शन का कोई तर्क कभी भी उस प्रकार का नहीं होगा। निम्नलिखित आरेख में तर्क को संदर्भित किया जाएगा:
(func argument1 argument2 ... argumentn)
+ , 2+
- यदि सभी तर्क पूर्णांक प्रकार के हैं , तो आपको तर्कों का योग वापस करना होगा
- यदि सभी तर्क प्रकार सूची के हैं , तो आपको आरोही क्रम में तर्कों का संघटन वापस करना होगा (
arg1+arg2+ ...
) - यदि सभी तर्क बूलियन प्रकार के हैं , तो आपको तर्क के अनुक्रम के तार्किक सभी को वापस करना होगा
(+ 1 2 3 4 5) -> 15
(+ (list 1 2) (list 3 4)) -> (list 1 2 3 4)
(+ true true true) -> true
- , 2+
- यदि सभी तर्क पूर्णांक प्रकार के हैं , तो आपको तर्कों के अंतर को वापस करना होगा (
arg1-arg2- ...
) - यदि सभी तर्क बुलियन के प्रकार के हैं , तो आपको तर्क के किसी भी अनुक्रम को तार्किक वापस करना होगा
(- 8 4 3) -> 1
(- 0 123) -> -123
(- true false false true false) -> true
- यदि सभी तर्क पूर्णांक प्रकार के हैं , तो आपको तर्कों के अंतर को वापस करना होगा (
* , 2+
- यदि सभी तर्क टाइपर के हैं , तो आपको तर्कों के उत्पाद को लौटाना होगा
- यदि एक तर्क प्रकार सूची का है और दूसरा प्रकार पूर्णांक का है (आप मान सकते हैं कि ये केवल दिए गए तर्क होंगे), आपको बार- बार मदों के साथ एक नई सूची वापस करनी होगी ।
arg1
arg2
(* 1 2 3 4 5) -> 120
(* (list 1 2 3) 2) -> (list 1 2 3 1 2 3)
/ , 2+
- यदि सभी तर्क पूर्णांक प्रकार के हैं , तो आपको तर्कों का भाग वापस करना होगा (
arg/arg2/ ...
) (आप मान सकते हैं कि विभाजन क्रमिक रूप से किया गया है, और यह कि हर चरण में दशमलव भाग छोटा है) - एक तर्क प्रकार का है, तो सूची और अन्य प्रकार की है समारोह , तो आप जिसके परिणामस्वरूप लौटना चाहिए सूची के बाद
arg2
हर मूल्य से अधिक मैप की गई है (/ 100 10 3) -> 3
(/ (list 1 2 3) inc) -> (list 2 3 4)
- यदि सभी तर्क पूर्णांक प्रकार के हैं , तो आपको तर्कों का भाग वापस करना होगा (
% , २
- यदि सभी तर्क पूर्णांक प्रकार के हैं , तो आपको तर्कों के मापांक को वापस करना होगा
(% 4 2) -> 0
= , 2+
- यदि सभी तर्कों के प्रकार और मूल्य दोनों समान हैं, तो आपको सही लौटना चाहिए। नहीं तो झूठा लौट आता है।
(= 0 0 0) -> true
(= 0 false (list)) -> false
सूची , 0+
- आपको सभी तर्कों की सूची वापस करनी होगी, चाहे वह किसी भी प्रकार का हो। यदि कोई तर्क नहीं दिया जाता है, तो आपको एक खाली सूची वापस करनी होगी
(list 3 4 (list 5)) -> (list 3 4 (list 5))
inc , १
- यदि तर्क पूर्णांक प्रकार का है , तो आपको एक एक करके बढ़ाए गए पूर्णांक को वापस करना होगा
- यदि तर्क प्रकार सूची का है , तो आपको सूची को एक बार में एक ही घुमाव पर घुमाया जाना चाहिए
(inc 1) -> 2
(inc (list 1 2 3)) -> (list 3 1 2)
dec , १
- यदि तर्क पूर्णांक प्रकार का है , तो आपको एक से घटे हुए पूर्णांक को वापस करना होगा
- यदि तर्क प्रकार सूची का है , तो आपको सूची को घुमाए हुए काउंटर-क्लॉकवाइज़ को एक ही घुमाव पर वापस करना होगा
(dec 1) -> 0
(dec (list 1 2 3)) -> (list 2 3 1)
यदि , ३
- यदि किसी भी प्रकार के तीन तर्क दिए गए हैं : यदि सत्य का मूल्य सत्य
arg1
हैarg2
, तो वापस लौटेंarg3
(if (not (list 1)) 8 false) -> false
- यदि किसी भी प्रकार के तीन तर्क दिए गए हैं : यदि सत्य का मूल्य सत्य
नहीं , १
- यदि किसी भी प्रकार का तर्क दिया जाता है, यदि सत्य का मूल्य
arg1
गलत है, तो वापसtrue
लौटेंfalse
। (not (list)) -> true
- यदि किसी भी प्रकार का तर्क दिया जाता है, यदि सत्य का मूल्य
लेन , १
- यदि टाइप सूची का तर्क दिया जाता है , तो लंबाई वापस कर दें
arg1
(len (list 4 2 true (list 3) (list))) -> 5
- यदि टाइप सूची का तर्क दिया जाता है , तो लंबाई वापस कर दें
सत्य तालिका:
0, (list), false -> false
जहां (list)
एक खाली सूची को दर्शाता है। बाकी सब कुछ है true
।
आपका दुभाषिया या तो एक पूर्ण प्रोग्राम हो सकता है जो स्टड या फ़ाइल से स्रोत इनपुट पढ़ता है, या एक फ़ंक्शन जो स्रोत को स्ट्रिंग के रूप में लेता है और आउटपुट मान देता है।
यदि पूर्व को चुनते हैं, तो इंटेगर के लिए आउटपुट बस संख्या है, बूलियंस के लिए true
या है false
, और सूचियों के लिए कोष्ठक में संलग्न मूल्यों का एक अलग-अलग अनुक्रम है (उदाहरण। (1 2 3 4 (5 6 7))
निरूपित (list 1 2 3 4 (list 5 6 7))
)।
यदि उत्तरार्द्ध का चयन करते हैं, तो मूल्य को कार्यान्वयन भाषा के संगत प्रकार में लौटाया जाना चाहिए, या, यदि कोई समान प्रकार मौजूद नहीं है, तो एक कस्टम प्रकार। सूचियाँ यदि भाषा एक नहीं है सरणी या वाहक के रूप में वापस किया जा सकता सूची प्रकार, Booleans भाषा में एक बूलियन जैसे, या यदि भाषा उन्हें समर्थन नहीं करता है एक कस्टम प्रकार के रूप में किया जाना चाहिये।
परीक्षण के मामलों
(list 1 2 3 (list 4 5 true)) -> (1 2 3 (4 5 true))
(/ 4000 (+ 1 2 3 4 (* 5 8))) -> 80
(+ (not (- (len (list 5 6 7)) (/ 10 3))) true) -> true
(if ( len (list ) ) 4 (if (+ (= 8 8 8) (not (list 4))) 8 5)) -> 5
स्पष्टीकरण
- आपका दुभाषिया आपके द्वारा चुने गए किसी भी तरीके से अमान्य इनपुट से निपट सकता है, लेकिन इसे अपवाद नहीं फेंकना चाहिए (हालांकि, यह एक त्रुटि संदेश प्रिंट कर सकता है और आसानी से बाहर निकल सकता है)
- कार्य हमेशा बाएं से दाएं तर्कों का मूल्यांकन करेंगे
- अमान्य इनपुट कोई भी इनपुट है, जो वाक्य रचना में गलत है। इसमें शामिल है, लेकिन बेमेल सीमाओं तक सीमित नहीं है, शून्य से विभाजन, और आंशिक रूप से लागू कार्य (जब तक कि बोनस के लिए नहीं जा रहा है)
- के लिए
=
, से कोई भी मान अलग हैं, तो या प्रकारों में से किसी अलग हैं, वापसीfalse
बोनस
- यदि आप आंशिक रूप से लागू किए गए कार्यों का समर्थन करते हैं, तो स्कोर * 0.8 । उदाहरण के लिए, के
((+ 2) 3)
रूप में ही होगा(+ 2 3)
, लेकिन इस तरह की चीजों के लिए अनुमति देता है(/ (list 1 2 3) (+ 2))
। आप मान सकते हैं कि किसी फ़ंक्शन को आंशिक रूप से लागू किया जाता है यदि वह अपने न्यूनतम तर्कों से कम प्राप्त करता है - स्कोर * 0.85 यदि आप लागू तर्कों का मूल्यांकन नहीं
if
करते हैं जब तक कि उन्हें वापस नहीं किया जाएगा
यह कोड-गोल्फ है, इसलिए सबसे कम बाइट गिनती जीत के साथ दुभाषिया है!
(+ 3 (if false 5))
? आम तौर पर बोल, "वास्तव में कुछ भी नहीं लौट रहा है" क्या है? आपने किसी भी प्रकार के यूनिट को फिर से निर्दिष्ट नहीं किया
(+ bool bool...)
तार्किक और (- bool bool...)
तार्किक है या? मानक रिंग नोटेशन +
OR और *
AND के लिए उपयोग करेगा । 2. क्या "अमान्य इनपुट" ऐसे मामलों को कवर करने का इरादा है, (/ 2 0)
जो वाक्य-रचना सही हैं? 3. =
यदि मान सभी समान नहीं हैं, तो क्या यह वापस आ जाना चाहिए false
? 4. not
प्रकट होने की परिभाषा पीछे की ओर है। 5. टोकन क्या हैं? आप कहते हैं कि दुभाषिया को अतिरिक्त व्हाट्सएप को संभालना होगा, लेकिन आप यह नहीं कहते कि यह किस व्हाट्सएप पर भरोसा कर सकता है। इस तरह के जटिल प्रश्नों के लिए, आपको वास्तव में सैंडबॉक्स का उपयोग करना चाहिए ताकि कल्पना की जा सके।
((+ 2 3) 4)
बराबर है 9
या नहीं? विशेष रूप से, var-arg फ़ंक्शन के लिए, यह स्पष्ट नहीं है कि किसी को आवेदन को आंशिक कैसे माना जाना चाहिए। यहां तक कि चीजों के साथ भी ((if true (+ 2 3) (- 5)) 4)
(if (not (array 1)) 8 false) -> false
?