Beenden Sie Code Golf


55

Inspiriert von dieser Standardeinstellung für IO .

Die Aufgabe

Schreiben Sie ein Programm, das bei einer Ganzzahl xzwischen 0 und 255 mit Exit-Code abstürzt x.

Beschränkungen

  • Sie dürfen nichts aufrufen, was direkt für die Ausgabe von Exit-Codes ( System.exit(x), die Rückkehr von mainusw.) vorgesehen ist. Stattdessen muss Ihr Programm einen Fehler oder Absturz verursachen, der mit einer Wahrscheinlichkeit von 1 dazu führt, dass das Programm mit der eingegebenen Ganzzahl beendet wird.
    • In diesem Fall bedeuten die Wörter "Fehler" und "Absturz", dass das Programm eine schwerwiegende, unbeabsichtigte Ausnahme verursacht hat, bei der eine Methode, ein Vorgang oder eine andere falsche Methode verwendet wurde, die einen irreversiblen Fehler verursachte.
    • Sie können den Fehler nicht direkt verursachen, indem Sie ihn direkt auslösen. Sie müssen es mit einer Methode, Funktion oder auf andere Weise verursachen, deren Zweck einer anderen Funktion dient (dh der Versuch, einen Dateischreibvorgang in ein schreibgeschütztes Verzeichnis auszuführen).
  • Sie müssen mindestens zwei Exit-Codes in Ihrem Programm haben.
  • Die Beendigung des Prozesses unter Verwendung von Signalen ist verboten. (Argumentation kann in dieser Diskussion gefunden werden )

Wertung

Die Punktzahl Ihres Programms wird durch die Anzahl der unterstützten Beendigungscodes bestimmt, bei denen die Codekonzision gleichbedeutend ist. Die größte Anzahl unterstützter Exit-Codes gewinnt!


Nur um zu verdeutlichen, wenn ich einen Fehler mache, ist das ja illegal?
Anthony Pham

@AnthonyPham Wenn Sie es direkt erhöhen ( throw new Exception()style), ist das illegal. Wenn es das Nebenprodukt des Missbrauchs einer vorhandenen Funktion ist, dann ist das in Ordnung.
Addison Crump

@VoteToClose Ich glaube, ich war nicht klar genug. Ich stimme Ihnen zu, aber ich habe vorgeschlagen, statt Fakultät, Quadrat zu sagen. Aber was auch immer, es ist eigentlich egal, war nur ein Vorschlag
Maltysen

8
Ist es one zero zeroakzeptabel , Eingaben als buchstabierte englische Ziffern (z. B. für 100) zu akzeptieren? Ich habe eine Idee für diese Herausforderung, aber die Sprache hat einige ziemlich ungewöhnliche Ideen zu E / A, und dies ist das natürlichste Eingabeformat.

5
Ich würde Exit Code Golfing als einen Clickbait-Titel ansehen, obwohl er korrekt ist. <(° _ ° <)
RaisingAgent

Antworten:


48

Unix-Shell (+ ncurses + BSD-Dienstprogramme), 36, 26 Bytes, 256 Exit-Codes

Golf gespielt

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

Wenn die Option -S verwendet wird, sucht tput in jeder Zeile nach Fehlern. Wenn Fehler gefunden werden, wird der Exit-Code auf 4 plus die Anzahl der fehlerhaften Zeilen gesetzt. Wenn keine Fehler gefunden werden, lautet der Beendigungscode 0. Es kann nicht angegeben werden, welche Leitung ausgefallen ist, sodass der Beendigungscode 1 niemals angezeigt wird. Die Exit-Codes 2, 3 und 4 behalten ihre übliche Interpretation bei.

Sobald der tput- Exit-Code 255 überschreitet, läuft er einfach über, sodass 253 (Fehler bei der Eingabe) den Exit-Code 1 usw. ergibt und somit den gewünschten Exit-Status für den gesamten Bereich von Eingaben ergibt.

Hinweis : Ob tput beim Festlegen / Abrufen einer bestimmten Funktion fehlschlägt, hängt vom verwendeten Terminaltyp ab:xterm with 256 colors

jot ist ein BSD- Dienstprogramm, das sequentielle oder zufällige Daten druckt. Auf OSX-Systemen ist (AFAIK) auch sofort verfügbar.

Wenn Ihr System nicht jotverfügbar ist, können Sie eine etwas längere (29 Byte) Version verwenden:

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

Probieren Sie es online! (die 29-Byte-Version)


Wow, das ist ziemlich gut. +1
Addison Crump

45

Bash 4.2 + Extras, 24 Exit-Codes

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

Vielen Dank an @ KenY-N für 3 Exit-Codes. Vielen Dank an @ el.pescado für 1 Exit-Code.

Nachprüfung

Alle Tests wurden unter openSUSE 13.2 durchgeführt.

$ 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
Beenden Sie Code 5:http_proxy=fafa curl http://example.org
el.pescado

1
@ el.pescado Es hat über ein Jahr gedauert, aber ich habe endlich deinen Vorschlag umgesetzt. Danke!
Dennis

30

INTERCAL (C-INTERCAL), 15 Codes, 313 + 2 = 315 Bytes

        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

Probieren Sie es online!

Alle Leerzeichen sind hier irrelevant. (Das ursprüngliche Programm enthielt Tabulatoren, aber ich habe sie in Leerzeichen konvertiert, damit sie in SE korrekt ausgerichtet sind. Es ist üblich, für INTERCAL eine Tabulatorenbreite von 8 zu verwenden. Ich habe eine Version des Programms mit allen Tabulatoren und Leerzeichen getestet , und Zeilenumbrüche gelöscht, und es funktioniert gut.)

Kompilieren Sie mit -abm(2-Byte-Strafe, da -bder Compiler deterministisch sein muss).

Wie üblich für INTERCAL, nimmt diese numerische Eingabe in das Format, zB ONE TWO THREEfür 123.

Erläuterung

Wenn ein C-INTERCAL-Programm ausfällt, ist der Exit-Status der Fehlercode modulo 256. Als Ergebnis können wir versuchen, ein Programm zu schreiben, das in der Lage ist, so viele Laufzeitfehler wie möglich zu erzeugen. Dieses Programm lässt nur zwei Laufzeitfehler aus, die keine internen Compilerprobleme anzeigen: ICL200I, da für die Reproduktion externe Bibliotheken erforderlich sind, die nur mit einem Single-Thread-Programm kompatibel sind (und bei Multithread-Programmen sind mehr Fehler verfügbar). und ICL533I, da 533 den gleichen Wert modulo 256 wie 277 hat und das Programm ICL277I erzeugen kann.

Das Programm startet immer auf die gleiche Weise. Zuerst geben wir ( WRITE IN) einen Wert für die Variable ein .1. Dann verwenden wir eine berechnete CREATEAnweisung, um eine neue Syntax zu erstellen (hier, A). Da die Syntax berechnet wird, hängt sie vom Wert von ab .1. Schließlich führen wir in den meisten Fällen unsere neue AAnweisung aus, die als fehlerhaft definiert wurde. Die Tabelle der möglichen Definitionen enthält eine Definition für jeden möglichen Laufzeitfehler (mit Ausnahme der oben aufgeführten Ausnahmen).

Erstens gibt es zwei Ausnahmen von diesem allgemeinen Schema. (0)ist keine gültige Zeilennummer. Wenn der Benutzer also etwas eingibt ZERO, springen wir (8)mithilfe einer berechneten COME FROMAnweisung von der zweiten (nummerierten ) zur vierten Zeile . Dies führt dann zu einem Syntaxfehler DO X, der zu Fehlern führt ICL000I. (In INTERCAL treten zur Laufzeit Syntaxfehler auf, die auf die Tendenz zurückzuführen sind, Befehle zu deaktivieren, die Syntax unter Ihnen neu zu definieren usw.). Die COME FROMAnweisung hat auch dann eine Nebenwirkung, wenn kein tatsächliches COME FROMEreignis eintritt. Sie erzeugt eine Operandenüberladung von .1bis, #1wenn eine Zeile mit einer Zeilennummer ausgeführt wird. Dies wird später bei der Ausgabe von 21 verwendet. (Zufällige globale Nebenwirkungen sind in INTERCAL ziemlich idiomatisch.)

Die andere Ausnahme betrifft die Eingabe ONE TWO NINE. Das (129)Programm enthält keine Zeilennummer , daher erhalten wir eine Fehlermeldung für eine fehlende Zeilennummer ICL129I. Ich musste also überhaupt keinen Code schreiben, um diesen Fall abzudecken.

Hier sind die anderen Fehler und deren Ursachen:

  • 123 ist ein NEXTStapelüberlauf ( DO (123) NEXT). Die NEXTAnweisung benötigt andere Modifikatoren ( FORGEToder RESUME), um rückwirkend zu bestimmen, um welche Art von Steueranweisung es sich handelt. Wenn diese nicht vorhanden sind, wird der Fehler ICL123I ausgelöst, sobald 80 ungelöste `NEXT-Anweisungen vorliegen.
  • 222 ist ein Stash-Überlauf ( DO STASH .2in einer COME FROMSchleife). Die Stashes sind nur durch den verfügbaren Speicher begrenzt, aber dieser wird irgendwann ausgehen und den Fehler ICL222I verursachen.
  • 240 ist Dimensionen ein Array mit der Größe Null. Genau das DO ,1 <- #0bedeutet, und es verursacht den Fehler ICL240I.
  • 241 wird durch Zuweisen außerhalb der Grenzen eines Arrays verursacht. In diesem Fall ,1wurde keine Zuordnung vorgenommen ( ,wird für Variablen vom Typ Array in INTERCAL verwendet). Die Indizierung verursacht daher den Fehler ICL241I.
  • 19 weist #256 $ #0einer 16-Bit-Variablen 65536 ( ) zu .2. Es passt nicht und verursacht den Fehler ICL275I.
  • 21 ordnet #2an .1. Das sieht vielleicht einfach aus, aber wir haben es überladen .1, um es #1früher zu meinen , und der Versuch, den Wert 1 ohne -vOption in der Befehlszeile zu ändern , verursacht den Fehler ICL277I.
  • 148 Versuche, zum obersten Eintrag des Auswahlpunktstapels ( GO BACK) zurückzukehren, der zu diesem Zeitpunkt im Programm noch nicht vorhanden ist (wir haben keine Befehle zum Bearbeiten des Auswahlpunktstapels ausgeführt, daher ist dieser noch leer). Das verursacht Fehler ICL404I.
  • 180 Versuche RETRIEVE .2von einem nicht existierenden Stash (weil wir dort nichts in diesem Zweig des Programms versteckt haben), was den Fehler ICL436I verursacht.
  • 50 Requests input ( WRITE IN) für immer in einer COME FROMSchleife. Irgendwann werden wir nach dem EOF lesen und den Fehler ICL562I verursachen.
  • 109 führt die Anweisung aus DO RESUME #0, die bedeutungslos und spezifisch als fehlerverursachend dokumentiert ist (ICL621I).
  • 120 führt die Anweisung aus DO RESUME #9. Wir haben noch nicht so viele NEXTAnweisungen ausgeführt und erhalten daher den Fehler ICL120I. (Interessanterweise wird dieser bestimmte Fehler in der INTERCAL-Dokumentation so definiert, dass er das Programm normal beendet und dann den Fehler verursacht, anstatt das Programm mit einem Fehler zu beenden. Ich glaube jedoch nicht, dass diese beiden Fälle sich merklich unterscheiden.)
  • 223 ist im Grunde ein komplexes Gewirr von Multithreading-Grundelementen, die alle auf Zeile 223 verweisen und eine Endlosschleife verursachen, die den Speicher in die Luft sprengt. Möglicherweise ist der Speicher im Multithreading-Subsystem erschöpft, was zum Fehler ICL991I führt.
  • 121 ist eigentlich eine gültige Aussage (es ist ein Kommentar), aber sie erscheint am Ende des Programms. Daher fällt die Ausführung unmittelbar nach der Ausführung des Programms vom Programmende ab, wodurch der Fehler ICL633I verursacht wird.

Nachprüfung

Einige der Fehler bestehen darin, dass das Programm absichtlich nicht genügend Arbeitsspeicher hat. Ich empfehle daher, relativ kleine Arbeitsspeicherlimits festzulegen. Hier ist der Shell-Befehl, den ich zum Testen des Programms verwendet habe (mit Zeilenumbrüchen, die der Lesbarkeit halber hinzugefügt wurden; löschen Sie sie, wenn Sie sie selbst ausführen):

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

Und hier ist die Ausgabe (mit den Zeilennummern und "BITTE KORREKTURIEREN" -Nachrichten, die aus Platzgründen gelöscht wurden), die ich teilweise hinzugefügt habe, um die Funktionsweise des Programms zu demonstrieren, aber hauptsächlich, um die albernen Fehlermeldungen von INTERCAL zu demonstrieren:

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
Dies ist möglicherweise das größte INTERCAL-Programm, das ich je gesehen habe.
Skyler

27

Perl, 108 Bytes, 256 Exit-Codes

Dieses Programm (ab) verwendet das Modul Test :: More . Es wird versucht, die Datei mit dem Namen "" n mal zu öffnen, wobei n als Befehlszeilenargument angegeben wird. Es schlägt jedes Mal fehl und jeder Aufruf wird als Test behandelt. Test :: Mehr Anzahl fehlgeschlagener Tests als Exit-Code. plan tests => $ARGV[0]%255wird benötigt, um den Exit-Code 255 zu erhalten.

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

Golfed: perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'51 Bytes (38 Bytes + 13 Bytes für -MTest::More<space>). Übernimmt die Eingabe für stdin.
ThisSuitIsBlackNot

27

C90 (gcc), 256 Exit-Codes, 28 27 18 Bytes

main(){getchar();}

Ich bin mir nicht sicher , ob das klug oder cheaty ist, aber ich glaube nicht , dass die Regeln verletzt , wie geschrieben: es ist technisch nicht zu verwenden exit, returnoder ein Fehler Mechanismus werfen, sondern verlässt sich einfach auf undefinierten Verhalten und die Tatsache , dass gcc tut etwas ziemlich Bequemes, was diese Herausforderung angeht.

Probieren Sie es online!

Wie es funktioniert

Dies wird einfach verwendet getchar, um ein Byte von STDIN zu lesen. Dies allein macht nichts.

Ein kompatibles C90-Programm muss jedoch mit einer returnAnweisung oder etwas Äquivalentem enden . alles andere ist undefiniertes Verhalten. gcc beendet die generierte Assembly rettrotzdem mit einem , sodass der zufällige Wert im Register EAX vom Programm zurückgegeben wird. Glücklicherweise getcharspeichert glibc das von STDIN gelesene Byte in EAX, so dass der Wert dieses Bytes der Exit-Code unseres Programms ist.


Es wäre interessant zu sehen, ob dies geändert werden kann, um die 8-Bit-Barriere zu durchbrechen, indem eine Shell wie jsh verwendet wird , die dies unterstützt set -o fullexitcode.
Zeppelin

1
Das ist schlau. Aber das Programm stürzt dann eigentlich nicht ab. Es gibt normalerweise, ob die Spezifikation zu „einen schwerwiegenden Ausnahme / irreversible Ausfall / Absturz zu verursachen“ ist
dim

So oder so, das ist großartig.
Quentin

4
@dim Ich denke, das hängt von deiner Definition des Absturzes ab. Das Nicht-Beenden von main mit returnoder exitist nach C90-Standard ein Fehler und führt zu einem Exit-Code, der auf einen Fehler hinweist. Das ist alles, was ein Absturz ausmacht.
Dennis

Ein Absturz ist ein Programm, das anhält, um ordnungsgemäß zu funktionieren. Ihr Programm tut alles, was Sie ihm befohlen haben, richtig, liest ein Zeichen von der Eingabe und stoppt dann. Obwohl der Exit-Code einen Fehler anzeigt, ist er nicht abgestürzt.
Findusl

19

C (gcc) unter der Bash-Shell auf x86, 230 Bytes, 8 Exit-Codes

Neue Zeilen zur besseren Lesbarkeit hinzugefügt. Kommentare in der Partitur ignoriert.

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 */
}
}

Ein Feature der Bash-Shell:

Wenn ein Befehl bei einem schwerwiegenden Signal N beendet wird, verwendet bash den Wert 128 + N als Beendigungsstatus.

Alles, was wir tun müssen, ist, verschiedene Signale innerhalb eines AC-Programms auszulösen. An dieser Stelle gehe ich davon aus, dass einfaches Tun kill(n-128);verboten ist. Stattdessen führen wir Code aus, der verschiedene Signale auslöst, wodurch die entsprechenden Fehlercodes in der aufrufenden Shell verfügbar gemacht werden.

Die Exit-Codes sind 0, 130, 133, 134, 136, 139, 141, 142.

Probieren Sie es online aus . Erweitern Sie den Abschnitt "Debug", um den Rückkehrcode anzuzeigen.

Dies kann sicherlich tiefer golfen werden. Aber ich wäre mehr daran interessiert, mehr Signale hinzuzufügen.


Wäre es richtig anzunehmen, dass die Signale durch bereits vorhandene Funktionen oder Vorgänge außerhalb Ihres Codes verursacht werden?
Addison Crump

1
@VoteToClose ja, das stimmt. Führt beispielsweise __asm("UD2")die x86-Anweisung "undefined" aus, die eine CPU-Ausnahme verursacht, die vom Kernel in Form eines SIGILL-Signals an das Programm weitergeleitet wird. Im socketpairBeispiel wird SIGPIPE vom Kernel oder von glibc gesendet, während wir versuchen, write()zu einer Pipe zu gelangen, die close()am anderen Ende d war.
Digitales Trauma

1
Dann habe ich kein Problem damit. : P
Addison Crump

1
Sie können 1) zwei Zeichen ausgeben, wenn Sie verwenden, int3und int $32) ein Zeichen, wenn Sie vals deklarieren int**, vorausgesetzt, Sie verlassen sich nicht grundsätzlich auf die char-ness des Datentyps in Ihrer Zeigerarithmetik, plus 3) zwei Zeichen, wenn Sie verwenden *pAnstelle von p[0]oder 4) sechs Zeichen, wenn Sie bereit sind, sich auf die vorhersagbaren fdZahlen zu verlassen, die von allen Systemaufrufen zurückgegeben werden, die sie erstellen, p[0]und sie p[1]durch ihre beinahe bestimmten Werte zu ersetzen . Schließlich pipe(fd)ist viel kürzer als socketpair(...)und erzeugt den gleichen Fehler beim Schließen fd[0]und Schreiben. fd[1].
Ich werde nicht existieren Idonotexist

2
Einige zusätzliche Golfvorschläge: 1) Verwenden Sie &63anstelle von -128. 2) Ersetzen sleep(2)durch for(;;). 3) Ersetzen c=*(int*)cdurch atoi(0). 4) Ersetzen c/=c-2durch c/=0.
Nwellnhof

10

Python 2, 13 Bytes, 2 Exit-Codes

1/(input()-1)

Wenn Sie 0 eingeben, wird versucht zu drucken, 1/-1was -1 ist, was vollkommen in Ordnung ist. Beenden Sie also Code 0. Wenn Sie 1 eingeben, erhalten Sie, 1/0was einen auslöst, ZeroDivisionErrorin dem es einen Beenden-Code von 1 gibt. Bei meiner IDE gibt es nur 0 und 1 für die Exit-Codes ...

Ausgänge:


Bildbeschreibung hier eingeben


Bildbeschreibung hier eingeben


10

PHP, 15 Bytes, 2 Exit-Codes

Ohne die/ exitkann PHP nichts anderes als 0oder 255(afaik; wahrscheinlich ~1) zurückgeben, also ...

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

Wenn das Befehlszeilenargument falsch ist, wird es mit ausgewertet 1und beendet 0. Andernfalls wird versucht, eine Funktion aufzurufen, und es wird mit beendet <b>Fatal error</b>: Uncaught Error: Call to undefined function p().

Laufen Sie mit -r.


5
Das ist nicht wahr. exit()Setzt einen Exit-Status, den Sie für diese Herausforderung nicht verwenden können. Ihr Code ist aber auch ungültig. Es setzt den Ausgangsstatus auf 255
ungefähr am

@aross: Hmm, ich habe immer angenommen, dass der Fehler mit enden würde 1. Ich habe nach einer Liste von Exit-Codes gesucht, aber keinen gefunden.
Titus

10

Excel VBA, 414 514 533 + 3 Bytes, 14 Beendigungscodes

Nimmt als Eingabe ein Conditional Compilation Argument, n=[input value]und erzeugt , die Anzahl der zugeordneten Fehlercode.

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 für n=[Value]bedingten Kompilierungsaufruf

Verarbeitet Eingaben, bei denen n=

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

Hinweis: VBA hat keine Exit-Codes 0oder 1. Ich habe die Lösungen für 3und hinzugefügt 5, die die beiden Exit-Codes mit der niedrigsten Nummer sind, die VBA an ihrer Stelle zur Verfügung stellt


1
Ich werde diese Antwort nicht ablehnen, da sie aufgrund der Sprachfähigkeit für Ausgabetypen auch für mich nicht zulässig ist.
Addison Crump

1
Was macht der #hier?
BruceWayne

Die #ifund #ElseIfsind bedingte Kompilierungsanweisungen, was bedeutet, dass die folgenden Anweisungen nur kompiliert werden, wenn die Bedingung erfüllt ist
Taylor Scott

1
Also, wenn sie nicht wahr sind, werden die Aussagen nicht kompiliert ... das ist etwas anderes als nicht zu verwenden #, wo sie kompiliert würden, ob die Aussagen wahr sind oder nicht? Ich weiß, wie IfAnweisungen funktionieren, aber ich bin neu darin, zu verstehen , was tatsächlich kompiliert wird , und entschuldige mich für eine so einfache Frage.
BruceWayne

1
@ BruceWayne, ja, das ist genau der Fall. Da diese Zeilen so konzipiert sind, dass sie bestimmte Fehler auslösen, ist es erforderlich, dass nur die Zeilen, die den gewünschten Fehlercode erzeugen, zu einem bestimmten Zeitpunkt kompiliert werden. Zu diesem #ifZweck werden anstelle von Ifoder Select Casenur truthybedingte Anweisungen tatsächlich kompiliert. In diesem Fall speziell, hält dies das Programm vom Verlassen mit dem Fehlercode 3, Return without GoSubbei jeder Ausführung, sondern nur mit diesem Code verlässt , wennn=3
Taylor Scott

7

Turtlèd, 4 Bytes, 2 Exit-Codes

Ich weiß nicht, ob es Möglichkeiten gibt, mehr Exit-Codes zu erhalten ... gibt es noch mehr Möglichkeiten in der Interpretersprache?

Ich habe ein paar Antworten in vier Längen gefunden

' ?;

Probieren Sie es online!

!.(0

Probieren Sie es online!

?;(*

Probieren Sie es online!

Wie diese funktionieren:

' ?;

In meinem Interpreter gibt es eine Fehlerfunktion , die Fehler verursacht, wenn das Raster im Speicher mehr als eine Zeile enthält und keine nicht-Leerzeichen enthält. Dieses Programm löscht das * in der Ursprungszelle '[space], nimmt eine nicht negative Ganzzahleingabe ?(0 oder 1) und verschiebt sich so oft nach unten ;, wenn es Null ist, hat das Gitter nur eine Zeile und keinen Fehler, andernfalls verschiebt es sich nach unten und der Fehler wird auftreten

!.(0

Klammern und Zeug werden nicht analysiert, sondern nur zur Laufzeit ausgeführt, um zu bedeuten: "Springe zum passenden Paren, wenn das Zellsymbol nicht stimmt". In diesem Programm !bewirkt die Eingabe von ( ), dass das Programm es in die Zelle ( .) schreibt, den Paren ausführt, der prüft, ob das Zellsymbol 0 ist, versucht, zum passenden Paren zu springen, sondern stattdessen einen Fehler auslöst, da es keinen gibt . Wenn es null ist, schreibt es es auf, überprüft die Klammern, befindet sich auf einer 0 und ignoriert es dann und das Programm wird beendet

?;(*

hat Elemente der vorherigen Antwort und der ersten. Es wird eine nicht negative Ganzzahleingabe verwendet, die Anzahl verringert und überprüft, ob die Zelle '*' ist. Ist dies nicht der Fall, wird nach einem nicht vorhandenen zusätzlichen Paren gesucht. Wenn die Eingabe 1 ist, verlässt sie das Startfeld und stellt fest, dass die Zelle ein Leerzeichen ist. Wenn sie Null ist, bleibt sie im Startfeld und ignoriert den Paren.


7

Javascript (Knoten), 19 Bytes, 2 Exit-Codes

Volles Programm:

+process.argv[2]&&a

Funktion:

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

process.argvist ein Array, das den Pfad zur ausführbaren Datei des Knotens, den Pfad zur ausgeführten Javascript-Datei und die Befehlszeilenargumente enthält. In diesem Fall ist dies entweder "1"oder "0". Die Zeichenfolge wird mit dem unären +Operator in eine Zahl umgewandelt . Wenn die Zahl Null ist, &&wertet der Lazy Operator die rechte Seite nicht aus. Wenn die Zahl wahr ist (nicht Null), wird die rechte Seite von &&ausgewertet und ein Fehler ausgegeben , da sie auf eine undefinierte Variable verweist und das Programm existiert mit Exit-Code 1.

Die Funktion erwartet die Eingabe als Zahl. Wenn die Eingabe wahr ist, ruft die Funktion sich selbst auf und stürzt die Knotenlaufzeit mit einem Stapelüberlauf ab. Wenn die Eingabe 0 ist, gibt der Lazy &&Operator 0 zurück, ohne die rechte Seite auszuwerten.


@VoteToClose Wurde in eine undefinierte Variable
geändert

Das funktioniert. : P
Addison Crump

Das volle Programm kann auf gekürzt werden +process.argv[2]&&a.
user2428118

@ user2428118 Du hast Recht
corvus_192

Wäre das nur aus Neugier ReferenceError.prototype.name=process.argv[2]?a:0gültig?
Patrick Roberts

6

Perl 6 , 57 Bytes, 256 Exit-Codes

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

Try it
Dies ist eine Übersetzung des Perl 5-Beispiels.

Erweitert

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 Bytes, 2 Exit-Codes

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

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

Die JVM unterstützt nur 1 und 0 als Exit-Codes, wenn Sie nicht anrufen System.exit.

Das erste Programm versucht zu berechnen, 1/0ob das erste Argument ein 1Absturz der JVM mit dem Exit-Code 1 ist. Wenn das Argument 0 ist, wird es erfolgreich beendet.

Das zweite Programm, das das Argument in eine Ganzzahl umwandelt, subtrahiert eine und versucht, 1 durch diese Zahl zu dividieren. Wenn das Argument 1 ist, wird es berechnet 1/0, sodass die JVM abstürzt. Wenn das Argument 0 ist, wird es berechnet 1/-1und beendet.


5

Python 3 , 15 Bytes, 2 Exit-Codes

Dies ist offensichtlich länger als die Python 2-Lösung , da in Python 3 keine wörtliche Eingabe ohne Aufruf möglich ist eval. Interessanterweise können wir jedoch String-Vergleichstechniken verwenden ...

1/(input()<'1')

Die Eingabe ist entweder die Zeichenfolge 0oder 1- wenn es 1 ist, wird die Bedingung mit 0 (falsch) bewertet, was zu einem Versuch führt, zu berechnen, 1 / 0der offensichtlich abstürzt (Beendigungscode 1). Andernfalls passiert nichts und Python wird mit dem regulären Exit-Code 0 beendet.

Soweit mir bekannt ist, kann Python nicht mit anderen Exit-Codes abstürzen.


5

Java, 71 66 Bytes, 2 Exit-Codes

4 Bytes gespart dank Holger

Volles Programm:

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

Funktion, die ein int als Argument verwendet:

i->1/(i-1)

Das Programm verwendet das erste Zeichen des ersten Argumanten (entweder '0'oder, '1'und subtrahiert 48 (ASCII-Wert von '0'), um eine Ganzzahl (0 oder 1) zu erhalten. Anschließend versucht es, das Argument an der Position dieser Ganzzahl auf die leere Zeichenfolge zu setzen Die Eingabe ist 1, das Programm stürzt mit einem ab ArrayIndexOutOfBoundsException, da das Argumentarray nur ein Element an Position 0 hat (null-indiziert).


Sie können den Wert zuweisen oder auf andere Weise verwenden, z. B. als Array-Index a[a[0].equals("1")?1/0:1]="";, der mit gleichwertig ist int x=a[0].equals("1")?1/0:1;. Aber das Programm weiter zu ändern, um ein paar Bytes zu provozieren ArrayIndexOutOfBoundsExceptionanstatt zu ArithmeticExceptionsparen:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Holger

4

Python 2, 11 Bytes, 2 Exit-Codes

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

Drei verschiedene 11-Byte-Lösungen für drei verschiedene Fehler! (Nur zum Spaß, dies gibt keine Punkte.) Standardmäßig hat Python nur die Beendigungscodes 0 für einen erfolgreichen Abschluss und 1 für einen Fehler. Die erfolgreichen Läufe geben nichts aus.

 1>>-input()

Am Eingang 1 wird "ValueError: negative Shift Count" ausgegeben. Bei Eingabe von 0 ist eine Null-Verschiebungszählung erfolgreich und ergibt 1.

1/~-input()

Bei Eingabe 1 wird "ZeroDivisionError: Ganzzahldivision oder Modulo durch Null" ausgegeben, da ~-input(), auch input()-1als 0 bezeichnet. Bei Eingabe 1 wird 1/-1-1 ausgegeben . 0**-input()würde auch funktionieren.

0<input()<x

Bei Eingabe 1 wird "NameError: Name 'x' ist nicht definiert" ausgegeben. Bei Eingabe von 0 wird diese erste Ungleichung 0<0zu Falsch ausgewertet, der Rest wird also nicht ausgewertet und das Ergebnis ist nur Falsch.


2

Node.js (ES6), 77 Byte, 2 Exit-Codes

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

2

Gelee , 4 Exit-Codes, 18 Bytes

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

Unterstützt die Exit-Codes 0 , 1 , 137 (getötet) und 139 (Segmentierungsfehler).

Probieren Sie es online!

Wie es funktioniert

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 Bytes, 39 Exit-Codes (von 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

Dies könnte definitiv kürzer gemacht werden. SB hat nur Fehlercodes von 0 bis 51, und einige können nicht ausgelöst werden.


0

ZX81 BASIC> 255 Exit-Codes - 52 Bytes (Auflistung)

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

Technisch Nkönnte jede 24-Bit-Gleitkommazahl innerhalb des Bereichs sein, aber wir nehmen hier ganze Zahlen an. Zeile 2 entspricht der IF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1Angabe von ZX81 BASIC IF/ELSEin den symbolischen Anweisungen.


3
Wie befriedigt das the program caused some fatal unintended exception? Dies druckt nur einen Text aus und beendet die Ausführung.
AdmBorkBork

Sie haben recht - ich muss morgens wacher sein.
Shaun Bebbers

RAND USR Nwird unbeabsichtigte Auswirkungen haben, da das Aufrufen eines Teils des ROM von einem unerwarteten Ort aus keine gute Idee ist und daher RAND USR 0ausgeschlossen wurde, da dies zu anmutig ist.
Shaun Bebbers

Können Sie etwas genauer erläutern, wie das Programm tatsächlich abstürzt? Ich bin nicht sehr vertraut mit ZX81 BASIC.
AdmBorkBork

Das ROM befindet sich von 0x0000 - 0x1fff; Das Aufrufen von ROM-Routinen funktioniert, wenn Sie an der richtigen Stelle beginnen. Das Starten eines oder mehrerer Bytes in einer beliebigen Maschinencode-Routine in Z80 führt zu unerwarteten Effekten. Wenn Sie ein einfaches LD BC, 0000 RST 10 RETbei 0x1000 haben, aber angerufen haben, RAND USR 4097dann verpassen Sie den LD-Operanden und der Maschinencode wird daher verzerrt. Ich erinnere mich nicht an alle ROM-Aufrufe, aber ich werde alle legalen / würdevollen Zwecke ausarbeiten und sie später ausschließen.
Shaun Bebbers
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.