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
オンラインでお試しください!
ここの空白はすべて無関係です。(元のプログラムにはタブが含まれていましたが、SEで正しく並ぶようにスペースに変換しました。INTERCALにはタブ幅8を使用するのが一般的です。すべてのタブ、スペースを含むプログラムのバージョンをテストしました、および改行は削除されましたが、正常に動作します。)
コンパイル-abm
(-b
コンパイラが確定的であるために必要なため、2バイトのペナルティ)。
INTERCALのためいつものように、これは、例えば、形式に数値入力を取るONE TWO THREE
ため123
。
説明
C-INTERCALプログラムがエラーになると、終了ステータスは256を法とするエラーコードになります。その結果、できるだけ多くのランタイムエラーを生成できるプログラムを作成することができます。このプログラムでは、内部コンパイラーの問題を示すものではない2つのランタイムエラーのみが省略されています。ICL533Iは、533が277と同じ256を法とする値を持ち、プログラムがICL277Iを生成できるためです。
プログラムは常に同じ方法で起動します。まず、WRITE IN
変数の値を入力します().1
。次に、計算CREATE
ステートメントを使用して新しい構文を作成します(ここではA
)。しかし、計算されるため、構文の定義はの値に基づいて異なります.1
。最後に、ほとんどの場合A
、エラーを生成するように定義された新しいステートメントを実行します。考えられる定義の表には、考えられる各ランタイムエラー(上記の例外を除く)の定義が含まれています。
まず、この一般的なスキームには2つの例外があります。(0)
は有効な行番号ではないため、ユーザーがを入力した場合、計算されたステートメントZERO
を使用して、2行目(番号付き(8)
)から4行目にジャンプしCOME FROM
ます。次にDO X
、これは構文エラーに陥り、エラーが生成されますICL000I
。(INTERCALでは、コマンドが無効になる傾向、ユーザーの下で構文が再定義される傾向などにより、実行時に構文エラーが発生します。)また、このCOME FROM
ステートメントには、実際に何もCOME FROM
起こらない場合でも副作用があり、行番号のある行が実行されるたびにから.1
へのオペランドオーバーロードが作成#1
されます。これは後で出力21を生成するときに使用されます(ランダムなグローバルな副作用は、INTERCALではかなり慣用的です)。
他の例外はinputにありますONE TWO NINE
。(129)
プログラムには行番号がないため、行番号が欠落しているとエラーが発生しますICL129I
。そのため、そのケースをカバーするコードを書く必要はまったくありませんでした。
他のエラーとその原因は次のとおりです。
- 123は
NEXT
スタックオーバーフロー(DO (123) NEXT
)です。NEXT
声明は、(他の修飾子を必要とするFORGET
か、RESUME
遡及的にそれが何だったか制御文の並べ替えを決定するために)。80個の未解決の `NEXTステートメントがあると、これらのエラーがないため、エラーICL123Iが発生します。
- 222は、(スタッシュオーバーフローある
DO STASH .2
でCOME FROM
ループ)。スタッシュは使用可能なメモリーによってのみ制限されますが、最終的には不足し、エラーICL222Iが発生します。
- 240は、サイズがゼロの配列の次元です。それがまさにその
DO ,1 <- #0
意味であり、エラーICL240Iを引き起こします。
- 241は、配列の境界外に割り当てることにより発生します。この場合、
,1
割り当てられていない(,
INTERCALの配列型変数に使用されている)ため、インデックスを作成するとエラーICL241Iが発生します。
- 19は、 65536(
#256 $ #0
)を16ビット変数に割り当てます.2
。適合せず、エラーICL275Iを引き起こします。
- 図21は割り当て
#2
します.1
。これは十分に単純な割り当てのように見えるかもしれませんが、以前の.1
意味でオーバーロードしており、コマンドラインでオプション#1
なしで値1を変更しようとする-v
とエラーICL277Iが発生します。
- 148
GO BACK
は、プログラムのこの時点では存在しない選択ポイントスタック()の最上位エントリに戻ろうとします(選択ポイントスタックを操作するコマンドを実行していないため、まだ空です)。これにより、エラーICL404Iが発生します。
- 180
RETRIEVE .2
は、存在しないスタッシュ(プログラムのこのブランチに何もスタッシュしなかったため)からの試行を試み、エラーICL436Iを引き起こします。
- 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