INTERCAL (C-INTERCAL), 15 कोड, 313 + 2 = 315 बाइट्स
PLEASE WRITE IN .1
(8) PLEASE CREATE .1 A
PLEASE A
PLEASE COME FROM #2$!1/#1'
DO X
(123) DO (123) NEXT
DO COME FROM (222)
(222) DO STASH .2
(240) DO ,1 <- #0
(241) DO ,1 SUB #0 <- #1
(19) DO .2 <- #256 $ #0
(21) DO .1 <- #2
(148) DO GO BACK
(180) DO RETRIEVE .2
DO COME FROM (50)
(50) DO WRITE IN .2
(109) DO RESUME #0
(120) DO RESUME #9
MAYBE COME FROM (223)
(223) DO COME FROM (223)
(121) PLEASE NOT X
इसे ऑनलाइन आज़माएं!
यहाँ सभी व्हाट्सएप अप्रासंगिक है। (मूल कार्यक्रम में टैब शामिल थे, लेकिन मैंने उन्हें रिक्त स्थान में बदल दिया ताकि वह एसई पर सही ढंग से काम कर सके; यह इंटरकैल के लिए 8 की टैब चौड़ाई का उपयोग करने के लिए पारंपरिक है। मैंने सभी टैब, रिक्त स्थान के साथ कार्यक्रम के एक संस्करण का परीक्षण किया है। , और newlines नष्ट कर दिया, हालांकि, और यह ठीक काम करता है।)
संकलन -abm
(2 बाइट पेनल्टी के साथ, क्योंकि -b
कंपाइलर को नियतात्मक होना आवश्यक है)।
INTERCAL के लिए हमेशा की तरह, यह प्रारूप में, जैसे, के ONE TWO THREE
लिए संख्यात्मक इनपुट लेता है 123
।
व्याख्या
जब C-INTERCAL प्रोग्राम में त्रुटियां होती हैं, तो बाहर निकलने की स्थिति में त्रुटि कोड मोडुलो 256 होता है। परिणामस्वरूप, हम एक ऐसे प्रोग्राम को लिखने का लक्ष्य बना सकते हैं, जो अधिक से अधिक रनटाइम त्रुटियों के उत्पादन में सक्षम हो। यह प्रोग्राम केवल दो रनटाइम त्रुटियों को छोड़ देता है जो आंतरिक संकलक मुद्दों को इंगित नहीं करते हैं: ICL200I, क्योंकि इसे पुन: प्रस्तुत करने के लिए बाहरी पुस्तकालयों के उपयोग की आवश्यकता होती है जो केवल एकल-थ्रेडेड प्रोग्राम के साथ संगत होते हैं (और मल्टीथ्रेडेड प्रोग्राम में अधिक त्रुटियां उपलब्ध हैं); और ICL533I, क्योंकि 533 में 277 के रूप में एक ही मूल्य modulo 256 है, और कार्यक्रम ICL277I के उत्पादन में सक्षम है।
कार्यक्रम हमेशा उसी तरह से शुरू होता है। सबसे पहले, हम WRITE IN
चर के लिए एक इनपुट ( ) मान देते हैं .1
। फिर, हम CREATE
नए वाक्यविन्यास (यहाँ, A
) बनाने के लिए एक गणना कथन का उपयोग करते हैं ; लेकिन क्योंकि यह गणना है, वाक्यविन्यास की परिभाषा मूल्य के आधार पर भिन्न होती है .1
। अंत में, ज्यादातर मामलों में हम अपना नया A
बयान चलाते हैं , जिसे एक त्रुटि उत्पन्न करने के लिए परिभाषित किया गया है; संभावित परिभाषाओं की तालिका में हमारे पास प्रत्येक संभावित रनटाइम त्रुटि (ऊपर सूचीबद्ध अपवादों के अलावा) की परिभाषा है।
सबसे पहले, इस सामान्य योजना के दो अपवाद हैं। (0)
मान्य लाइन नंबर नहीं है, इसलिए यदि उपयोगकर्ता इनपुट करता है ZERO
, तो हम (8)
गणना किए गए COME FROM
विवरण के माध्यम से दूसरी पंक्ति (क्रमांकित ) से चौथी पंक्ति तक कूदते हैं । यह तब एक सिंटैक्स त्रुटि में आता है DO X
, जो त्रुटि पैदा करता है ICL000I
। (INTERCAL में, वाक्यविन्यास त्रुटियां रनटाइम के दौरान होती हैं, क्योंकि आदेशों को निष्क्रिय करने की प्रवृत्ति के कारण, आपके तहत सिंटैक्स को फिर से परिभाषित किया जाना है, आदि)। COME FROM
बयान में यह भी एक पक्ष प्रभाव भले ही कोई वास्तविक है, COME FROM
होता है से एक संकार्य अधिभार बनाने .1
के लिए #1
जब भी एक लाइन नंबर के साथ एक लाइन निष्पादित किया जाता है; इसका उपयोग बाद में आउटपुट 21 के उत्पादन में किया जाता है। (रैंडम वैश्विक साइड इफेक्ट INTERCAL में काफी मुहावरेदार हैं।)
अन्य अपवाद इनपुट के साथ है ONE TWO NINE
। (129)
प्रोग्राम में कोई लाइन नंबर नहीं है , इसलिए हमें एक लापता लाइन नंबर के लिए एक त्रुटि मिलती है, जो कि है ICL129I
। इसलिए मुझे उस केस को कवर करने के लिए कोई कोड लिखने की ज़रूरत नहीं थी।
यहां अन्य त्रुटियां हैं, और उनके कारण क्या हैं:
- 123 एक
NEXT
स्टैक ओवरफ्लो ( DO (123) NEXT
) है। इस NEXT
कथन को पूर्वव्यापी रूप से निर्धारित करने के लिए अन्य संशोधक ( FORGET
या RESUME
) की आवश्यकता है कि यह किस प्रकार का नियंत्रण कथन था। एक बार 80 अनसुलझे `अगले कथनों में ICL123I के कारण उन त्रुटियों का नहीं होना।
- 222 एक गुप्त कोष में अतिप्रवाह (है
DO STASH .2
एक में COME FROM
पाश)। स्टैम्स केवल उपलब्ध मेमोरी द्वारा सीमित हैं, लेकिन यह अंततः बाहर चलेगा, जिससे ICL222I त्रुटि होगी।
- 240 आयाम है एक सरणी का आकार शून्य है। ठीक यही
DO ,1 <- #0
मतलब है, और यह ICL240I त्रुटि का कारण बनता है।
- 241 एक सरणी की सीमा के बाहर असाइन करने के कारण होता है। इस स्थिति में,
,1
उन्हें आवंटित नहीं किया गया है ( ,
INTERCAL में सरणी-प्रकार चर के लिए उपयोग किया जाता है), इसलिए इसे अनुक्रमित करने से ICL1.1I त्रुटि होती है।
- 19
#256 $ #0
एक 16-बिट चर के लिए 65536 ( ) असाइन करता है .2
। यह फिट नहीं है, जिससे ICL275I त्रुटि हुई है।
- 21 को असाइन करता
#2
है .1
। यह एक साधारण पर्याप्त असाइनमेंट की तरह लग सकता है, लेकिन हम पहले .1
से मतलब करने के लिए अतिभारित #1
थे, और -v
कमांड लाइन पर कोई विकल्प नहीं के साथ 1 के मूल्य को बदलने का प्रयास ICL277I त्रुटि का कारण बनता है।
- 148 चॉइस पॉइंट स्टैक (
GO BACK
) के शीर्ष प्रविष्टि पर लौटने का प्रयास करता है, जो कार्यक्रम में इस बिंदु पर मौजूद नहीं है (च्वाइसपॉइंट स्टैक में हेरफेर करने के लिए हमने कोई कमांड नहीं चलाया है, इसलिए यह अभी भी खाली है)। जो ICL404I त्रुटि का कारण बनता है।
- 180
RETRIEVE .2
एक बिना किसी रोक-टोक के प्रयास (क्योंकि हमने कार्यक्रम की इस शाखा में वहाँ कुछ भी नहीं किया था), जिसके कारण ICL236I त्रुटि हुई।
- 50 अनुरोध इनपुट (
WRITE IN
) हमेशा के लिए एक COME FROM
लूप में। आखिरकार हम EOF पिछले पढ़ने को समाप्त कर देंगे, जिससे ICL562I त्रुटि होगी।
- 109 स्टेटमेंट चलाता है
DO RESUME #0
, जो अर्थहीन है और विशेष रूप से एक त्रुटि (ICL621I) के रूप में प्रलेखित है।
- 120 का बयान दिया
DO RESUME #9
। हमने NEXT
अभी तक कई कथन नहीं चलाए हैं , और इस प्रकार हमें त्रुटि ICL120I मिलती है। (गहनता से, यह विशेष त्रुटि INTERCAL दस्तावेज़ में प्रोग्राम को सामान्य रूप से बाहर निकालने और फिर त्रुटि के कारण प्रोग्राम से बाहर निकलने के बजाय परिभाषित किया गया है। मुझे विश्वास नहीं है कि ये दोनों मामले अवलोकन से भिन्न हैं, हालांकि।)
- 223 मूल रूप से मल्टीथ्रेडिंग प्राइमेटिक्स की एक जटिल उलझन है जो सभी 223 लाइन पर वापस आती है, जिससे एक अनंत लूप बनता है जो स्मृति को उड़ा देता है। आखिरकार, मल्टीथ्रेडिंग सबसिस्टम में मेमोरी थकावट होती है, जिससे ICL991I त्रुटि होती है।
- 121 वास्तव में एक वैध कथन है (यह एक टिप्पणी है), लेकिन यह कार्यक्रम के अंत में दिखाई देता है। जैसे कि, निष्पादन के तुरंत बाद कार्यक्रम समाप्त हो जाता है, जिससे ICL633I त्रुटि होती है।
सत्यापन
कुछ त्रुटियों में जानबूझकर प्रोग्राम को मेमोरी से बाहर चलाना शामिल है, इसलिए मैं सुझाव देता हूं कि काफी छोटी मेमोरी लिमिट सेट करें। यहाँ शेल कमांड है जिसे मैंने प्रोग्राम का परीक्षण करने के लिए इस्तेमाल किया था (पठनीयता के लिए नई सूचियों के साथ, यदि आप इसे स्वयं चलाते हैं तो उन्हें हटा दें):
for x in "ZERO" "ONE NINE" "TWO ONE" "FIVE ZERO" "ONE ZERO NINE"
"ONE TWO ZERO" "ONE TWO ONE" "ONE TWO THREE" "ONE TWO NINE"
"ONE FOUR EIGHT" "ONE EIGHT ZERO" "TWO TWO TWO"
"TWO TWO THREE" "TWO FOUR ZERO" "TWO FOUR ONE";
do echo;
echo $x;
echo $x | (ulimit -Sd 40000; ulimit -Sv 40000; ulimit -Ss 40000;
./errors; echo $?);
done
और यहां आउटपुट (लाइन नंबरों और "कृपया सहेजें स्रोत" संदेशों को स्थान बचाने के लिए हटा दिया गया है), जिसे मैंने आंशिक रूप से कार्यक्रम को प्रदर्शित करने के लिए जोड़ा, लेकिन ज्यादातर इंटरकैल के मूर्खतापूर्ण त्रुटि संदेशों को दिखाने के लिए:
ZERO
ICL000I PLEASEWRITEIN.1(8)PLEASECREATE.1APLEASEAPLEASECOMEFROM#2$!1/#1'DOX(123)DO(123)NEXTDOCOMEFROM(222)(222)DOSTASH.2(240)DO,1<-#0(241)DO,1SUB#0<-#1(19)DO.2<-#256$#0(21)DO.1<-#2(148)DOGOBACK(180)DORETRIEVE.2DOCOMEFROM(50)(50)DOWRITEIN.2(109)DORESUME#0(120)DORESUME#9MAYBECOMEFROM(223)(223)DOCOMEFROM(223)(121)PLEASENOTX
0
ONE NINE
ICL275I DON'T BYTE OFF MORE THAN YOU CAN CHEW
19
TWO ONE
ICL277I YOU CAN ONLY DISTORT THE LAWS OF MATHEMATICS SO FAR
21
FIVE ZERO
ICL562I I DO NOT COMPUTE
50
ONE ZERO NINE
ICL621I ERROR TYPE 621 ENCOUNTERED
109
ONE TWO ZERO
ICL632I THE NEXT STACK RUPTURES. ALL DIE. OH, THE EMBARRASSMENT!
120
ONE TWO ONE
ICL633I PROGRAM FELL OFF THE EDGE
121
ONE TWO THREE
ICL123I PROGRAM HAS DISAPPEARED INTO THE BLACK LAGOON
123
ONE TWO NINE
ICL129I PROGRAM HAS GOTTEN LOST
129
ONE FOUR EIGHT
ICL404I I'M ALL OUT OF CHOICES!
148
ONE EIGHT ZERO
ICL436I THROW STICK BEFORE RETRIEVING!
180
TWO TWO TWO
ICL222I BUMMER, DUDE!
222
TWO TWO THREE
ICL991I YOU HAVE TOO MUCH ROPE TO HANG YOURSELF
223
TWO FOUR ZERO
ICL240I ERROR HANDLER PRINTED SNIDE REMARK
240
TWO FOUR ONE
ICL241I VARIABLES MAY NOT BE STORED IN WEST HYPERSPACE
241