Exit Code Golfing


55

Ispirato da questo valore predefinito per IO .

L'obiettivo

Scrivi un programma che, dato un numero intero di input xcompreso tra 0 e 255, si arresti in modo anomalo con il codice di uscita x.

restrizioni

  • Non è possibile chiamare nulla che sia destinato direttamente all'output del codice di uscita ( System.exit(x), ritorno da main, ecc.). Al contrario, il programma deve causare un errore o un arresto anomalo che causerà, con una probabilità di 1, la chiusura del programma con il numero intero di input.
    • In questo caso, le parole "errore" e "arresto anomalo" indicano che il programma ha causato un'eccezione non intenzionale fatale, in cui un metodo, un'operazione o altrimenti sono stati utilizzati in modo errato che ha causato un errore irreversibile.
    • Non puoi causare direttamente l'errore lanciandolo direttamente. È necessario causarlo utilizzando un metodo, una funzione o altrimenti il ​​cui scopo ha una funzione diversa (ovvero tentare di eseguire una scrittura di file in una directory di sola lettura).
  • È necessario che nel programma siano presenti almeno due codici di uscita.
  • La conclusione del processo con l'uso di segnali è vietata. (Il ragionamento può essere trovato in questa discussione )

punteggio

Il punteggio del tuo programma è determinato dal numero di codici di uscita supportati, in cui la concisione del codice è tiebreaker. Vince il maggior numero di codici di uscita supportati!


Solo per chiarire, se sollevo un errore, è illegale sì?
Anthony Pham,

@AnthonyPham Se lo rilanci direttamente ( throw new Exception()stile), è illegale. Se è il sottoprodotto dell'abuso di una funzione esistente, allora va bene.
Addison Crump,

@VotoToClose Immagino di non essere stato abbastanza chiaro. Sono d'accordo con te, ma suggerivo, diciamo quadrato, invece di fattoriale. Ma qualunque cosa, non importa, era solo un suggerimento
Maltysen il

8
Accettare input come cifre scritte in inglese (ad es. one zero zeroPer 100) è accettabile? Ho un'idea per questa sfida, ma il linguaggio ha alcune idee abbastanza insolite sull'I / O, e questo è il formato di input più naturale.

5
Considererei Exit Code Golfing un titolo clickbait, anche se è accurato. <(° _ ° <)
RaisingAgent

Risposte:


48

Unix Shell (+ ncurses + utility BSD), 36, 26 byte, 256 codici di uscita

golfed

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

Se si utilizza l'opzione -S, tput controlla gli errori da ciascuna riga e, se vengono rilevati errori, imposterà il codice di uscita su 4 più il numero di righe con errori. Se non vengono rilevati errori, il codice di uscita è 0. Nessuna indicazione di quale linea non riuscita può essere fornita, quindi il codice di uscita 1 non verrà mai visualizzato. I codici di uscita 2, 3 e 4 mantengono la loro consueta interpretazione.

Una volta che il codice di uscita tput supera 255, trabocca semplicemente, quindi 253 (errori sull'input) comporterà il codice di uscita di 1 ecc., Ottenendo così lo stato di uscita desiderato per l'intero intervallo di input.

Nota : se tput non funzionerà, quando si imposta / si ottiene una particolare capacità, dipende dal tipo di terminale, ho usato:xterm with 256 colors

jot è un'utilità BSD , che stampa dati sequenziali o casuali e (AFAIK) è disponibile anche su sistemi OSX.

Se il tuo sistema non è jotdisponibile, puoi utilizzare una versione leggermente più lunga (29 byte):

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

Provalo online! (la versione da 29 byte)


Wow, va abbastanza bene. +1
Addison Crump,

45

Bash 4.2 + extra, 24 codici di uscita

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

Grazie a @ KenY-N per 3 codici di uscita. Grazie a @ el.pescado per 1 codice di uscita.

Verifica

Tutti i test sono stati eseguiti su 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
Codice di uscita 5:http_proxy=fafa curl http://example.org
el.pescado,

1
@ el.pescado Mi ci è voluto più di un anno, ma ho finalmente implementato il tuo suggerimento. Grazie!
Dennis,

30

INTERCAL (C-INTERCAL), 15 codici, 313 + 2 = 315 byte

        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

Provalo online!

Tutto lo spazio qui è irrilevante. (Il programma originale conteneva schede, ma le ho convertite in spazi in modo che si allineassero correttamente su SE; è convenzionale usare una larghezza di scheda di 8 per INTERCAL. Ho testato una versione del programma con tutte le schede, gli spazi e le nuove righe cancellate, tuttavia, e funziona bene.)

Compilare con -abm(penalità di 2 byte, perché -bè necessario che il compilatore sia deterministico).

Come al solito per INTERCAL, questo richiede un input numerico nel formato, ad es . ONE TWO THREEPer 123.

Spiegazione

Quando un programma C-INTERCAL si guasta, lo stato di uscita è il codice di errore modulo 256. Di conseguenza, possiamo mirare a scrivere un programma in grado di produrre il maggior numero possibile di errori di runtime. Questo programma omette solo due errori di runtime che non indicano problemi del compilatore interno: ICL200I, perché la riproduzione richiede l'uso di librerie esterne che sono compatibili solo con un programma a thread singolo (e i programmi multithread hanno più errori disponibili); e ICL533I, perché 533 ha lo stesso valore modulo 256 di 277 e il programma è in grado di produrre ICL277I.

Il programma si avvia sempre allo stesso modo. Innanzitutto, inseriamo ( WRITE IN) un valore per la variabile .1. Quindi, usiamo CREATEun'istruzione calcolata per creare una nuova sintassi (qui, A); ma poiché è calcolato, la definizione della sintassi varia in base al valore di .1. Infine, nella maggior parte dei casi eseguiamo la nostra nuova Adichiarazione, che è stata definita per produrre un errore; la tabella delle possibili definizioni che abbiamo contiene una definizione per ogni possibile errore di runtime (tranne le eccezioni sopra elencate).

Innanzitutto, ci sono due eccezioni a questo schema generale. (0)non è un numero di riga valido, quindi se l'utente inserisce ZERO, passiamo dalla seconda riga (numerata (8)) alla quarta riga mediante COME FROMun'istruzione calcolata . Questo quindi si traduce in un errore di sintassi DO X, che produce errori ICL000I. (In INTERCAL, errori di sintassi si verificano in fase di esecuzione, a causa della tendenza dei comandi a essere disabilitati, alla sintassi da ridefinire sotto di te, ecc.). L' COME FROMaffermazione ha anche un effetto collaterale, anche se non effettivo COME FROMaccade, creando un sovraccarico operando da .1a #1quando viene eseguita una linea con un numero di riga; questo viene usato in seguito durante la produzione dell'uscita 21. (Gli effetti collaterali globali casuali sono abbastanza idiomatici in INTERCAL.)

L'altra eccezione è con l'input ONE TWO NINE. Non esiste un numero di riga (129)nel programma, quindi viene visualizzato un errore per un numero di riga mancante, ovvero ICL129I. Quindi non ho dovuto scrivere alcun codice per coprire quel caso.

Ecco gli altri errori e cosa li causa:

  • 123 è uno NEXTstack overflow ( DO (123) NEXT). L' NEXTistruzione necessita di altri modificatori ( FORGETo RESUME) per determinare retroattivamente quale tipo di istruzione di controllo fosse. Non avendo queste cause si verifica l'errore ICL123I una volta che ci sono 80 istruzioni NEXT non risolte.
  • 222 è un overflow stash ( DO STASH .2in un COME FROMciclo). Gli stash sono limitati solo dalla memoria disponibile, ma alla fine si esauriranno, causando l'errore ICL222I.
  • 240 è dimensioni un array per dimensione zero. Questo è esattamente ciò che DO ,1 <- #0significa e causa l'errore ICL240I.
  • 241 è causato dall'assegnazione al di fuori dei limiti di un array. In questo caso, ,1non è stato allocato ( ,viene utilizzato per le variabili di tipo array in INTERCAL), quindi l'indicizzazione causa l'errore ICL241I.
  • 19 assegna 65536 ( #256 $ #0) a una variabile a 16 bit .2. Non si adatta, causando errore ICL275I.
  • 21 assegna #2a .1. Potrebbe sembrare un compito abbastanza semplice, ma abbiamo sovraccarico .1di significato in #1precedenza e il tentativo di modificare il valore di 1 senza alcuna -vopzione sulla riga di comando provoca l'errore ICL277I.
  • 148 tentativi di tornare alla voce principale dello stack choicepoint ( GO BACK), che non esiste a questo punto nel programma (non abbiamo eseguito alcun comando per manipolare lo stack choicepoint, quindi è ancora vuoto). Ciò causa l'errore ICL404I.
  • 180 tentativi di eseguire RETRIEVE .2uno stash inesistente (perché non abbiamo nascosto nulla in questo ramo del programma), causando l'errore ICL436I.
  • 50 richieste input ( WRITE IN) per sempre in un COME FROMciclo. Alla fine finiremo per leggere EOF passato, causando l'errore ICL562I.
  • 109 esegue l'istruzione DO RESUME #0, che è insignificante e specificamente documentata come causa di un errore (ICL621I).
  • 120 esegue la dichiarazione DO RESUME #9. Non abbiamo ancora eseguito così tante NEXTdichiarazioni e quindi otteniamo l'errore ICL120I. (Curiosamente, questo particolare errore è definito nella documentazione INTERCAL come uscire normalmente dal programma e quindi causare l'errore, piuttosto che uscire dal programma con un errore. Non credo che questi due casi siano notevolmente diversi, però.)
  • 223 è fondamentalmente un groviglio complesso di primitive multithreading che puntano tutte alla linea 223, causando un loop infinito che fa esplodere la memoria. Alla fine, c'è un esaurimento della memoria nel sottosistema multithreading, che porta all'errore ICL991I.
  • 121 è in realtà una dichiarazione valida (è un commento), ma appare alla fine del programma. Pertanto, l'esecuzione cade alla fine del programma immediatamente dopo l'esecuzione, causando l'errore ICL633I.

Verifica

Alcuni errori implicano l'esecuzione intenzionale della memoria del programma, quindi suggerisco di impostare limiti di memoria abbastanza piccoli. Ecco il comando shell che ho usato per testare il programma (con le nuove righe aggiunte per la leggibilità; eliminale se lo esegui da solo):

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

Ed ecco l'output (con i numeri di riga e i messaggi "PLEASE CORRECT SOURCE" cancellati per risparmiare spazio), che ho aggiunto in parte per dimostrare il funzionamento del programma ma soprattutto per mostrare i messaggi di errore stupidi di 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
Questo è forse il più grande programma INTERCAL che abbia mai visto.
Skyler,

27

Perl, 108 byte, 256 codici di uscita

Questo programma (ab) utilizza il modulo Test :: More . Tenta di aprire il file denominato "" n volte in cui n viene fornito come argomento della riga di comando. Ogni volta fallisce e ogni invocazione viene trattata come un test. Test :: Più numero di restituzione di test falliti come codice di uscita. plan tests => $ARGV[0]%255è necessario per ottenere il codice di uscita 255.

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

Golf: perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'51 byte (38 byte + 13 byte per -MTest::More<space>). Accetta input su stdin.
ThisSuitIsBlackNon

27

C90 (gcc), 256 codici di uscita, 28 27 18 byte

main(){getchar();}

Non sono sicuro se questo è intelligente o cheaty, ma io non credo che viola le regole scritte: tecnicamente non usa exit, returno qualsiasi errore di lancio meccanismo, ma semplicemente si basa sul comportamento non definito e il fatto che gcc fa qualcosa di piuttosto conveniente per quanto riguarda questa sfida.

Provalo online!

Come funziona

Questo semplicemente utilizza getcharper leggere un byte da STDIN. Di per sé, questo non fa nulla.

Tuttavia, un programma C90 conforme deve terminare con returnun'istruzione o qualcosa di equivalente; tutto il resto è un comportamento indefinito. gcc termina comunque l'assembly generato con un ret, quindi qualunque valore fosse casualmente nel registro EAX verrà restituito dal programma. Fortunatamente, glibc's getcharmemorizza il byte che legge da STDIN in EAX, quindi il valore di quel byte è il codice di uscita del nostro programma.


Sarebbe interessante vedere se questo può essere modificato per superare la barriera a 8 bit, usando la shell come jsh , che supporta set -o fullexitcode.
Zeppelin,

1
È intelligente. Ma il programma in realtà non si arresta in modo anomalo, quindi. Restituisce normalmente, indipendentemente dal fatto che la specifica "provochi un'eccezione fatale / guasto irreversibile / arresto anomalo"
dim

Ad ogni modo, questo è fantastico.
Quentin,

4
@dim Immagino che dipende dalla tua definizione di crash. Non finire principale con returno exitè un errore per quanto riguarda lo standard C90 e si traduce in un codice di uscita che indica un errore. Questo è tutto ciò che un incidente fa a cuore.
Dennis,

Un arresto anomalo è un programma che smette di funzionare correttamente. Il tuo programma fa tutto quello che gli hai detto di fare correttamente, legge un carattere dall'input e poi si ferma. Quindi, anche se il codice di uscita indica un errore, non si è arrestato in modo anomalo.
findusl

19

C (gcc) sotto shell bash su x86, 230 byte, 8 codici di uscita

Newline aggiunte per aiutare la leggibilità. Commenti ignorati nel punteggio.

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

Una caratteristica della shell bash:

Quando un comando termina su un segnale fatale N, bash utilizza il valore di 128 + N come stato di uscita.

Quindi tutto ciò che dobbiamo fare è innescare vari segnali dall'interno del programma CA. A questo punto, suppongo che il semplice fatto kill(n-128);sia vietato. Quindi, invece, eseguiamo il codice che attiva vari segnali, il che rende disponibili i corrispondenti codici di errore nella shell chiamante.

I codici di uscita sono 0, 130, 133, 134, 136, 139, 141, 142.

Provalo online . Espandi la sezione "Debug" per vedere il codice di ritorno.

Questo può certamente essere golfato più in profondità. Ma sarei più interessato ad aggiungere più segnali.


Sarebbe corretto supporre che i segnali siano causati al di fuori del codice da funzioni o operazioni preesistenti?
Addison Crump,

1
@VotoToChiudi sì, esatto. Ad esempio, __asm("UD2")esegue l '"istruzione non definita" x86 che causerà un'eccezione della CPU che verrà inoltrata dal kernel al programma sotto forma di un segnale SIGILL. Per socketpairesempio, SIGPIPE verrà inviato dal kernel o daglibc mentre stiamo cercando di write()eseguire una pipe che si trovava close()all'altra estremità.
Trauma digitale

1
Quindi non ho alcun problema. : P
Addison Crump,

1
Puoi giocare 1) due caratteri se usi int3e non int $3e 2) un carattere se dichiari vcome int**, dato che non fondamentalmente fai affidamento sull' char-ness del tipo di dati nell'aritmetica del puntatore, più 3) due caratteri se usi *pinvece di p[0], o 4) sei caratteri, se vuoi fare affidamento sui fdnumeri prevedibili restituiti da tutti i syscall che li creano e li sostituiscono p[0]e p[1]dai loro valori quasi certi. Infine, pipe(fd)è molto più breve di socketpair(...)e genera lo stesso errore quando si chiude fd[0]e si scrive. fd[1].
Iwillnotexist Idonotexist,

2
Alcuni suggerimenti golf aggiuntivi: 1) Utilizzare &63invece di -128. 2) Sostituire sleep(2)con for(;;). 3) Sostituire c=*(int*)ccon atoi(0). 4) Sostituire c/=c-2con c/=0.
nwellnhof,

10

Python 2, 13 byte, 2 codici di uscita

1/(input()-1)

Se inserisci 0, prova a stampare 1/-1che è -1 che è perfettamente a posto, quindi esci dal codice 0. Se inserisci 1, ottieni 1/0che genera un ZeroDivisionErrorin cui esiste un codice di uscita 1. Con il mio IDE, c'è solo 0 e 1 per i codici di uscita ...

Uscite:


inserisci qui la descrizione dell'immagine


inserisci qui la descrizione dell'immagine


10

PHP, 15 byte, 2 codici di uscita

Senza die/ exit, PHP non può restituire altro che 0o 255(afaik; probabilmente ~1), quindi ...

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

Se l'argomento della riga di comando è errato, viene valutato 1ed esce con 0. In caso contrario, tenta di chiamare una funzione ed esce con <b>Fatal error</b>: Uncaught Error: Call to undefined function p().

Corri con -r.


5
Non è vero. exit()imposta uno stato di uscita ... che non è possibile utilizzare per questa sfida, garantito. Ma anche il tuo codice non è valido. Esso definisce lo stato di uscita di 255
aross

@aross: Hmm ho sempre pensato che l'errore sarebbe uscito con 1. Ho cercato un elenco di codici di uscita, ma non sono riuscito a trovarne uno.
Tito

10

Excel VBA, 414 514 533 + 3 byte, 14 codici di uscita

Prende ingresso come Conditional Compilation Argument, n=[input value]e produce il codice di errore associata a tale numero.

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 per la n=[Value]chiamata di compilazione condizionale

Gestisce gli input dove n=

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

Nota: VBA non ha codici di uscita 0o 1. Ho incluso le soluzioni per 3e 5, che sono i due codici di uscita con il numero più basso disponibili per VBA al loro posto


1
Non impedirò questa risposta, perché è anche per me vietare a causa della capacità linguistica per i tipi di output.
Addison Crump,

1
Cosa fa #qui?
BruceWayne,

Le dichiarazioni di compilazione condizionale #ife #ElseIfsono che significano che le dichiarazioni che seguono sono compilate solo se la condizione è vera
Taylor Scott

1
Quindi, se non sono vere, le dichiarazioni non sono compilate ... è diverso dal non usare #, dove verrebbero compilate se le dichiarazioni sono vere o no? So come Iffunzionano le dichiarazioni, ma sono nuovo a capire cosa compila effettivamente , quindi mi dispiace per una domanda così semplice.
BruceWayne,

1
@BruceWayne, sì, è esattamente così. Poiché queste righe sono progettate per generare errori specifici , è necessario compilare solo le righe che producono il codice di errore desiderato alla volta. Per fare ciò #ifviene utilizzato al posto di Ifo Select Casepoiché truthyvengono effettivamente compilate solo le istruzioni condizionali. In questo caso in particolare, ciò impedisce al programma di uscire con un codice di errore 3, Return without GoSubad ogni esecuzione, ma piuttosto di uscire con questo codice solo quandon=3
Taylor Scott

7

Turtlèd, 4 byte, 2 codici di uscita

Non so se ci sono modi per ottenere più codici di uscita ... ci sono anche altri modi nella lingua dell'interprete

Ho trovato alcune risposte di quattro lunghezze

' ?;

Provalo online!

!.(0

Provalo online!

?;(*

Provalo online!

Come funzionano:

' ?;

nel mio interprete, c'è una funzione bug che causa errori quando la griglia in memoria ha più di una riga e non ha caratteri non spaziali. questo programma cancella * sulla cella di origine '[space], accetta un input intero non negativo ?(0 o 1 in realtà) e si sposta verso il basso di molti ;, se è zero, la griglia avrà solo una riga e non un errore, altrimenti si sposterà verso il basso e si verificherà l'errore

!.(0

le parentesi e le cose non vengono analizzate, ma vengono eseguite in fase di esecuzione nel senso di "saltare alla parentesi corrispondente, se il simbolo della cella non è corretto". in questo programma, immettendo ( !) si fa in modo che il programma lo scriva nella cella ( .), esegua la parentesi, che controlla se il simbolo della cella è 0, prova a saltare alla parentesi corrispondente, ma invece genera un errore perché non c'è nessuno . se è zero, lo annota, controlla le parentesi, si trova su uno 0, quindi lo ignora e il programma termina

?;(*

ha elementi della risposta precedente e della prima. accetta input di numeri interi non negativi, si sposta in basso di così tanti e controlla se la cella è '*', cercando una parentesi extra inesistente se non lo è. se l'input è 1, si sposterà dallo spazio iniziale e troverà la cella uno spazio, ed errore, se è zero, rimarrà nello spazio iniziale e ignorerà la parentesi.


7

Javascript (nodo), 19 byte, 2 codici di uscita

Programma completo:

+process.argv[2]&&a

Funzione:

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

process.argvè un array che contiene il percorso dell'eseguibile del nodo, il percorso del file javascript eseguito e gli argomenti della riga di comando. In questo caso, questo sarà uno "1"o "0". La stringa viene convertita in un numero con l' +operatore unario . Se il numero è zero, l' &&operatore pigro non valuterà il lato destro, se il numero è veritiero (non zero), &&viene valutato il lato destro di e viene generato un errore perché fa riferimento a una variabile non definita e il programma esiste con codice di uscita 1.

La funzione prevede l'ingresso come numero. Se l'input è vero, la funzione si chiama da sola e si arresta in modo anomalo durante l'esecuzione del nodo con un overflow dello stack. Se l'ingresso è 0, l' &&operatore pigro restituisce 0 senza valutare il lato destro.


@VoteToClose Modificato in una variabile indefinita
corvus_192,

Che funzioni. : P
Addison Crump,

Il programma completo può essere abbreviato in +process.argv[2]&&a.
user2428118,

@ user2428118 Hai ragione
corvus_192,

Solo per curiosità, sarebbe ReferenceError.prototype.name=process.argv[2]?a:0valido?
Patrick Roberts,

6

Perl 6 , 57 byte, 256 codici di uscita

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

Provalo
Questa è una traduzione dell'esempio di Perl 5.

allargato

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 byte, 2 codici di uscita

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

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

JVM supporta solo 1 e 0 come codici di uscita se non si chiama System.exit.

Il primo programma tenta di calcolare 1/0se il primo argomento è 1, che causerà l'arresto anomalo della JVM con un codice di uscita pari a 1. Se l'argomento è 0, verrà chiuso correttamente.

Il secondo programma per convertire l'argomento in intero, sottrae uno e tenta di dividere 1 per quel numero. Se l'argomento è 1, calcola 1/0, quindi la JVM andrà in crash; se l'argomento è 0, calcola 1/-1ed esce.


5

Python 3 , 15 byte, 2 codici di uscita

Ovviamente, questo è più lungo della soluzione Python 2 , perché in Python 3 non possiamo prendere un input letterale senza chiamare eval. Tuttavia, possiamo usare in modo interessante le tecniche di confronto delle stringhe ...

1/(input()<'1')

L'input sarà la stringa 0o 1- se è 1, la condizione restituisce 0 (false), con il risultato di un tentativo di calcolo 1 / 0che ovviamente si arresta in modo anomalo (codice di uscita 1). Altrimenti, non succede nulla e Python esce con il normale codice di uscita 0.

Per quanto ne so, Python non è in grado di bloccarsi con altri codici di uscita.


5

Java, 71 66 byte, 2 codici di uscita

4 byte salvati grazie a Holger

Programma completo:

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

Funzione che prende un int come argomento:

i->1/(i-1)

Il programma accetta il primo carattere del primo argumant (uno '0'o '1'e sottrae 48 (valore ascii di '0') per ottenere un numero intero (0 o 1), quindi tenta di impostare l'argomento nella posizione di tale numero intero nella stringa vuota. l'ingresso è 1, il programma si arresta in modo ArrayIndexOutOfBoundsExceptionanomalo con un , perché l'array di argomenti ha solo un elemento in posizione 0 (indicizzato zero).


È possibile assegnare il valore o utilizzarlo in qualsiasi altro modo, ad esempio come indice di array a[a[0].equals("1")?1/0:1]="";, che è alla pari int x=a[0].equals("1")?1/0:1;. Ma cambiando ulteriormente il programma per provocare un ArrayIndexOutOfBoundsExceptionanziché ArithmeticExceptionsalvare alcuni byte:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Holger

4

Python 2, 11 byte, 2 codici di uscita

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

Tre diverse soluzioni a 11 byte per tre diversi errori! (Solo per divertimento, questo non dà punti.) Per impostazione predefinita, Python ha solo i codici di uscita 0 per un'uscita corretta e 1 per errore. Le esecuzioni riuscite non generano nulla.

 1>>-input()

Sull'ingresso 1, fornisce "ValueError: conteggio spostamento negativo". Sull'ingresso 0, un conteggio spostamento zero ha esito positivo e dà 1.

1/~-input()

Sull'ingresso 1, fornisce "ZeroDivisionError: divisione intera o modulo per zero" a causa di ~-input(), noto anche input()-1come 0. Nell'ingresso 1, 1/-1dà -1. 0**-input()funzionerebbe anche.

0<input()<x

Sull'ingresso 1, fornisce "NameError: il nome 'x' non è definito". All'ingresso 0, queste prime disuguaglianze 0<0vengono valutate come false, quindi il resto non viene valutato e il risultato è solo falso.


2

Node.js (ES6), 77 byte, 2 codici di uscita

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

2

Gelatina , 4 codici di uscita, 18 byte

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

Supporta i codici di uscita 0 , 1 , 137 (ucciso) e 139 (errore di segmentazione).

Provalo online!

Come funziona

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 byte, 39 codici di uscita (su 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

Questo potrebbe sicuramente essere ridotto. SB ha solo codici di errore da 0 a 51 e alcuni sono impossibili da attivare.


0

ZX81 BASIC> 255 codici di uscita - 52 byte (elenco)

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

Tecnicamente, Npotrebbe essere qualsiasi numero in virgola mobile a 24 bit all'interno dell'intervallo, ma assumeremo qui i numeri interi. La riga 2 equivale a IF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1se ZX81 BASIC avesse IF/ELSEnelle sue istruzioni simboliche.


3
In che modo questo soddisfa the program caused some fatal unintended exception? Questo stampa solo del testo e termina l'esecuzione.
AdmBorkBork

Hai ragione - ho bisogno di essere più sveglio la mattina.
Shaun Bebbers,

RAND USR Ncauserà effetti non voluti poiché chiamare parte della ROM da un luogo inaspettato non è una buona idea, quindi RAND USR 0è stato escluso in quanto troppo grazioso.
Shaun Bebbers,

Puoi approfondire un po 'di più su come ciò causa effettivamente l'arresto anomalo del programma? Non ho familiarità con ZX81 BASIC.
AdmBorkBork,

La ROM risiede da 0x0000 - 0x1fff; le routine di chiamata ROM funzioneranno se inizi nel posto giusto. L'avvio di uno o più byte in qualsiasi routine del codice macchina in Z80 causerà effetti imprevisti. Se si ha un semplice LD BC, 0000 RST 10 RETa 0x1000 ma viene chiamato, RAND USR 4097allora si perderà l'operando LD e il codice della macchina verrà quindi distorto. Non ricordo tutte le chiamate ROM ma risolverò tutti i fini legali / aggraziati e le escluderò in seguito.
Shaun Bebbers,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.