2 + 2 = 2 * 2 (और समान) सिद्ध करें


12

इस तरह के बयानों का एक पूर्ण औपचारिक Poof आउटपुट 1+2=3, 2+2=2*(1+1)आदि।

introuction

यदि आप पीनो अंकगणित जानते हैं तो आप शायद इस खंड को छोड़ सकते हैं।

यहां बताया गया है कि हम प्राकृतिक संख्याओं को कैसे परिभाषित करते हैं:

(Axiom 1) 0 is a number
(Axiom 2) If `x` is a number, the `S(x)`, the successor of `x`, is a number.

इसलिए, उदाहरण के S(S(S(0)))लिए एक संख्या है।

आप अपने कोड में किसी भी समकक्ष प्रतिनिधित्व का उपयोग कर सकते हैं। उदाहरण के लिए, ये सभी मान्य हैं:

0    ""    0           ()       !
1    "#"   S(0)        (())     !'
2    "##"  S(S(0))     ((()))   !''
3    "###" S(S(S(0)))  (((()))) !'''
...
etc

हम निम्नानुसार परिभाषित करने के लिए नियमों का विस्तार कर सकते हैं।

(Rule 1) X+0 = X
(Rule 2) X+S(Y)=S(X)+Y

इसके साथ हम 2 + 2 = 4 को निम्नानुसार साबित कर सकते हैं

         S(S(0)) + S(S(0)) = 2 + 2
[Rule 2 with X=S(S(0)), Y=S(0)]
         S(S(S(0))) + S(0) = 3 + 1
[Rule 2 with X=S(S(S(0))), Y=0]
         S(S(S(S(0)))) + 0 = 4 + 0
[Rule 1 with X=S(S(S(S(0))))
         S(S(S(S(0))))     = 4

निम्नानुसार गुणा को परिभाषित करने के लिए हम इन नियमों का विस्तार कर सकते हैं

(Rule 3) X*0 = 0
(Rule 4) X*S(Y) = (X*Y) + X

यद्यपि इसे अनुमति देने के लिए हमें कोष्ठक की संरचनात्मक भूमिका को परिभाषित करने की आवश्यकता है।

(Axiom 3) If X is a number, (X) is the same number.

जोड़ और गुणा संचालक सख्ती से बाइनरी हैं और कोष्ठक हमेशा स्पष्ट होना चाहिए। A+B+Cअच्छी तरह से परिभाषित नहीं है, लेकिन (A+B)+Cऔर A+(B+C)हैं।

उदाहरण

अब हमारे पास गुणन के बारे में एक प्रमेय साबित करने के लिए पर्याप्त है: 2 + 2 = 2 * 2

2 + 2
(2) + 2
(0 + 2) + 2
((0*2) + 2) + 2
(1*2) + 2
2*2

आवश्यकताएँ

एक सबूत है किA=B एक सूची भाव इस तरह है:

  • पहला है A,
  • अंतिम है B, और
  • पहले के अलावा सूची में प्रत्येक अभिव्यक्ति पिछले से एक नियम के तहत इसे परिवर्तित करके प्राप्त की जा सकती है।

आपका कार्यक्रम इनपुट के रूप में दो मान्य अभिव्यक्तियाँ लेगा , प्रत्येक अभिव्यक्ति में संख्याएँ, जोड़, गुणन और कोष्ठक हैं जैसा कि ऊपर परिभाषित किया गया है।

आपका कार्यक्रम एक प्रमाण आउटपुट करेगा, जैसा कि ऊपर परिभाषित एक सूची है, कि दो अभिव्यक्तियाँ समान हैं, यदि ऐसा कोई प्रमाण मौजूद है।

यदि दो अभिव्यक्तियाँ समान नहीं हैं, तो आपका प्रोग्राम कुछ भी नहीं करेगा।

एक निश्चित संख्या में चरणों में साबित करना या काटना हमेशा संभव होता है, क्योंकि प्रत्येक अभिव्यक्ति को एक ही संख्या में घटाया जा सकता है और इन संख्याओं को समानता के लिए तुच्छ रूप से परखा जा सकता है।

यदि इनपुट अभिव्यक्तियाँ मान्य नहीं हैं (जैसे असंतुलित कोष्ठक, जिसमें गैर-संख्याएँ, या गैर-बाइनरी ऑपरेटर शामिल हैं) तो आपका कार्यक्रम त्रुटि से बाहर निकलना चाहिए, एक अपवाद फेंकना, एक त्रुटि प्रिंट करना, या अन्यथा कुछ अवलोकन योग्य व्यवहार उत्पन्न करना जो कि भिन्न से भिन्न हो ऐसा मामला जिसमें इनपुट मान्य हों लेकिन गैर-बराबर हों

सारांश में, स्वीकार्य इनपुट के लिए सामान्य आउटपुट इनपुट सहित समान संख्याओं की एक सूची है, जो निम्नलिखित नियमों द्वारा निर्मित है।

(Axiom 1) 0 is a number
(Axiom 2) If `x` is a number, the `S(x)`, the successor of `x`, is a number.
(Axiom 3) If X is a number, (X) is the same number

(Rule 1) X+0 = X
(Rule 2) X+S(Y)=S(X)+Y
(Rule 3) X*0 = 0
(Rule 4) X*S(Y) = (X*Y) + X
(Rule 5) X = (X)              (Axiom 3 expressed as a transformation rule.)

इनपुट और आउटपुट में संख्या का कोई भी उपयुक्त प्रतिनिधित्व, अनुमति दी है जैसे 0=""=(), 3="###"=(((())))आदि व्हाइटस्पेस अप्रासंगिक है।

बेशक, नियम किसी भी दिशा में लागू किए जा सकते हैं। आपके प्रोग्राम को आउटपुट नहीं करना है जो नियम का उपयोग किया जाता है, बस पिछले एक्सप्रेशन पर इसके एक्शन द्वारा निर्मित एक्सप्रेशन।

सबसे छोटा कोड जीतता है।


जवाबों:


5

पर्ल, 166 + 1 बाइट्स

-p(1 बाइट पेनल्टी) के साथ चलाएं ।

$r='\((S*)';(@b,@a)=@a;push@a,$_ while+s/\+S/S+/||s/$r\+\)/$1/||s/$r\*\)//||s/$r\*S(S*)/(($1*$2)+$1/||s/$r\)/$1/;$\.=/[^S]./s;$_=$b[-1]eq$a[-1]?join'',@b,reverse@a:""

अधिक पठनीय:

                           # निहित: $ _ में इनपुट की एक पंक्ति पढ़ें
                           # हम newline को छोड़ देते हैं
$ r = '\ ((एस *)'; # हम इस रेगेक्स के टुकड़े का उपयोग करते हैं, इसे बाहर निकालते हैं
(@ बी, @ ए) = @ ए; # सेट @ बी से @ ए, @ ए से खाली
पुश #a, $ _ जबकि # हर बार लूप को गोल करें, $ _ को @a में जोड़ें
+ S / \ + एस / एस + / || # नियम 2: "S +" को "S +" में बदलें
एस / $ r \ + \) / $ 1 / || # नियम 1: परिवर्तन "(एक्स + 0)" से "एक्स"
एस / $ r \ * \) // || # नियम 3: परिवर्तन "(एक्स * 0)" से ""
s / $ r \ * S (S *) / (($ 1 * $ 2) + $ 1 / || # नियम 4: परिवर्तन "(X * Y" से "((X * Y) + X"
एस / $ r \) / $ 1 /; # नियम 5: परिवर्तन "(एक्स)" से "एक्स"
$ \ = / [^ एस] ./ रों। # यदि हम newline वर्ण में 1 को जोड़ते हैं
                           # किसी भी गैर-एस के बाद कुछ भी देखें
$ _ = $ बी [-1] eq $ एक [-1]? # अगर @ बी और @ ए उसी तरह खत्म होते हैं
  join '', @ b, रिवर्स @ a # तो $ _ हो जाता है @b उसके बाद (@a पीछे की ओर)
  : "" # अन्यथा खाली $ _
                           # निहित: आउटपुट $ _

इनपुट प्रारूप स्ट्रिंग के रूप में एकात्मक में संख्याओं को व्यक्त करता है S, और अलग-अलग लाइनों पर दो इनपुटों की आवश्यकता होती है (प्रत्येक को एक नई रेखा और उसके बाद एक EOF दोनों को देखा जाता है)। मैंने इस प्रश्न की व्याख्या की कि कोष्ठक का शाब्दिक अर्थ होना चाहिए ( )और इसके अलावा / गुणन शाब्दिक होना चाहिए + *; यदि मुझे अलग-अलग विकल्प बनाने की अनुमति है, तो मैं कम पलायन के माध्यम से कुछ बाइट्स बचा सकता हूं।

एल्गोरिथ्म वास्तव में एक खाली लाइन के साथ इनपुट की पहली पंक्ति की तुलना करता है, दूसरे के साथ पहला, दूसरे के साथ तीसरा, और इसी तरह। यह प्रश्न की आवश्यकताओं को पूरा करता है। यहाँ एक उदाहरण चलाया गया है:

मेरा इनपुट:

(एस एस + एस एस)
(एस एस * एस एस)

कार्यक्रम का उत्पादन:

(एसएसएस + S)
(Ssss +)
ssss
ssss
(Ssss +)
((एस एस +) एस एस +)
(((एस एस *) एस एस +) एस एस +)
(((एस एस *) एस + एस) एस एस +)
(((एस एस *) + एस एस) एस एस +)
((एस एस * एस) एस एस +)
((एस एस * एस) एस + एस)
((एस एस * S) + एस एस)

SSSSबीच में डुप्लिकेट नाराज है, लेकिन मैंने फैसला किया कि यह विनिर्देश का उल्लंघन नहीं करता है, और इसे छोड़ने के लिए कम बाइट्स है।

अमान्य इनपुट पर, मैं 1newline वर्ण में संलग्न हूं , इसलिए आपको 1आउटपुट के अंत में भटका हुआ मिलता है ।


echo -e "((SS+)+(S+S))\nSS*SS" | perl -p /tmp/x.plआउटपुट 1
स्पैर्फ

यह सही है, आप दूसरी पंक्ति (जो कहना चाहिए (SS*SS)) पर कोष्ठक को याद कर रहे हैं । "परिवर्धन और गुणन संचालक कड़ाई से द्विआधारी हैं और कोष्ठक हमेशा स्पष्ट होना चाहिए।"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.