終了コードゴルフ


55

IOのこのデフォルトに触発されました。

タスク

x0〜255の入力整数を指定すると、終了コードでクラッシュするプログラムを作成しますx

制限事項

  • 終了コードの出力(System.exit(x)、からの戻りmainなど)を直接意図したものを呼び出すことはできません。代わりに、プログラムはエラーまたはクラッシュを引き起こし、1の確率で、プログラムは入力整数で終了します。
    • この場合、「エラー」および「クラッシュ」という言葉は、プログラムが致命的な意図しない例外を引き起こしたことを意味します。
    • エラーを直接投げて、直接エラーを引き起こしてはなりません。メソッド、関数、またはその他の目的が異なる機能を果たす(つまり、読み取り専用ディレクトリへのファイル書き込みを実行しようとする)メソッドを使用して、それを引き起こす必要があります。
  • プログラムには少なくとも2つの終了コードが含まれている必要があります。
  • シグナルを使用したプロセスの終了は禁止されています。(推論はこの議論で見つかるかもしれません)

得点

プログラムのスコアは、サポートされている終了コードの数によって決定されます。コード終了はタイブレークです。サポートされる終了コードの最大数が勝ちます!


明確にするために、エラーが発生した場合、それは違法ですか?
アンソニーファム

@AnthonyPham直接レイズする場合(throw new Exception()スタイル)、それは違法です。それが既存の機能の誤用の副産物である場合、それは問題ありません。
アディソンクランプ

@VoteToClose私は十分に明確ではなかったと思います。私はあなたに同意しますが、階乗の代わりに、例えば正方形を提案していました。しかし、それは実際には問題ではなく、単なる提案
でした-Maltysen

8
スペルアウトされた英語の数字(one zero zero100など)として入力を受け入れることは可能ですか?私はこの課題についてアイデアを持っていますが、この言語にはI / Oについてかなり珍しいアイデアがあり、これが最も自然な入力形式です。

5
私は検討するゴルフ終了コードを、それが正確であるaltho、clickbaitのタイトルを。<(°_°<)
RaisingAgent

回答:


48

Unixシェル(+ ncurses + BSDユーティリティ)、 36、26バイト、256終了コード

ゴルフ

jot -bu0 $[252+$1]|tput -S

-Sオプションを使用すると、tputは各行のエラーをチェックし、エラーが見つかった場合、終了コードを4 +エラーのある行の数に設定します。エラーが見つからない場合、終了コードは0です。どの行が失敗したかを示すことはできないため、終了コード1は表示されません。終了コード2、3、および4は、通常の解釈を保持します。

一旦TPUTの終了コードが255を乗り越え、それだけそう253(入力にエラーが)、したがって入力の全範囲のための所望の終了ステータスを得、1などの終了コードになり、オーバーフロー。

:特定の機能を設定/取得するときにtputが失敗するかどうかは、使用した端末タイプに依存します:xterm with 256 colors

jotBSDユーティリティであり、シーケンシャルデータまたはランダムデータを出力します。また、OSXシステムでは(AFAIK)をそのまま使用できます。

システムにjot使用可能なものがない場合は、少し長いバージョン(29バイト)を使用できます。

yes u0|sed $[252+$1]q|tput -S

オンラインでお試しください!(29バイトバージョン)


うわー、それはかなり良いです。+1
アディソンクランプ

45

Bash 4.2 +エクストラ、24の終了コード

grep \#$1$ $0|sed 's:#.*::;s:T:tcc -run -<<<main=:;s:C:curl -L x.org/! :'|sh;exit
man#1
C-#2
C/#3
sed#4
C-x/#5
C_#6
C0#7
man /#16
C-f#22
C-o/#23
C-L3#35
C--capath /#60
C--max-filesize 1#63
C--cacert /#77
timeout 1e-9 w#124
/#126
-#127
T6\;#132
T204\;#133
$[2**63%-1]#136
{0..1000000000}#137
T0\;#139
exit _#255

3つの終了コードを提供してくれた@ KenY-Nに感謝します。1つの終了コードを提供してくれた@ el.pescadoに感謝します。

検証

すべてのテストはopenSUSE 13.2で実行されています。

$ for n in {0..255}; do bash exit.sh $n; (($? == $n)) && echo $n >&0; done &> /dev/null
0
1
2
3
4
6
7
16
22
23
35
60
63
77
124
126
127
132
133
136
137
139
255

1
終了コード5:http_proxy=fafa curl http://example.org
el.pescado

1
@ el.pescado 1年以上かかりましたが、ようやくあなたの提案を実行しました。ありがとうございました!
デニス

30

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。そのため、そのケースをカバーするコードを書く必要はまったくありませんでした。

他のエラーとその原因は次のとおりです。

  • 123NEXTスタックオーバーフロー(DO (123) NEXT)です。NEXT声明は、(他の修飾子を必要とするFORGETか、RESUME遡及的にそれが何だったか制御文の並べ替えを決定するために)。80個の未解決の `NEXTステートメントがあると、これらのエラーがないため、エラーICL123Iが発生します。
  • 222は、(スタッシュオーバーフローあるDO STASH .2COME 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が発生します。
  • 148GO BACKは、プログラムのこの時点では存在しない選択ポイントスタック()の最上位エントリに戻ろうとします(選択ポイントスタックを操作するコマンドを実行していないため、まだ空です)。これにより、エラーICL404Iが発生します。
  • 180RETRIEVE .2は、存在しないスタッシュ(プログラムのこのブランチに何もスタッシュしなかったため)からの試行を試み、エラーICL436Iを引き起こします。
  • 50WRITE 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

4
これはおそらく私が今まで見た中で最高のINTERCALプログラムです。
スカイラー

27

Perl、108バイト、256終了コード

このプログラムは(ab)Test :: Moreモジュールを使用します。これは、指定されたファイル開こうと"" のn倍のnは、コマンドライン引数として指定されています。毎回失敗し、各呼び出しはテストとして扱われます。Test :: Moreは、終了コードとして失敗したテストの数を返します。plan tests => $ARGV[0]%255終了コード255を取得するために必要です。

#!/usr/bin/perl
use Test::More;
plan tests => $ARGV[0]%255 if($ARGV[0]>0);
ok(open(F,"")) for (1..$ARGV[0])

ゴルフ:perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'、51バイト(38バイト+の場合は13バイト-MTest::More<space>)。stdinで入力を受け取ります。
ThisSuitIsBlackNot

27

C90(gcc)、256終了コード、28 27 18バイト

main(){getchar();}

私はこれが賢いかcheatyであるかどうかわからないんだけど、私はそれが書かれたルールに違反するとは思わない:それは技術的に使用していないexitreturnまたは何らかのエラーがメカニズムを投げ、単に未定義の動作との事実はgccに依存していますこの課題に関しては、かなり便利なことをしています。

オンラインでお試しください!

使い方

これは単にgetcharSTDINから1バイトを読み取るために使用します。単独では、これは何もしません。

ただし、準拠するC90プログラムは、returnステートメントまたは同等のもので終了する必要があります。その他はすべて未定義の動作です。retとにかくgccは生成されたアセンブリをで終了します。そのため、レジスタEAXに偶然あった値はプログラムによって返されます。幸いなことに、glibc getcharはSTDINから読み込んだバイトをEAXに保存するため、そのバイトの値はプログラムの終了コードになります。


をサポートするjshのようなシェルを使用して、8ビットの障壁を突破するためにこれを変更できるかどうかを確認するのは興味深いでしょう set -o fullexitcode
ツェッペリン

1
それは賢いです。しかし、プログラムは実際にはクラッシュしません。仕様が「致命的な例外/不可逆的な障害/クラッシュの原因」であるかどうかにかかわらず、正常に戻ります
薄暗い

いずれにせよ、これは素晴らしいです。
クエンティン

4
@dimクラッシュの定義に依存すると思います。mainで終了しreturnないか、またはexitC90標準に関する限りエラーであり、失敗を示す終了コードになります。これがクラッシュの核心部分です。
デニス

クラッシュとは、プログラムが正しく機能するために停止することです。プログラムは、ユーザーが適切に行うように指示したことをすべて実行し、入力から1文字を読み取って停止します。そのため、終了コードがエラーを示していても、クラッシュしませんでした。
-findusl

19

x86のbashシェルの下のC(gcc)、230バイト、8つの終了コード

読みやすくするために改行が追加されました。スコアではコメントは無視されます。

main(int c, char **v){
int p[2];
switch(atoi(v[1])-128){
case 2:__asm("UD2");        /* SIGILL: x86 undefined instruction */
case 5:__asm("int $3");     /* SIGTRAP: x86 breakpoint instruction */
case 6:abort();             /* SIGABRT: raise() is called under the covers */
case 8:c/=c-2;              /* SIGFPE: divide by 0 (c-2) */
case 11:c=*(int *)c;        /* SIGSEGV: dereference of invalid pointer */
                            /* SIGPIPE: write() to a pipe closed at the other end */
case 13:socketpair(1,1,0,p);close(p[1]);write(p[0],v,1);
case 14:alarm(1);sleep(2);  /* SIGALRM: kernel will send alarm signal after 1 sec */
}
}

bashシェルの機能:

コマンドが致命的なシグナルNで終了すると、bashは終了ステータスとして128 + Nの値を使用します。

したがって、必要なのは、ACプログラム内からさまざまな信号をトリガーすることだけです。この時点で、単に行うことkill(n-128);は禁止されていると思います。その代わりに、さまざまなシグナルをトリガーするコードを実行します。これにより、呼び出しシェルで対応するエラーコードが使用可能になります。

終了コードは0、130、133、134、136、139、141、142です。

オンラインでお試しください。「デバッグ」セクションを展開して、戻りコードを確認します。

これは確かにより深くゴルフすることができます。しかし、私はより多くのシグナルを追加することにもっと興味があるでしょう。


信号は、既存の関数または操作によってコードの外部で発生すると想定するのは正しいでしょうか?
アディソンクランプ

1
@VoteToCloseはい、そうです。たとえば__asm("UD2")、x86「未定義の命令」を実行すると、CPU例外が発生し、カーネルによってSIGILLシグナルの形式でプログラムに中継されます。このsocketpair例では、もう一方の端write()にあるパイプに接続しようとしているため、カーネルまたはglibcによってSIGPIPEが送信されますclose()
デジタル外傷

1
その後、私はそれで問題はありません。:P
アディソンクランプ

1
1)使用int3していない場合は2文字int $3、2)vとして宣言する場合は1文字、ポインター演算のデータ型int**char-nessに基本的に依存していない場合、3)使用する場合は2文字*p代わりにp[0]あなたが喜んでいる場合、または4)6つの文字は、予測可能に頼るfdそれらを作成するすべてのシステムコールによって返された番号、および置換p[0]およびp[1]その近傍特定の値によります。最後に、を閉じて書き込みを行うときに、pipe(fd)よりもはるかに短くsocketpair(...)、同じエラーを生成fd[0]します。fd[1]
Iwillnotexist Idonotexist

2
いくつかの追加のゴルフの提案:1)の&63代わりに使用します-128。2)を交換sleep(2)してfor(;;)。3)交換してくださいc=*(int*)catoi(0)。4)交換c/=c-2c/=0
-nwellnhof

10

Python 2、13バイト、2終了コード

1/(input()-1)

あなたは0を入力した場合、それは印刷しようと1/-1している-1あなたは1を入力した場合、あなたが得るため、終了コード0完全に罰金である1/0上げたZeroDivisionError私のIDEで1の終了コードが存在している、0が唯一の存在であります終了コードの場合は1 ...

出力:


ここに画像の説明を入力してください


ここに画像の説明を入力してください


10

PHP、15バイト、2つの終了コード

なければdie/ exit、PHPはなく、何かを返すことができない0255(私の知る限り、おそらく~1)、そう...

!$argv[1]?:p();

コマンドライン引数が偽である場合、評価され1、で終了し0ます。そうでない場合、関数の呼び出しを試み、で終了し<b>Fatal error</b>: Uncaught Error: Call to undefined function p()ます。

で実行し-rます。


5
それは真実ではない。exit()このチャレンジに使用できない終了ステータスを設定します。ただし、コードも無効です。終了ステータスを255に設定します
1

@aross:うーん、エラーはで終了するといつも思っていました1。終了コードのリストを検索しましたが、見つかりませんでした。
タイタス

10

エクセルVBA、414 514 533 + 3バイト、14の終了コード

入力を受け取りConditional Compilation Argumentn=[input value]そしてその番号に関連付けられたエラーコードを生成します。

Sub e()
Dim a As Application, b As Byte, s As String, v(), x
Set a=Application
#If n=3 Then
Return
#ElseIf n=5 Then
b=a.CommandBars("")
#ElseIf n=6 Then
b=2^8
#ElseIf n=7 Then
ReDim v(9^9)
#ElseIf n=9 Then
v=Sheets("")
#ElseIf n=10 Then
v=Array(1)
For Each x In v
ReDim v(9)
Next
#ElseIf n=11 Then
b=1/0
#ElseIf n=13 Then
Debug.?Int("X")
#ElseIf n=14 Then
Debug.?String(9E8,1)
#ElseIf n=20 Then
Resume
#ElseIf n=28 Then
f 256
#ElseIf n=35 Then
Call c
#ElseIf n=92 Then
For Each x In v
ReDim v(9)
Next
#ElseIf n=94 Then
b=Null
#End If
End Sub

Sub f(n):DoEvents:f n-1:End Sub

n=[Value]条件付きコンパイル呼び出しの場合は+3

入力を処理する場所 n=

3
5
6
7
9
10
11
13
14
20
28
35
92
94    

注: VBAには、終了コード0またはがありません1。私はのためのソリューションが含まれている3と、5その場所にVBAに利用可能な2つの最も小さい番号の終了コードです、


1
出力タイプの言語機能により許可されないため、この回答は禁止しません。
アディソンクランプ

1
#ここで何をしますか?
ブルースウェイン

条件が真の場合、それに続く文にのみコンパイルされることを意味し、条件付きコンパイル文です#if#ElseIf
テイラー・スコット

1
したがって、それらが真実でない場合、ステートメントはコンパイルされません...それはを使用しない場合と異なり#、ステートメントが真実であるかどうかにかかわらずコンパイルされますか?Ifステートメントがどのように機能するかは知っていますが、実際にコンパイルされるものに慣れるのは初めてなので、このような簡単な質問で申し訳ありません。
ブルースウェイン

1
@BruceWayne、はい、まさにそうです。これらの行は特定のエラーをスローするように設計されているため、必要なエラーコードを生成する行のみを一度にコンパイルする必要があります。これを行うには、実際にコンパイルされる条件文の#if代わりに、Ifまたは条件文Select Caseのみが使用truthyされます。この場合、具体的には、すべての実行でプログラムがエラーコード3で終了するのを防ぎますが、次の場合にReturn without GoSubのみこのコードで終了しますn=3
Taylor Scott

7

Turtlèd、4バイト、2つの終了コード

より多くの終了コードを取得する方法があるかどうかはわかりません...インタープリター言語にはさらに他の方法がありますか

いくつかの4つの長さの答えが見つかりました

' ?;

オンラインでお試しください!

!.(0

オンラインでお試しください!

?;(*

オンラインでお試しください!

これらの仕組み:

' ?;

私のインタープリターには、メモリー内のグリッドに複数の行があり、スペース以外の文字がないときにエラーを引き起こすバグ機能があります。このプログラムは、原点セルの*を消去し、'[space]非負の整数入力?(実際には0または1)を取り、その数だけ下に移動し;ます。ゼロの場合、グリッドは1行のみでエラーはありません。エラーが発生します

!.(0

かっこなどは解析されず、実行時に実行されるだけです。つまり、「セル記号が正しくない場合、一致する括弧にスキップします」。このプログラムでは、(!)を入力すると、プログラムによってセルに書き込まれ(.)、parenが実行され、セルシンボルが0であるかどうかが確認され、一致するparenにスキップしようとしますが、代わりにエラーがスローされます。ゼロの場合、それを書き留め、括弧をチェックし、0で自分自身を見つけて無視し、プログラムは終了します。

?;(*

前の回答と最初の回答の要素があります。負でない整数入力を取り、その数だけ下に移動し、セルが「*」であるかどうかをチェックし、そうでない場合は存在しない余分な括弧を検索します。入力が1の場合、開始スペースから移動し、セルがスペースであることを検出します。ゼロの場合、エラーは開始スペースにとどまり、括弧を無視します。


7

Javascript(ノード)、19バイト、2つの終了コード

完全なプログラム:

+process.argv[2]&&a

関数:

f=i=>i&&f(i)

process.argvは、実行可能ノードへのパス、実行されたjavascriptファイルへのパス、およびコマンドライン引数を含む配列です。この場合、これはまたはのいずれ"1"かになります"0"。文字列は、単項演算+子を使用して数値に変換されます。数値がゼロの場合、遅延&&演算子は右側を評価せず、数値が真(ゼロではない)の場合、右側&&が評価され、未定義の変数を参照しているためエラーがスローされ、プログラムが存在します終了コード1で。

関数は数値として入力を予期します。入力が真実であれば、関数はそれ自体を呼び出し、スタックオーバーフローでノードランタイムをクラッシュさせます。入力が0の場合、遅延&&演算子は右側を評価せずに0を返します。


@VoteToClose未定義の変数に変更
-corvus_192

動作します。:P
アディソンCrumpの

完全なプログラムはに短縮できます+process.argv[2]&&a
user2428118

@ user2428118そのとおりです
-corvus_192

好奇心から、ReferenceError.prototype.name=process.argv[2]?a:0有効でしょうか?
パトリックロバーツ

6

Perl 6、57バイト、256終了コード

use Test;plan $_=@*ARGS[0];ok try {open ""} for ^($_%255)

試してみてください
これはPerl 5の例の翻訳です。

拡大

use Test;  # bring in 「plan」 and 「ok」

plan $_ = @*ARGS[0]; # plan on having the input number of tests
                     # only actually needed for the 255 case
                     # if the plan is greater than the number of tests
                     # it fails with exitcode 255


  ok                 # increment the failure counter if the following is False
    try {            # don't let this kill the whole program
      open ""        # fails to open a file
    }

for                  # repeatedly do that

  ^(                 # upto Range
    $_ % 255         # either the input number of times, or 0 times for 255
  )

5

Scala、19バイト、2つの終了コード

if(args(0)=="1")1/0

1/(args(0).toInt-1)

JVMは、を呼び出さない場合、終了コードとして1と0のみをサポートしますSystem.exit

最初のプログラムは1/0、最初の引数が1であるかどうかを計算しようとします。これにより、終了コード1でJVMがクラッシュします。引数が0である場合、正常に終了します。

引数を整数に変換する2番目のプログラムは、1を減算し、その数で1を除算しようとします。引数が1の場合、を計算する1/0ため、JVMはクラッシュします。引数が0の場合、計算1/-1して終了します。


5

Python 3、15バイト、2つの終了コード

Python 3ではを呼び出さずにリテラル入力を取得できないため、これは明らかにPython 2ソリューションよりも長くなりevalます。ただし、興味深いことに文字列比較手法を使用できます...

1/(input()<'1')

入力は文字列0または1-1の場合、条件は0(偽)と評価され、1 / 0明らかにクラッシュする計算を試みます(終了コード1)。それ以外の場合は何も起こりません。Pythonは通常の終了コード0で終了します。

私の知る限り、Pythonは他の終了コードでクラッシュすることはできません。


5

Java、71 66バイト、2つの終了コード

Holgerのおかげで4バイト節約

完全なプログラム:

interface I{static void main(String[]a){a[a[0].charAt(0)-48]="";}}

引数としてintをとる関数:

i->1/(i-1)

プログラムは、最初の引数の最初の文字('0'またはor '1'を取り、48(ascii値'0')を減算して整数(0または1)を取得し、その整数の位置にある引数を空の文字列に設定しようとします。入力が1の場合、ArrayIndexOutOfBoundsException引数配列は位置0(インデックスがゼロ)に1つの要素しかないため、プログラムはでクラッシュします。


値を割り当てることも、他の方法で使用することもできます。たとえばa[a[0].equals("1")?1/0:1]="";、と同等の配列インデックスとして使用できint x=a[0].equals("1")?1/0:1;ます。しかし、プログラムをさらに変更して、数バイトArrayIndexOutOfBoundsExceptionArithmeticException節約する代わりにを引き起こしますinterface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Holger

4

Python 2、11バイト、2つの終了コード

1>>-input()
1/~-input()
0<input()<x

3つの異なるエラーに対する3つの異なる11バイトソリューション!(楽しみのためだけに、これはポイントを与えません。)デフォルトでは、Pythonは正常終了の終了コード0とエラーの終了コード1のみを持っています。成功した実行では何も出力されません。

 1>>-input()

入力1で、「ValueError:負のシフトカウント」を返します。入力0では、ゼロシフトカウントが成功し、1を返します。

1/~-input()

入力1では、「ZeroDivisionError:0による整数除算またはモジュロ」を与えます。これは~-input()、別名input()-10であるため1/-1です。入力1では、-1を与えます。0**-input()また動作します。

0<input()<x

入力1では、「NameError:name 'x' is not defined」と表示されます。入力0では、これらの最初の不等式0<0はFalseと評価されるため、残りは評価されず、結果はFalseになります。


2

Node.js(ES6)、77バイト、2つの終了コード

require('readline').createInterface({input:process.stdin}).prompt("",i=>i&&x)

2

ゼリー、4つの終了コード、18バイト

߀
2*
Ṁ¹Ŀ
RÇĿỌḊ?R

終了コードをサポートして01137(死滅)、および139(セグメンテーションフォールト)。

オンラインでお試しください!

使い方

RÇĿỌḊ?R  Main link. Argument: n (integer)

R        Range; yield [1, ..., n] if n > 1 or [] if n = 0.
    Ḋ?   If the dequeued range, i.e., [2, ..., n] is non-empty:
 Ç         Call the third helper link.
  Ŀ        Execute the k-th helper link, where k is the the integer returned by Ç.
         Else, i.e., if n is 0 or 1:
   Ọ       Unordinal; yield [] for n = 0 and "\x01" for n = 1.
      R  Range. This maps [] to [] and causes and error (exit code 1) for "\x01".


Ṁ¹Ŀ      Third helper link. Argument: r (range)

Ṁ        Maximum; retrieve n from r = [1, ..., n].
 ¹Ŀ      Call the n-th helper link (modular).
         When n = 139, since 139 % 3 = 1, this calls the first helper link.
         When n = 137, since 137 % 3 = 2, this calls the second helper link.


2*       Second helper link. Argument: k

2*       Return 2**k.
         Since 2**137 % 3 = 174224571863520493293247799005065324265472 % 3 = 2,
         ÇĿ in the main link will once again call the second helper link.
         Trying to compute 2**2**137, a 174224571863520493293247799005065324265472-
         bit number, will get the program killed for excessive memory usage.


߀       First helper link. Argument: k

߀       Recursively map the first helper link over [1, ..., k].
         This creates infinite recursion. Due to Jelly's high recursion limit,
         a segmentation fault will be triggered.

2

SmileBASIC、640バイト、39の終了コード(52のうち)

SPSET.,0INPUT C$GOTO"@"+C$@0
STOP@3
A
@4
CLS.@5@A
GOSUB@A@7?1/A@8
X$=3@9
A%=POW(2,31)@10
BEEP-1@11
DIM B[#ZL*#R]@13
READ A
@15
V"OPTION STRICT?X
@16
CALL@D@17
V@A*2
@18
V"VAR A,A
@19
V"DEF A:END:DEF A
@20
V"FOR I=0TO
@21
V"NEXT
@22
V"REPEAT
@23
V"UNTIL
@24
V"WHILE.
@25
V"WEND
@26
V"IF.THEN
@27
V"IF.THEN"+CHR$(10)+"ELSE
@28
V"ENDIF
@29
V"DEF X
@30
RETURN@31
DIM E[-1]@32
V"DEF A:DEF
@34
GOTO"|
@36
XOFF MIC
MICSTOP
@37
XOFF MOTION
GYROSYNC
@38
PRGDEL
@39
DIM F[66]SPANIM.,1,F
@40
DIM G[2]SPANIM.,1,G
@42
MPSTART 2,@A@L
MPSEND"A"GOTO@L@44
PROJECT
@46
USE"PRG1:A
@47
BGMPLAY"`
@48
X=
@51
DLCOPEN"
DEF V C
PRGEDIT 1PRGDEL-1PRGSET C
EXEC 1
END

これは間違いなく短くすることができます。SBには0〜51のエラーコードのみがあり、トリガーできないものもあります。


0

ZX81 BASIC> 255終了コード-52バイト(リスト)

1 INPUT N
2 GOTO 1+(2*(N>0 AND N <=255))
3 PRINT "EXIT CODE ";N
4 RAND USR N

技術的にNは、範囲内の任意の24ビット浮動小数点数にすることができますが、ここでは整数と仮定します。行2はIF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1、ZX81 BASICがIF/ELSEシンボリック命令に含まれている場合と同等です。


3
これはどのように満たされthe program caused some fatal unintended exceptionますか?これは単にテキストを出力し、実行を終了します。
-AdmBorkBork

あなたは正しいです-私は朝にもっと目を覚ます必要があります。
ショーンビバーズ

RAND USR N予期しない場所からROMの一部を呼び出すことは良い考えではないため、意図しない効果を引き起こしRAND USR 0ます。
ショーンビバーズ

それが実際にプログラムをクラッシュさせる原因についてもう少し詳しく説明できますか?私はZX81 BASICに精通していません。
AdmBorkBork

ROMは0x0000〜0x1fffにあります。適切な場所から開始すると、ROMルーチンの呼び出しが機能します。Z80のマシンコードルーチンで1バイト以上を開始すると、予期しない影響が生じます。LD BC, 0000 RST 10 RET0x1000のsimple が呼び出されている場合RAND USR 4097、LDオペランドを逃してしまい、マシンコードが歪んでしまいます。すべてのROM呼び出しを覚えているわけではありませんが、すべての法的/グレースフルエンドを解決し、後で除外します。
ショーンビバーズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.