退出代码高尔夫


55

受到IO默认设置的启发。

任务

编写一个程序,如果输入整数x在0到255之间,则退出代码将导致崩溃x

限制条件

  • 您不得调用直接用于退出代码输出的任何内容(System.exit(x),从main等返回)。而是,您的程序必须导致错误或崩溃,以1的概率导致程序以输入整数退出。
    • 在这种情况下,“错误”和“崩溃”一词表示程序导致了一些致命的意外异常,其中错误地使用了方法,操作或其他方式导致了不可逆的故障。
    • 您可能不会直接抛出错误而直接导致错误。您必须使用方法,函数或其他用途来实现此目的,而该方法,函数或目的是提供不同功能的函数(例如,尝试执行对只读目录的文件写入操作)。
  • 您的程序中必须至少有两个退出代码。
  • 禁止使用信号终止过程。(可以在此讨论中找到理由)

计分

程序的分数取决于所支持的退出代码的数量,其中代码简洁性是决胜局。支持的退出代码数量最多!


为了澄清,如果我提出一个错误,那是非法的,是吗?
Anthony Pham

@AnthonyPham如果直接提高它(throw new Exception()样式),那是非法的。如果它是滥用现有功能的副产品,那很好。
艾迪生·克伦普

@VoteToClose我想我还不够清楚。我同意你的意见,但建议是正方形而不是阶乘。但是什么都没关系,仅是一个建议
Maltysen

8
接受输入作为拼写的英文数字(例如one zero zero100)吗?我对这个挑战有一个想法,但是这种语言对I / O有一些相当不寻常的想法,这是最自然的输入格式。

5
我认为退出代码高尔夫是一个诱饵标题,尽管它是准确的。<(°_°<)
RaisingAgent

Answers:


48

Unix Shell(+ 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实用程序,可打印连续或随机数据,并且(AFAIK)也可在OSX系统上直接使用。

如果系统不可jot用,则可以使用稍长(29字节)的版本:

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

在线尝试!(29字节版本)


哇,很好 +1
艾迪生·克伦普

45

Bash 4.2 + Extras,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

感谢@ KenY-N提供3个退出代码。感谢@ el.pescado提供1个退出代码。

验证

所有测试均在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我花了一年多的时间,但我终于实现了您的建议。谢谢!
丹尼斯,

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上正确对齐;按惯例,将制表符宽度设置为8用于INTERCAL。我已经测试了该程序的所有制表符,空格的版本,但删除了换行符,效果很好。)

进行编译-abm(2个字节的代价,因为-b编译器必须确定性)。

与INTERCAL一样,这通常采用数字输入格式,例如ONE TWO THREEfor 123

说明

当C-INTERCAL程序出错时,退出状态为错误代码模256。因此,我们的目标是编写一个能够产生尽可能多的运行时错误的程序。该程序仅忽略了两个运行时错误,这些错误并不表示内部编译器问题:ICL200I,因为对其进行再现需要使用仅与单线程程序兼容的外部库(并且多线程程序具有更多可用错误);和ICL533I,因为533与277具有相同的模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中是相当惯用的。)

另一个例外是input ONE TWO NINE(129)程序中没有行号,因此对于缺少的行号会出现错误ICL129I。因此,我根本不必编写任何代码来涵盖这种情况。

以下是其他错误以及导致这些错误的原因:

  • 123NEXT堆栈溢出(DO (123) NEXT)。该NEXT语句需要其他修饰符(FORGETRESUME),以便追溯确定它是哪种控制语句。一旦有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,并且-v在命令行上尝试不带任何选项的情况下更改值1 会导致错误ICL277I。
  • 148次尝试返回选择点堆栈(GO BACK)的顶部条目,该条目在程序中目前不存在(我们没有运行任何命令来操纵选择点堆栈,因此它仍然为空)。这将导致错误ICL404I。
  • RETRIEVE .2从不存在的存储中进行180次尝试(因为我们没有在程序的此分支中存储任何内容),导致错误ICL436I。
  • 50WRITE IN永远COME FROM循环请求输入()。最终,我们最终将读取超过EOF的值,从而导致错误ICL562I。
  • 109运行该语句DO RESUME #0,该语句无意义,并且具体记录为导致错误的语句(ICL621I)。
  • 120运行语句DO RESUME #9。我们尚未运行那么多NEXT语句,因此我们收到错误ICL120I。(有趣的是,此特殊错误在INTERCAL文档中定义为正常退出程序,然后导致错误,而不是错误退出程序。不过,我认为这两种情况没有明显区别。)
  • 223本质上是多线程基元的复杂缠结,它们都指向第223行,从而导致死循环,从而耗尽内存。最终,多线程子系统中的内存耗尽,从而导致错误ICL991I。
  • 121实际上是一个有效的语句(它是一个注释),但是它出现在程序的末尾。因此,执行在执行后立即从程序结尾处掉落,从而导致错误ICL633I。

验证

一些错误涉及故意使程序内存不足,因此我建议设置相当小的内存限制。这是我用来测试程序的shell命令(添加了换行符以提高可读性;如果您自己运行它,请将其删除):

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

这是输出(删除了行号和“请更正源”消息以节省空间),我添加了一部分以演示程序的工作,但主要是为了炫耀INTERCAL的愚蠢错误消息:

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 ::更多失败测试的返回数量作为退出代码。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'1

27

C90(gcc),256个退出代码,28 27 18个字节

main(){getchar();}

我不知道这是否是聪明还是cheaty,但我不认为它违反了书面的规则:它在技术上不使用exitreturn或任何错误投掷机构,而仅仅依赖于不确定的行为和事实,GCC就这一挑战而言,它做了一些相当方便的事情。

在线尝试!

这个怎么运作

这只是用来getchar从STDIN读取一个字节。就其本身而言,这什么也没做。

但是,符合标准的C90程序必须以return语句或等效形式结尾;其他一切都是未定义的行为。gcc ret仍然以生成的程序集结尾,因此,随便在程序中返回EAX寄存器中的任何值。幸运的是,glibc getchar将它从STDIN读取的字节存储在EAX中,因此该字节的值就是程序的退出代码。


看看这个可以修改通过8位闯关,使用shell像这将是有趣 JSH,支持set -o fullexitcode
Zeppelin

1
那很聪明。但是,该程序实际上并没有崩溃。它会正常返回,无论规范是“导致致命的异常/不可逆的故障/崩溃”
昏暗的

无论哪种方式,这都很棒。
Quentin

4
@dim我想这取决于您对崩溃的定义。就C90标准而言,未以main结尾returnexit以end 结尾是错误,它会导致指示失败的退出代码。这就是崩溃的本质。
丹尼斯,

崩溃是程序停止正常运行。您的程序会执行您要求它正确执行的所有操作,它从输入中读取一个字符,然后停止。因此,即使退出代码指示错误,它也不会崩溃。
findusl

19

x86上bash shell下的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 shell的功能:

当命令在致命信号N上终止时,bash将使用128 + N的值作为退出状态。

因此,我们要做的就是从ac程序中触发各种信号。在这一点上,我认为只是kill(n-128);禁止这样做。因此,我们执行触发各种信号的代码,从而使相应的错误代码在调用shell处可用。

退出代码为0、130、133、134、136、139、141、142。

在线尝试。展开“调试”部分以查看返回代码。

这当然可以打得更深一些。但是我对添加更多信号更感兴趣。


我可以正确地假设信号是由预先存在的函数或操作在代码外部引起的吗?
艾迪生·克伦普

1
@VoteToClose是的,是的。例如,__asm("UD2")运行x86“未定义指令”将导致CPU异常,该异常将由内核以SIGILL信号的形式中继到程序。对于socketpair例如,SIGPIPE将由内核或glibc的,因为我们正试图发送write()到被管close()的另一端天。
Digital Trauma

1
那我就没问题了。:P
艾迪生·克伦普

1
您可以打高尔夫球了1)如果你使用两个字符int3,而不是int $32)如果你声明一个字符vint**,因为你不从根本上依赖char于你的指针运算的数据类型的-ness,加上3)两个字符,如果你使用*p而不是p[0]或4)六个字符,如果您愿意依靠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,这是完全可以的,因此退出代码为0。如果输入1,则得到的1/0结果将引发a ZeroDivisionError,其中退出代码为1。在我的IDE中,只有0和1代表退出代码...

输出:


在此处输入图片说明


在此处输入图片说明


10

PHP,15字节,2个退出代码

没有die/ exit,PHP不能返回除(0255(afaik;可能~1)以外的任何东西,所以...

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

如果命令行参数为falsy,则计算结果为1并以退出0。如果不是,它将尝试调用一个函数并以退出<b>Fatal error</b>: Uncaught Error: Call to undefined function p()

用运行-r


5
这不是真的。exit()设置退出状态……您不能将其用于此挑战,这是理所当然的。但是您的代码也是无效的。它设置退出状态为255
aross

@aross:嗯,我一直认为错误会以退出1。我搜索了退出代码列表,但找不到。
泰特斯

10

Excel 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

+3用于n=[Value]有条件的编译调用

在哪里处理输入 n=

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

注意: VBA没有退出代码01。我已经提供了3和的解决方案5,这是VBA可以使用的最低编号的两个退出代码。


1
我不会拒绝这个答案,因为由于输出类型的语言功能,它是我不允许的同义词。
艾迪生·克鲁普

1
#这里做什么?
BruceWayne

#if#ElseIf是条件编译语句意思是跟在它后面的语句,如果条件为真只编译
泰勒斯科特

1
因此,如果它们不为真,则不会编译这些语句……这与不使用的不同之处在于#,无论语句是否为真,都将在不使用它们的地方进行编译?我知道If语句是如何工作的,但是我不了解实际编译的内容,因此对这样一个简单的问题感到抱歉。
BruceWayne

1
@BruceWayne,是的,确实如此。由于这些线被设计成抛出具体的错误,就必须有产生所需的错误代码在给定时间进行编译行。为此,#if可以使用它来代替IfSelect Casetruthy实际编译条件语句。在这种情况下,具体而言,它可以使这个程序从错误代码退出3Return without GoSub在每次执行的,而是只与此代码退出时n=3
泰勒斯科特

7

Turtlèd,4字节,2个退出代码

我不知道是否有任何方法可以获取更多退出代码...解释器语言中是否还有更多方法

我找到了四个长度的答案

' ?;

在线尝试!

!.(0

在线尝试!

?;(*

在线尝试!

这些是如何工作的:

' ?;

在我的解释器中,有一个错误功能,当内存中的网格有多行并且没有非空格字符时,会导致错误。该程序将删除原始单元格上的* '[space],接受非负整数输入?(实际上为0或1),然后向下移动那么多;,如果为零,则网格将只有一行,没有错误,否则它将向下移动并且会发生错误

!.(0

括号和其他内容不会被解析,它们只会在运行时执行以表示:“如果单元格符号不正确,则跳至匹配的括号”。在此程序中,输入(!)会使程序将其写入单元格(.),执行括号,该程序检查单元格符号是否为0,尝试跳至匹配的括号,但由于没有错误而抛出错误。如果为零,则将其写下来,检查括号,在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‮–
艾迪生·克伦普

完整程序可以缩短为+process.argv[2]&&a
user2428118

@ user2428118您是对的
corvus_192

只是出于好奇,会ReferenceError.prototype.name=process.argv[2]?a:0有效吗?
Patrick Roberts

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,则它​​将成功退出。

第二个将参数转换为整数的程序,将其减去1并尝试将1除以该数字。如果参数为1,则计算1/0,因此JVM将崩溃;否则,将崩溃。如果参数为0,则计算1/-1并退出。


5

Python 3,15个字节,2个退出代码

显然,这比Python 2解决方案要长,因为在Python 3中,如果不调用,就无法接受文字输入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'或,'1'然后减去48(ascii的值'0'))以获得整数(0或1),然后尝试将该整数位置的参数设置为空字符串。输入为1时,程序将崩溃ArrayIndexOutOfBoundsException,因为参数数组在位置0(零索引)处只有一个元素。


可以指定的值,或使用它以任何其他方式,例如,作为数组的索引a[a[0].equals("1")?1/0:1]="";,这是与标准杆int x=a[0].equals("1")?1/0:1;。但是,进一步更改程序以激发ArrayIndexOutOfBoundsException而不是ArithmeticException节省一些字节: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

针对三种不同错误的三种不同的11字节解决方案!(只是为了好玩,它不会给出分数。)默认情况下,Python仅具有成功退出的退出代码0和错误退出的代码1。成功的运行不会输出任何内容。

 1>>-input()

在输入1上,给出“ ValueError:负移位计数”。输入0时,零移位计数成功并给出1。

1/~-input()

由于~-input()aka input()-1为0,在输入1上给出“ ZeroDivisionError:整数除法或以零为模” 1/-1。在输入1上给出-1。0**-input()也可以。

0<input()<x

在输入1上,给出“ NameError:未定义名称'x'”。在输入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 1ZX81 BASIC IF/ELSE的符号说明中包含的内容。


3
这如何满足the program caused some fatal unintended exception?这只是打印出一些文本并完成执行。
AdmBorkBork

您是对的-我需要早上更加清醒。
Shaun Bebbers

RAND USR N会产生意想不到的效果,因为从意外位置调用ROM的一部分不是一个好主意,因此RAND USR 0已被排除在外,因为这太优雅了。
Shaun Bebbers

您能否详细说明一下这实际上导致程序崩溃的原因?我对ZX81 BASIC不太熟悉。
AdmBorkBork

ROM位于0x0000-0x1fff; 如果从正确的位置开始,则调用ROM例程将起作用。在Z80中的任何机器代码例程中开始一个或多个字节都会导致意外的影响。如果您LD BC, 0000 RST 10 RET在0x1000处有一个简单的函数但被调用,RAND USR 4097那么您将错过LD操作数,因此机器代码将出现偏差。我不记得所有的ROM调用,但是我会解决所有合法/优美的问题,并在以后排除它们。
Shaun Bebbers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.