출구 코드 골프


55

IO에 대한이 기본값에서 영감을 얻었습니다 .

작업

x0에서 255 사이 의 입력 정수 가 주어지면 종료 코드와 충돌 하는 프로그램을 작성하십시오 x.

제한 사항

  • 종료 코드 출력 ( System.exit(x),에서 반환 main등)을 위해 직접 작성된 것은 호출 할 수 없습니다 . 대신, 프로그램은 오류 또는 충돌을 일으켜서 1의 확률로 프로그램이 입력 정수로 종료되게합니다.
    • 이 경우 "오류"및 "충돌"이라는 단어는 프로그램이 의도하지 않은 치명적인 예외를 일으킨다는 것을 의미하며, 여기서 방법, 작업 또는 기타 방법이 잘못 사용되어 돌이킬 수없는 오류가 발생했습니다.
    • 직접 던져서 오류가 직접 발생하지 않을 수 있습니다. 메소드, 함수 또는 그 밖의 목적으로 다른 함수를 제공하는 (즉, 읽기 전용 디렉토리에 파일 쓰기를 실행하려는) 메소드를 사용하여이를 발생시켜야합니다.
  • 프로그램에서 적어도 두 개의 종료 코드를 고려해야합니다.
  • 신호를 사용하여 프로세스를 종료하는 것은 금지되어 있습니다. ( 이 토론에서 추론을 찾을 수 있습니다 )

채점

프로그램 점수는 지원되는 종료 코드의 수에 따라 결정되며 코드 결정은 순위를 결정합니다. 지원되는 종료 코드 수가 가장 많습니다!


명확히하기 위해, 오류가 발생하면 불법입니다.
Anthony Pham

@AnthonyPham 직접 올리면 ( throw new Exception()스타일) 불법입니다. 기존 기능의 오용으로 인한 부산물이라면 괜찮습니다.
애디슨

@VoteToClose 나는 충분히 명확하지 않은 것 같아요. 나는 당신에 동의하지만 계승 대신에 사각형이라고 제안했습니다. 그러나 실제로 중요하지 않은 것은 단지 제안
일뿐입니다.

8
입력을 영어 (예 : one zero zero100)로 입력 할 수 있습니까? 이 과제에 대한 아이디어가 있지만 언어에는 I / O에 대한 상당히 특이한 아이디어가 있으며 이것이 가장 자연스러운 입력 형식입니다.

5
Exit Code Golfing 을 클릭 베이트 제목으로 간주 하지만 정확합니다. <(° _ ° <)
RaisingAgent 2012 년

답변:


48

유닉스 쉘 (+ ncurses + BSD 유틸리티) 36, 26 바이트, 256 개의 종료 코드

골프

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

-S 옵션이 사용되면, tput은 각 행의 오류를 점검하고 오류가 발견되면 종료 코드를 4에 오류가있는 행 수를 더한 값으로 설정합니다. 오류가 없으면 종료 코드는 0입니다. 실패한 행을 표시 할 수 없으므로 종료 코드 1이 표시되지 않습니다. 종료 코드 2, 3 및 4는 일반적인 해석을 유지합니다.

일단 tput을의 종료 코드 (255)를 넘어, 그것은 너무 253 (입력에 에러) 따라서 입력의 전체 범위에 대해 원하는 종료 상태를 산출 한 등의 종료 코드를 초래할 것이다 오버플.

참고 : 특정 기능을 설정 / 가져올 때 tput 이 실패 하는지 여부 는 터미널 유형에 따라 다릅니다.xterm with 256 colors

jot 는 순차 또는 무작위 데이터를 인쇄 하는 BSD 유틸리티이며, OSX 시스템에서 (AFAIK)를 즉시 사용할 수 있습니다.

시스템을 jot사용할 수 없는 경우 약간 더 긴 (29 바이트) 버전을 사용할 수 있습니다.

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

온라인으로 사용해보십시오! (29 바이트 버전)


와우, 그것은 꽤 좋다. +1
Addison Crump

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 년 이상 걸렸지 만 마침내 제안을 이행했습니다. 감사합니다!
Dennis

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 THREEfor) 123.

설명

C-INTERCAL 프로그램 오류가 발생하면 종료 상태는 오류 코드 모듈로 256입니다. 결과적으로 가능한 많은 런타임 오류를 생성 할 수있는 프로그램을 작성할 수 있습니다. 이 프로그램은 내부 컴파일러 문제를 나타내지 않는 두 가지 런타임 오류 만 생략합니다. ICL200I, 재생하려면 단일 스레드 프로그램과 호환되는 외부 라이브러리를 사용해야하기 때문에 (멀티 스레드 프로그램에는 더 많은 오류가 있음); 533은 277과 동일한 모듈로 256의 값을 가지며 프로그램은 ICL277I를 생성 할 수 있기 때문에 ICL533I.

프로그램은 항상 같은 방식으로 시작합니다. 먼저 WRITE IN변수 값을 입력합니다 ( ) .1. 그런 다음 계산 된 CREATE문을 사용하여 새 구문 (여기서는 A) 을 만듭니다 . 계산되기 때문에 구문 정의는의 값에 따라 다릅니다 .1. 마지막으로, 대부분의 경우 A오류를 생성하도록 정의 된 새 명령문 을 실행 합니다. 우리가 가질 수있는 정의 테이블에는 각각의 가능한 런타임 오류에 대한 정의가 포함되어 있습니다 (위에 나열된 예외는 제외).

첫째,이 일반적인 계획에는 두 가지 예외가 있습니다. (0)는 유효한 줄 번호가 아니므로 사용자가를 입력 하면 계산 된 문 ZERO을 통해 두 번째 줄 (numbered (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문 (다른 수정이 필요 FORGET하거나 RESUME소급 그것이 무엇 제어문의 종류 결정하기 위해). 이러한 문제가 없으면 해결되지 않은`NEXT 문이 80 번 있으면 오류 ICL123I가 발생합니다.
  • 222 (숨김 오버플 DO STASH .2A의 COME FROM루프). 스 태시는 사용 가능한 메모리에 의해서만 제한되지만 결국에는 ICL222I 오류가 발생합니다.
  • 240 은 크기가 0 인 배열의 크기입니다. 이것이 DO ,1 <- #0의미하는 바이며, 오류 ICL240I가 발생합니다.
  • 241 은 배열의 경계 외부에 할당하기 때문에 발생합니다. 이 경우 ,1할당되지 않았 ,으며 (INTERCAL의 배열 유형 변수에 사용됨) 인덱싱하면 오류 ICL241I가 발생합니다.
  • 19#256 $ #0 는 16 비트 변수에 65536 ( )을 할당 합니다 .2. 맞지 않아서 ICL275I 오류가 발생합니다.
  • 21이에 할당 #2합니다 .1. 그것은 충분히 간단한 할당처럼 보일지 모르지만, 우리 .1#1앞서 의미하기 위해 오버로드 -v했으며 명령 행에서 옵션 없이 값 1을 변경하려고 하면 오류 ICL277I가 발생합니다.
  • 148GO BACK 은 프로그램의 현재 시점에 존재하지 않는 선택 점 스택 ( ) 의 최상위 항목으로 돌아 가려고합니다 (선택 점 스택을 조작하는 명령을 실행하지 않았으므로 여전히 비어 있습니다). 오류 ICL404I가 발생합니다.
  • RETRIEVE .2존재하지 않는 숨김에서 180 개의 시도 (프로그램의이 분기에 아무것도 숨기지 않았기 때문에)가 ICL436I 오류를 발생시킵니다.
  • 50WRITE INCOME 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

그리고 여기에 출력이 있습니다 (라인 번호와 공간을 절약하기 위해 "PLEASE CORRECT SOURCE"메시지가 삭제되었습니다). 프로그램의 작동을 보여주기 위해 부분적으로 추가했지만 주로 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 프로그램 일 것입니다.
Skyler

27

Perl, 108 바이트, 256 개의 종료 코드

이 프로그램은 (ab) Test :: More 모듈을 사용 합니다. 그것은라는 이름의 파일 열려고 "" n 개의n을 명령 행 인수로 제공됩니다. 매번 실패하며 각 호출은 테스트로 처리됩니다. 테스트 :: 종료 된 실패한 테스트의 리턴 코드를 종료 코드로 표시합니다. 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 경우 잘 모르겠지만, 나는 그것이 작성된 규칙 위반 생각하지 않는다 : 기술적으로 사용하지 않는 exit, return또는 오류가 메커니즘을 던지는를 단순히 정의되지 않은 동작과 사실이 GCC에 의존 이 도전이가는 한 다소 편리한 일을합니다.

온라인으로 사용해보십시오!

작동 원리

이것은 단순히 getcharSTDIN에서 1 바이트를 읽는 데 사용 됩니다. 그 자체로는 아무것도하지 않습니다.

그러나 호환 C90 프로그램은 return명령문 또는 이와 동등한 것으로 끝나야합니다 . 다른 모든 것은 정의되지 않은 행동입니다. gcc는 ret어쨌든 생성 된 어셈블리를 종료 하므로 레지스터 EAX에 아무 값이 있어도 프로그램에 의해 반환됩니다. 운 좋게도 glibc 's getchar는 STDIN에서 읽은 바이트를 EAX로 저장하므로 해당 바이트 값은 프로그램의 종료 코드입니다.


이것을 지원하는 jsh 와 같은 쉘을 사용하여 8 비트 장벽을 돌파하도록 수정할 수 있는지 확인하는 것이 흥미로울 것 set -o fullexitcode입니다.
zeppelin

1
영리 해요 그러나 프로그램은 실제로 충돌하지 않습니다. 스펙이 "치명적인 예외 / 돌이킬 수없는 실패 / 충돌
dim

어느 쪽이든, 이것은 굉장합니다.
Quentin

4
@dim 나는 그것이 충돌 정의에 달려 있다고 생각합니다. C90 표준이 진행되는 한 메인으로 끝나지 return않거나 exit오류가 발생하면 오류를 나타내는 종료 코드가 생성됩니다. 그것은 모든 충돌이 핵심입니다.
Dennis

충돌은 프로그램이 제대로 작동하지 않는 것입니다. 프로그램은 올바르게 수행하도록 지시 한 모든 작업을 수행하며 입력에서 한 문자를 읽은 다음 중지합니다. 따라서 종료 코드가 오류를 표시하더라도 충돌하지 않았습니다.
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들어, SIGPIPE는 커널이나 glibc 에 의해 다른 쪽 끝에 write()있는 파이프 로 보내려고 할 때 전송됩니다 close().
디지털 외상

1
그런 다음 문제가 없습니다. : P
Addison Crump

1
당신은 할 수 골프 두 개의 문자를 사용하는 경우) 1 밖으로 int3가 아니라 int $3, 2) 하나 개의 문자는 선언하는 경우 v로서 int**당신은 근본적으로하지 수행에 의존 주어진, char당신이 사용하는 경우, 포인터 연산의 데이터 유형의 -ness 플러스 3) 두 문자 , 또는 4) 6 문자 *p대신 p[0], fd모든 syscall에서 반환 된 예측 가능한 숫자 에 의존 하고이를 대체 p[0]하고 p[1]가까운 값으로 대체하려는 경우 . 마지막으로 닫고 쓸 pipe(fd)때보 다 훨씬 짧고 socketpair(...)동일한 오류가 발생합니다 fd[0]. fd[1].
Idonotexist Idonotexist

2
몇 가지 추가 골프 제안 : 1) &63대신 사용하십시오 -128. 2) 교체 sleep(2)와 함께 for(;;). 3) 교체 c=*(int*)c와 함께 atoi(0). 4) 교체 c/=c-2와 함께 c/=0.
nwellnhof

10

Python 2, 13 바이트, 2 개의 종료 코드

1/(input()-1)

0을 입력하면 1/-1-1 인 인쇄 를 시도하여 완벽하게 종료되므로 코드 0을 종료합니다. 1을 입력하면 종료 코드 1이 1/0있는 a ZeroDivisionError가 발생합니다. 내 IDE에는 0 만 있습니다. 종료 코드의 경우 1입니다.

출력 :


여기에 이미지 설명을 입력하십시오


여기에 이미지 설명을 입력하십시오


10

PHP, 15 바이트, 종료 코드 2 개

die/가 없으면 exitPHP는 0또는 255(afaik; 아마 ~1) 이외의 것을 반환 할 수 없으므로 ...

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

명령 행 인수가 거짓 인 경우로 평가 1하고 종료합니다 0. 그렇지 않으면 함수 호출을 시도하고로 종료합니다 <b>Fatal error</b>: Uncaught Error: Call to undefined function p().

로 실행하십시오 -r.


5
그건 사실이 아니야. exit()이 챌린지에 사용할 수없는 종료 상태를 설정합니다. 그러나 코드도 유효하지 않습니다. 그것은 255 종료 상태를 설정
aross

@aross : 흠 나는 항상 오류가로 끝날 것이라고 가정했다 1. 종료 코드 목록을 검색했지만 찾을 수 없습니다.
Titus

10

엑셀 VBA, (414) 514 (533) + 3 바이트, 14 개 종료 코드

A와 입력을 받아 Conditional Compilation Argument, n=[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는 종료 코드가없는 01. VBA에서 사용할 수있는 가장 낮은 두 개의 종료 코드 인 3및에 대한 솔루션을 포함 시켰 5습니다.


1
출력 유형의 언어 기능으로 인해 허용하지 않기 때문에 동의하지 않기 때문에이 답변을 허용하지 않습니다.
Addison Crump

1
은 무엇을 않습니다 #여기합니까?
BruceWayne

#if와는 #ElseIf조건이 참이면 다음에 오는 문은 컴파일 된 것을 의미 조건부 컴파일 문이다
테일러 스콧

1
따라서 그것이 사실이 아닌 경우, 진술은 컴파일 되지 않습니다 ... 문을 사용하지 않는 것과 다르며 #, 문장이 사실인지 여부에 관계없이 컴파일됩니다. 나는 If문장 이 어떻게 작동 하는지 알고 있지만 실제로 컴파일 하는 것에 익숙하지 않기 때문에 간단한 질문에 대해 유감스럽게 생각합니다.
BruceWayne

1
@BruceWayne, 그렇습니다. 이 라인은 던질 수 있도록 설계되어 있기 때문에 특정 오류를, 주실 필요가 있습니다 원하는 오류 코드가주고 시간에 컴파일 생산 라인을. 이를 위해 조건문 만 #if대신 If또는 실제로 컴파일되어 사용됩니다. 특히이 경우,이 오류 코드로 종료에서 프로그램을 유지 , 모든 실행에, 오히려에만이 코드를 종료 할 때Select Casetruthy3Return without GoSubn=3
테일러 스콧

7

Turtlèd, 4 바이트, 2 개의 종료 코드

더 많은 종료 코드를 얻는 방법이 있는지 모르겠습니다 ... 인터프리터 언어로 더 많은 방법이 있습니까?

네 가지 길이의 답변을 찾았습니다

' ?;

온라인으로 사용해보십시오!

!.(0

온라인으로 사용해보십시오!

?;(*

온라인으로 사용해보십시오!

작동 방식 :

' ?;

인터프리터에는 메모리의 그리드에 둘 이상의 줄이 있고 공백이 아닌 문자가 없을 때 오류를 발생 시키는 버그 기능이 있습니다. 이 프로그램은 원점 셀에서 *를 지우고 '[space]음이 아닌 정수 입력 ?(실제로 0 또는 1)을 취하고 그 수만큼 아래로 이동합니다. ;0이면 그리드에는 한 줄만 있고 오류는 없습니다. 그렇지 않으면 아래로 이동합니다 오류가 발생합니다

!.(0

괄호와 내용은 구문 분석되지 않으며 런타임에 실행되어 "셀 기호가 올바르지 않은 경우 일치하는 Paren으로 건너 뜁니다"를 의미합니다. 이 프로그램에서 ( !)을 입력 하면 프로그램이 셀에 프로그램을 작성하고 ( .), paren을 실행하여 셀 기호가 0인지 확인하고, 일치하는 paren으로 건너 뛰려고 시도하지만 대신에 오류가 발생합니다. . 그것이 0이면, 그것을 기록하고, 괄호를 점검하고, 0에서 자신을 찾은 후, 그것을 무시하고, 프로그램이 끝난다

?;(*

이전 답변의 요소와 첫 번째 요소가 있습니다. 음이 아닌 정수 입력을 취하고 그 아래로 내려 가서 셀이 '*'인지 확인하여 존재하지 않는 여분의 paren을 검색합니다. 입력이 1이면 시작 공간에서 벗어나 셀이 공백임을 발견하고 0이면 오류가 시작 공간에 머무르고 파렌을 무시합니다.


7

자바 스크립트 (노드), 19 바이트, 2 개의 종료 코드

전체 프로그램 :

+process.argv[2]&&a

기능:

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

process.argv노드 실행 파일 경로, 실행 된 javascript 파일 경로 및 명령 행 인수를 포함하는 배열입니다. 이 경우 이것은 "1"또는 "0"입니다. 문자열은 단항 +연산자 를 사용하여 숫자로 변환됩니다 . 숫자가 0이면 게으른 &&연산자는 오른쪽을 평가하지 않으며, 숫자가 사실이 아닌 경우 (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

스칼라, 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

파이썬 3 , 15 바이트, 2 개의 종료 코드

파이썬 3에서는를 호출하지 않고 리터럴 입력을받을 수 없기 때문에 이것은 파이썬 2 솔루션 보다 더 깁니다 eval. 그러나 문자열 비교 기술을 흥미롭게 사용할 수 있습니다 ...

1/(input()<'1')

입력은 문자열 0이거나 1-1 인 경우 조건이 0 (거짓)으로 평가되어 1 / 0명백하게 충돌하는 코드 (종료 코드 1) 를 계산 합니다. 그렇지 않으면 아무 일도 일어나지 않으며 파이썬은 정규 종료 코드 0으로 종료됩니다.

내가 아는 한, 파이썬은 다른 종료 코드와 충돌 할 수 없습니다.


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을 빼고 '0'정수 (0 또는 1)) 정수 (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

파이썬 2, 11 바이트, 종료 코드 2 개

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

세 가지 다른 오류에 대한 세 가지 다른 11 바이트 솔루션! (재미있게, 이것은 포인트를주지 않습니다.) 기본적으로 파이썬은 종료 코드 0 만 성공적으로 종료하고 오류 1을 나타냅니다. 성공적인 런은 아무것도 출력하지 않습니다.

 1>>-input()

입력 1에서 "ValueError : negative shift count"를 제공합니다. 입력 0에서 제로 시프트 카운트가 성공하고 1을 제공합니다.

1/~-input()

입력 1에서 ~-input()일명 input()-10 으로 인해 "ZeroDivisionError : 0으로 정수 나누기 또는 모듈로 제로"를 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

종료 코드 0 , 1 , 137 (사멸) 및 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 RET0x1000에 단순 하지만 호출 RAND USR 4097된 경우 LD 피연산자가 누락되어 기계 코드가 왜곡됩니다. 나는 모든 ROM 호출을 기억하지는 않지만 모든 합법적 / 우아한 목적을 해결하고 나중에 제외시킬 것입니다.
Shaun Bebbers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.