Stackylogic एक प्रोग्रामिंग भाषा है जिसे मैंने पिछली चुनौती में बनाया था: Run Stackylogic । पूरी जानकारी और उदाहरण के लिए उस पोस्ट को पढ़ें, लेकिन यहां बताया गया है कि यह कैसे काम करता है:
Stackylogic इनपुट के लिए लेता है
0
और1
एक0
या1
पूरा होने पर आउटपुट देता है ।एक प्रोग्राम में ऐसी लाइनें होती हैं जिनमें केवल अक्षर होते हैं और
01?
साथ ही<
लाइनों में से एक के अंत में एक होता है। लाइन्स खाली नहीं हो सकती और के साथ लाइन<
में कम से कम एक होना चाहिए0
,1
या?
यह पहले।यहाँ एक नमूना कार्यक्रम है जो दो बिट्स के NAND की गणना करता है :
1 ?< 11 ? 0
एक कार्यक्रम में प्रत्येक पंक्ति को एक स्टैक माना जाता है , जिसमें बाईं ओर नीचे और दाईं ओर शीर्ष होता है। स्पष्ट रूप से, एक कार्यक्रम में पहली पंक्ति से पहले और अंतिम पंक्ति के बाद एक खाली स्टैक (यानी खाली लाइन) है।
<
, कर्सर कहा जाता है, के निशान स्टैक पर शुरू करने के लिए जब एक कार्यक्रम चलाया जाता है। निष्पादन की कार्यवाही निम्नानुसार है:
वर्तमान में इंगित किए जा रहे कर्सर को स्टैक से शीर्ष वर्ण पॉप करें।
- यदि चरित्र है
?
, तो उपयोगकर्ता को a0
या a के लिए संकेत दें1
और मान लें कि वह चरित्र था।- यदि चरित्र है
0
, तो कर्सर को एक स्टैक अप करें (वर्तमान लाइन के ऊपर की रेखा पर)।- यदि चरित्र है
1
, तो कर्सर को एक स्टैक डाउन (वर्तमान लाइन के नीचे की रेखा पर) ले जाएं।यदि स्टैक कर्सर को खाली करने के लिए ले जाता है, तो पिछले मान को स्टैक (हमेशा
0
या एक1
) से पॉपअप किया गया था , और प्रोग्राम समाप्त करें।एल्स, यदि स्टैक कर्सर को स्थानांतरित करने के लिए खाली नहीं है, तो चरण 1 पर वापस जाएं और प्रक्रिया को दोहराएं।
इस चुनौती के लिए महत्वपूर्ण बात यह है कि सभी स्टैकलॉजिक कार्यक्रम एक सत्य तालिका के समान हैं । बूलियन मानों की कुछ पूर्व निर्धारित संख्या इनपुट होती है और ठीक एक बूलियन नियत रूप से आउटपुट होता है।
तो आपका काम एक स्टैक्ग्लोगिक कार्यक्रम का उत्पादन करना है जो संतुष्ट या अनुकरण करता है, अर्थात किसी भी दिए गए सत्य तालिका के समान आउटपुट है। लेकिन यह स्पष्ट नहीं है कि स्टैकलॉजिक किसी भी सत्य तालिका का अनुकरण कर सकता है , इसलिए यहां प्रेरण द्वारा एक प्रमाण दिया गया है :
मुख्य मामला
दो 0-इनपुट सत्य तालिकाओं में हमेशा आउटपुट
0
या1
। इन तालिकाओं के स्टैकलोजिक समकक्ष क्रमशः0<
और1<
हैं।आगमनात्मक कदम
Stackylogic किसी भी एन-इनपुट सत्य तालिका का अनुकरण कर सकते हैं। आज्ञा देना M = N + 1।
एक एम-इनपुट टेबल, टी, को दो एन-इनपुट टेबल, टी 0 और टी 1 के रूप में व्यक्त किया जा सकता है , साथ ही अतिरिक्त इनपुट बिट बी। जब बी 0 होता है, तो टी 0 के परिणाम का उपयोग किया जाता है। जब बी 1 होता है, तो टी 1 के परिणाम का उपयोग किया जाता है।
उदाहरण के लिए, 3-इनपुट सत्य तालिका स्यूडोकोड के अनुरूप है
if B: result = x OR y else: result = x NAND y
है
B x y | result 0 0 0 | 1 0 0 1 | 1 0 1 0 | 1 0 1 1 | 0 1 0 0 | 0 1 0 1 | 1 1 1 0 | 1 1 1 1 | 1
जो वास्तव में नंद के लिए दो 2-इनपुट सत्य तालिकाएं हैं और OR एक दूसरे के ऊपर muxing बिट बी के साथ खड़ी हैं।
S 0 और S 1 को स्टैकलॉजिक प्रोग्राम कहते हैं जो क्रमशः T 0 और T 1 को संतुष्ट करते हैं (हम जानते हैं कि ये पहली धारणा के आधार पर मौजूद हैं)। कार्यक्रम S जो T को संतुष्ट करता है उसका निर्माण निम्न प्रकार से किया जा सकता है:
[lines of S0 excluding the cursor, with 0 appended to all lines below the cursor] ?< [lines of S1 excluding the cursor, with 1 appended to all lines above the cursor]
यह व्यवस्था पहले इनपुट बिट (लाइन से ) के आधार पर S 0 और S 1 के बीच प्रभावी रूप से मेल करती है
?<
। यदि यह है0
, तो कर्सर0
एस 0 के मूल कर्सर की स्थिति के लिए अपेंडेड सवारी करेगा , जो तब खाली स्टैक द्वारा ऊपर और नीचे की सीमा पर होगा, और इस तरह मूल एस 0 के बिल्कुल समान होगा । इसी तरह, यदि1
इनपुट है, तो कर्सर1
एस 1 के कर्सर स्थिति पर सवारी करेगा और इसे निष्पादित करने के लिए आगे बढ़ेगा जैसे कि यह अकेला था।उदाहरण के लिए, OR और NAND के लिए स्टैकलॉजिक प्रोग्राम हैं
? ?<
तथा
1 ?< 11 ? 0
उन्हें अनुकरण करने के लिए जोड़ा जा सकता है
if B: result = x OR y else: result = x NAND y
इस तरह:
1 ? 110 ?0 00 0 ?< ?1 ?
इस प्रकार, किसी भी सत्य तालिका को स्टैकलॉजिक प्रोग्राम द्वारा अनुकरण किया जा सकता है।
चुनौती
एक प्रोग्राम या फ़ंक्शन लिखें जो 2 एन बूलियन मानों की एक सूची के रूप में एन इनपुट सत्य तालिका (एन> 0) में होता है जो आरोही बाइनरी ऑर्डर में तालिका के आउटपुट का प्रतिनिधित्व करते हैं।
कोई भी उचित इनपुट प्रारूप ठीक है। उदाहरण के लिए एक सत्य तालिका
x y | OR
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
इनपुट की इन शैलियों में से कोई भी ठीक होगा:
0111
0, 1, 1, 1
0
1
1
1
[False, True, True, True]
सत्य तालिका को संतुष्ट करने वाले स्टैक्ग्लॉजिक प्रोग्राम को प्रिंट करें या लौटाएं, यानी सटीक एक ही आउटपुट को एक ही इनपुट दिया गया है। कोई भी परिमित प्रोग्राम जो उस तालिका को संतुष्ट करता है वह मान्य आउटपुट है। आपको निर्माण के प्रेरक प्रमाण की विधि का पालन करने की आवश्यकता नहीं है। Stackylogic प्रोग्राम को बहुत कम होने की आवश्यकता नहीं है।
उदाहरण के लिए, यदि इनपुट थे 11100111
, तो एक वैध आउटपुट होगा
1
?
110
?0
00
0
?<
?1
?
लेकिन कई अन्य हैं।
बाइट्स में सबसे छोटा कोड जीतता है।
यदि आपको दुभाषिया की आवश्यकता है तो मूल स्टैकलॉजिक चुनौती देखें ।