परिचय: संयुक्त तर्क
Combinatory तर्क (सीएल) बातें बुलाया पर ही आधारित होता combinators , जो मूल रूप से कार्य हैं। दो बुनियादी "अंतर्निहित" कॉम्बिनेटर हैं, Sऔर K, जिन्हें बाद में समझाया जाएगा।
वाम संबद्धता
सीएल वाम-साहचर्य है , जिसका अर्थ है कि कोष्ठक (सामान युक्त), जो दूर के कोष्ठक के कोष्ठक के जोड़े से युक्त हैं, जिसे हटाया जा सकता है, इसके सामान के साथ। उदाहरण के लिए, कुछ इस तरह:
((a b) c)
तक घटाया जा सकता है
(a b c)
जहां (a b)बड़ी कोष्ठक के दूर-बाएं पर है ((a b) c), इसलिए इसे हटाया जा सकता है।
वाम-संघ का एक बड़ा उदाहरण (वर्ग कोष्ठक स्पष्टीकरण हैं):
((a b) c ((d e) f (((g h) i) j)))
= (a b c ((d e) f (((g h) i) j))) [((a b) c...) = (a b c...)]
= (a b c (d e f (((g h) i) j))) [((d e) f...) = (d e f...)]
= (a b c (d e f ((g h i) j))) [((g h) i) = (g h i)]
= (a b c (d e f (g h i j))) [((g h i) j) = (g h i j)]
एक ही वस्तु के चारों ओर एक से अधिक जोड़ी लपेटने पर भी ब्रैकेट कम हो सकते हैं। उदाहरण:
((((a)))) -> a
a ((((b)))) -> a b
a (((b c))) -> a (b c) [(b c) is still a group, and therefore need brackets.
Note that this doesn't reduce to `a b c`, because
`(b c)` is not on the left.]
Builtins
सीएल में दो "अंतर्निहित" कॉम्बिनेटर हैं, Sऔर K, जो ऑब्जेक्ट्स को स्विच कर सकते हैं (एकल कॉम्बीनेटर, या कॉम्बिनेटरों के समूह / कोष्ठक के चारों ओर लिपटे) जैसे चारों ओर:
K x y = x
S x y z = x z (y z)
कहाँ x, yऔर zकिसी भी चीज़ के लिए स्टैंड-इन्स हो सकता है।
एक उदाहरण Sऔर Kइस प्रकार हैं:
(S K K) x [x is a stand-in for anything]
= S K K x [left-associativity]
= K x (K x) [S combinator]
= x [K combinator]
एक और उदाहरण:
S a b c d
= a c (b c) d [combinators only work on the n objects to the right of it,
where n is the number of "arguments" n is defined to have -
S takes 3 arguments, so it only works on 3 terms]
उपरोक्त सामान्य सीएल बयानों के उदाहरण हैं, जहां बयान का मूल्यांकन आगे नहीं किया जा सकता है और समय की एक सीमित मात्रा में अंतिम परिणाम प्राप्त करता है। गैर-सामान्य कथन हैं (जो सीएल बयान हैं जो समाप्त नहीं होते हैं और हमेशा के लिए मूल्यांकन किए जाते रहेंगे), लेकिन वे चुनौती के दायरे में नहीं हैं और उन्हें कवर करने की आवश्यकता नहीं होगी।
यदि आप सीएल के बारे में अधिक जानना चाहते हैं, तो इस विकिपीडिया पृष्ठ को पढ़ें ।
कार्य:
आपका काम अतिरिक्त कॉम्बिनेटर बनाना है, जो तर्कों की संख्या को देखते हुए, और इसे इनपुट के रूप में मूल्यांकन करता है, जो इस प्रकार है:
{amount_of_args} = {evaluated}
जहां {amount_of_args}एक धनात्मक पूर्णांक आर्ग की संख्या के बराबर होता है, और {evaluated}इसमें शामिल होते हैं:
- तर्क की राशि तक
1तर्क, पहला तर्क2होने के साथ, दूसरा, वगैरह।- आपको इस बात की गारंटी है कि आर्ग की मात्रा के ऊपर तर्क संख्या (इसलिए
4जब{amount_of_args}केवल होती है3) दिखाई नहीं देगी{evaluated}।
- आपको इस बात की गारंटी है कि आर्ग की मात्रा के ऊपर तर्क संख्या (इसलिए
- कोष्ठक
()
इनपुट्स के उदाहरण इस प्रकार हैं:
3 = 2 3 1
4 = 1 (2 (3 4))
पहला इनपुट एक कॉम्बिनेटर (कहना R) के लिए तीन तर्कों ( R 1 2 3) के साथ पूछ रहा है , जो तब मूल्यांकन करता है:
R 1 2 3 -> 2 3 1
दूसरा इनपुट इसके लिए (एक संयोजन नाम के साथ A) पूछता है :
A 1 2 3 4 -> 1 (2 (3 4))
इस प्रारूप में इनपुट को देखते हुए, आपको एक स्ट्रिंग वापस करना होगा S, Kऔर (), जब एक संयोजन नाम के साथ प्रतिस्थापित किया जाता है और तर्कों के साथ चलाया जाता है, उसी मूल्यांकन किए गए विवरण को {evaluated}ब्लॉक के रूप में लौटाता है जब कमांड ब्लॉक को उस संयोजन नाम से प्रतिस्थापित किया जाता है।
आउटपुट कॉम्बिनेटर स्टेटमेंट में उसके व्हाट्सएप को हटा दिया जा सकता है और बाहरी ब्रैकेट्स को हटा दिया (S K K (S S))जा सकता है, इसलिए कुछ को चालू किया जा सकता है SKK(SS)।
यदि आप अपने कार्यक्रम के आउटपुट का परीक्षण करना चाहते हैं, तो @aditsu एक combinatory तर्क पार्सर बना दिया है (जो भी शामिल है S, K, Iऔर यहां तक कि अन्य लोगों की तरह Bऔर C) यहाँ ।
स्कोर:
चूंकि यह एक मेटाफॉल्फ है , इस चुनौती का उद्देश्य इन 50 परीक्षण-मामलों को देखते हुए, आउटपुट में सबसे कम मात्रा में बाइट प्राप्त करना है । कृपया उत्तर में 50 परीक्षण-मामलों के लिए अपने परिणाम डालें, या एक पास्टबिन (या कुछ इसी तरह) बनाएं और उस पास्टबिन का लिंक पोस्ट करें।
एक टाई की स्थिति में, सबसे पहले समाधान जीतता है।
नियम:
- आपके उत्तर को आवश्यक आउटपुट वापस करना चाहिए - इसलिए एक इनपुट दिया गया है, इसे कार्य में परिभाषा के अनुसार सही आउटपुट वापस करना होगा।
- आपके उत्तर को प्रत्येक परीक्षण मामले के लिए एक आधुनिक लैपटॉप पर एक घंटे के भीतर आउटपुट करना होगा।
- समाधानों का कोई भी हार्ड-कोडिंग अस्वीकृत है। हालांकि, आपको 10 कॉम्बिनेटर तक हार्ड-कोड की अनुमति है।
- आपके प्रोग्राम को एक ही इनपुट के लिए हर बार एक ही समाधान वापस करना होगा।
- आपके प्रोग्राम को दिए गए किसी भी इनपुट के लिए एक वैध परिणाम लौटना चाहिए, न कि केवल टेस्ट-केस।
1, तो आप 1सब कुछ से घटा सकते हैं, और फिर उस उत्तर के लिए समाधान लपेट सकते हैं K()। उदाहरण: के लिए समाधान 2 -> 1है K, इसलिए के लिए समाधान 3 -> 2है KK, के लिए समाधान 4 -> 3है K(KK)आदि