ইন্টারকল (সি-ইন্টারকল), 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 এর ট্যাব প্রস্থ ব্যবহার করা প্রচলিত। আমি সমস্ত ট্যাব, স্পেস সহ প্রোগ্রামটির একটি সংস্করণ পরীক্ষা করেছি I've , এবং নতুনলাইনগুলি মুছে ফেলা হয়েছে, যদিও এবং এটি দুর্দান্ত কাজ করে))
সঙ্গে কম্পাইল -abm
(2 বাইট কারণে শাস্তি -b
কম্পাইলার নিয়ন্ত্রণবাদী হতে হবে প্রয়োজন হয়)।
INTERCAL জন্য স্বাভাবিক হিসাবে, এই বিন্যাসে সাংখ্যিক ইনপুট নেয়, যেমন, ONE TWO THREE
জন্য 123
।
ব্যাখ্যা
যখন কোনও সি-ইন্টার্কাল প্রোগ্রাম ত্রুটিযুক্ত হয়ে যায়, প্রস্থান স্থিতিটি ত্রুটি কোড মডুলো 256 হয় a ফলস্বরূপ, আমরা এমন একটি প্রোগ্রাম লিখতে লক্ষ্য রাখতে পারি যা যতটা সম্ভব রান-টাইম ত্রুটি তৈরি করতে সক্ষম। এই প্রোগ্রামটি কেবল দুটি রানটাইম ত্রুটি বাদ দেয় যা অভ্যন্তরীণ সংকলক সমস্যাগুলি ইঙ্গিত করে না: আইসিএল ২০০200, কারণ এটি পুনরুত্পাদন করার জন্য বাহ্যিক লাইব্রেরিগুলি প্রয়োজন যা কেবলমাত্র একক থ্রেডযুক্ত প্রোগ্রামের সাথে সামঞ্জস্যপূর্ণ (এবং মাল্টিথ্রেডেড প্রোগ্রামগুলিতে আরও ত্রুটি উপলব্ধ রয়েছে); এবং আইসিএল ৩৩I আই, কারণ 3৩৩ এর ২ value7 এর মতো একই মান 256 রয়েছে এবং প্রোগ্রামটি আইসিএল 277 আই উত্পাদন করতে সক্ষম।
প্রোগ্রামটি সর্বদা একই ভাবে শুরু হয়। প্রথমত, আমরা WRITE IN
ভেরিয়েবলের জন্য একটি মান ইনপুট করি .1
। তারপরে, আমরা CREATE
নতুন সিনট্যাক্স তৈরি করতে একটি গণিত বিবৃতি ব্যবহার করি (এখানে, A
); তবে এটি গণনা করা হয়েছে বলে সিনট্যাক্সের সংজ্ঞা মানের ভিত্তিতে পরিবর্তিত হয় .1
। অবশেষে, বেশিরভাগ ক্ষেত্রে আমরা আমাদের নতুন A
বিবৃতিটি চালিত করি , যা ত্রুটি তৈরির সংজ্ঞা দেওয়া হয়েছে; আমাদের কাছে সম্ভাব্য সংজ্ঞাগুলির সারণীতে প্রতিটি সম্ভাব্য রানটাইম ত্রুটির (উপরে উল্লিখিত ব্যতিক্রম ব্যতীত) সংজ্ঞা রয়েছে contains
প্রথমত, এই সাধারণ স্কিমের দুটি ব্যতিক্রম রয়েছে। (0)
একটি বৈধ লাইন নম্বর নয়, সুতরাং যদি ব্যবহারকারী ইনপুট করে ZERO
, আমরা (8)
একটি গণিত COME FROM
বিবৃতি দিয়ে দ্বিতীয় লাইন (সংখ্যাযুক্ত ) থেকে চতুর্থ লাইনে লাফাই । এটি তখন একটি সিনট্যাক্স ত্রুটির মধ্যে পড়ে DO X
, যা ত্রুটি তৈরি করে ICL000I
। (ইন্টারকল এ, সিনট্যাক্স ত্রুটিগুলি রানটাইমের সময় ঘটে থাকে, আদেশগুলি অক্ষম করার প্রবণতার কারণে, আপনার অধীনে সিনট্যাক্স পুনরায় সংজ্ঞায়িত করা হবে ইত্যাদি)। COME FROM
বিবৃতি আরো একটি পার্শ্ব প্রতিক্রিয়া এমনকি যদি কোন প্রকৃত আছে, COME FROM
, এরকম থেকে অপেরান্ড জমিদার তৈরি .1
করতে #1
যখনই একটি লাইন নম্বর দিয়ে একটি লাইন মৃত্যুদন্ড কার্যকর করা হয়; 21 পরে আউটপুট উত্পাদন করার সময় এটি ব্যবহার করা হয় ((এলোমেলোভাবে বিশ্বব্যাপী পার্শ্ব প্রতিক্রিয়াগুলি ইন্টারকালে মোটামুটি মূর্তিমানিক))
অন্য ব্যতিক্রম ইনপুট সহ ONE TWO NINE
। (129)
প্রোগ্রামটিতে কোনও লাইন নম্বর নেই , সুতরাং আমরা অনুপস্থিত লাইন নম্বরটির জন্য একটি ত্রুটি পাই যা এটি ICL129I
। সুতরাং এই মামলাটি কভার করার জন্য আমাকে কোনও কোড লিখতে হয়নি।
এখানে অন্যান্য ত্রুটি রয়েছে এবং কী কারণে সেগুলি ঘটে:
- 123 হ'ল একটি
NEXT
স্ট্যাক ওভারফ্লো ( DO (123) NEXT
)। NEXT
বিবৃতি অন্যান্য সংশোধনকারীদের (প্রয়োজন FORGET
বা RESUME
) অর্ডার ব্যাপকভাবে কোনটি নিয়ন্ত্রণ বিবৃতি সাজানোর এটা ছিল না। 80 টি অমীমাংসিত `নেক্সট স্টেটমেন্ট একবার আসার পরে ত্রুটি আইসিএল 123 আই না হওয়া।
- 222 হ'ল স্ট্যাশ ওভারফ্লো (
DO STASH .2
একটি COME FROM
লুপে)। স্ট্যাশগুলি কেবল উপলভ্য মেমরি দ্বারা সীমাবদ্ধ থাকে তবে এটি শেষ পর্যন্ত চলে যাবে, আইসিএল 222 আইয়ের ফলে ত্রুটি ঘটবে।
- 240 হল পরিমান শূন্যের একটি অ্যারে sions ঠিক এর
DO ,1 <- #0
অর্থ এটি এবং এটি আইসিএল 240 আইয়ের ত্রুটি ঘটায়।
- 241 অ্যারের গণ্ডির বাইরে বরাদ্দকরণের ফলে ঘটে। এই ক্ষেত্রে,
,1
বরাদ্দ করা হয়নি ( ,
ইন্টারকালে অ্যারে-টাইপ ভেরিয়েবলের জন্য ব্যবহৃত হয়), সুতরাং এটি সূচীকরণ ত্রুটি আইসিএল 241 আইয়ের কারণ হয়ে থাকে।
- 19
#256 $ #0
একটি 16-বিট ভেরিয়েবলকে 65536 ( ) বরাদ্দ করে .2
। এটি মানানসই নয়, আইসিএল 275 আইয়ের ত্রুটি ঘটায়।
- 21 নির্ধারণ
#2
করতে .1
। এটি একটি সাধারণ পর্যাপ্ত অ্যাসাইনমেন্টের মতো দেখতে পারে তবে আমরা আগে .1
বোঝাতে ওভারলোড করেছি #1
এবং -v
কমান্ড লাইনে কোনও বিকল্প ছাড়াই 1 এর মান পরিবর্তন করার চেষ্টা করায় আইসিএল 277 আই ত্রুটি ঘটায়।
- 148 চয়েসপয়েন্ট স্ট্যাকের শীর্ষ এন্ট্রিটিতে ফিরে যাওয়ার চেষ্টা করে (
GO BACK
), যা প্রোগ্রামে এই মুহুর্তে বিদ্যমান নেই (আমরা পছন্দ পয়েন্ট স্ট্যাকটি পরিচালনা করার জন্য কোনও কমান্ড চালাইনি, সুতরাং এটি খালি)। এর ফলে ত্রুটি আইসিএল 404 আই হয়।
RETRIEVE .2
অস্তিত্বহীন স্ট্যাশ থেকে 180 টি চেষ্টা করা হয়েছে (কারণ আমরা প্রোগ্রামের এই শাখায় সেখানে কোনও কিছুই স্ট্যাশ করি নি), আইসিএল 436 আই ত্রুটি ঘটায়।
- 50 টি অনুরোধ ইনপুট (
WRITE IN
) চিরকাল একটি COME FROM
লুপে। অবশেষে আমরা বিগত ইওএফটি পড়ে শেষ করব, আইসিএল 562 আইয়ের ত্রুটি ঘটায়।
- 109 স্টেটমেন্টটি চালায়
DO RESUME #0
, যা অর্থহীন এবং বিশেষত একটি ত্রুটির কারণ হিসাবে চিহ্নিত করা হয়েছে (আইসিএল 621 আই)।
- 120 স্টেটমেন্ট রান
DO RESUME #9
। আমরা NEXT
এখনও এতগুলি স্টেটমেন্ট চালাইনি, এবং এভাবেই আমরা ত্রুটি পেয়েছি আইসিএল 120 আই। (অদ্ভুতভাবে, এই নির্দিষ্ট ত্রুটিটি ইন্টারকাল ডকুমেন্টেশনে সংজ্ঞায়িত করা হয় যে প্রোগ্রামটি সাধারণত স্বাভাবিকভাবে প্রস্থান করা হয় এবং তারপরে ত্রুটিটি ঘটে, ত্রুটিযুক্ত করে প্রোগ্রামটি বেরিয়ে আসার পরিবর্তে। তবে আমি বিশ্বাস করি না যে এই দুটি ক্ষেত্রে অবশ্যই আলাদা আলাদা) are
- 223 মূলত মাল্টিথ্রেডিং আদিমগুলির একটি জটিল জট যা সবগুলি 223 লাইনের দিকে নির্দেশ করে, স্মৃতিটিকে প্রবাহিত করে এমন একটি অসীম লুপ তৈরি করে। শেষ পর্যন্ত, মাল্টিথ্রেডিং সাবসিস্টেমটিতে স্মৃতিশক্তি ক্লান্তি রয়েছে যা আইসিএল 991 আই ত্রুটির দিকে পরিচালিত করে।
- 121 আসলে একটি বৈধ বিবৃতি (এটি একটি মন্তব্য), তবে এটি প্রোগ্রামের শেষে উপস্থিত হয়। যেমনটি কার্যকর করা কার্যকর হওয়ার সাথে সাথেই প্রোগ্রামের শেষের দিকে কার্যকর হয়ে যায়, যার ফলে ত্রুটি আইসিএল 633 আই ঘটে।
প্রতিপাদন
কিছু ত্রুটিগুলির মধ্যে ইচ্ছাকৃতভাবে প্রোগ্রামটি মেমোরির বাইরে চলে যাওয়ার সাথে জড়িত, তাই আমি মোটামুটি ছোট স্মৃতি সীমা নির্ধারণ করার পরামর্শ দিই। প্রোগ্রামটি পরীক্ষা করার জন্য আমি যে শেল কমান্ডটি ব্যবহার করেছি তা এখানে রয়েছে (পঠনযোগ্যতার জন্য নতুন লাইনের সাথে যুক্ত; আপনি যদি এটি নিজে চালান তবে সেগুলি মুছুন):
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