Inspiré par cette valeur par défaut pour IO .
La tâche
Ecrivez un programme qui, avec un nombre entier x
compris entre 0 et 255, plante avec le code de sortie x
.
Restrictions
- Vous ne pouvez pas appeler quoi que ce soit qui est directement destiné à la sortie du code de sortie (
System.exit(x)
retourmain
, etc.). Au lieu de cela, votre programme doit provoquer une erreur ou un crash qui entraînera, avec une probabilité de 1, la fermeture du programme avec le nombre entier saisi.- Dans ce cas, les mots "erreur" et "crash" signifient que le programme a provoqué une exception non intentionnelle fatale, dans laquelle une méthode, une opération ou une autre utilisation a été utilisée de manière incorrecte et a entraîné une défaillance irréversible.
- Vous ne pouvez pas directement causer l'erreur en la lançant directement. Vous devez le provoquer en utilisant une méthode, une fonction ou toute autre fonction dont le but est de servir une fonction différente (par exemple, en essayant d'exécuter un fichier en écriture dans un répertoire en lecture seule).
- Vous devez avoir au moins deux codes de sortie comptabilisés dans votre programme.
- L'arrêt du processus avec l'utilisation de signaux est interdit. (Le raisonnement peut être trouvé dans cette discussion )
Notation
Le score de votre programme est déterminé par le nombre de codes de sortie pris en charge, où la concision de code est une égalité. Le plus grand nombre de codes de sortie pris en charge gagne!
code-challenge
restricted-source
Addison Crump
la source
la source
throw new Exception()
style), c'est illégal. Si c'est le sous-produit de l'utilisation abusive d'une fonction existante, c'est très bien.one zero zero
pour 100) est-il acceptable? J'ai une idée de ce défi, mais le langage a des idées assez inhabituelles sur les E / S, et c'est le format d'entrée le plus naturel.Réponses:
Unix Shell (+ ncurses + BSD),
36, 26 octets, 256 codes de sortieGolfé
Une fois que le code de sortie tput dépasse 255, il ne fait que déborder, de sorte que 253 (erreurs sur les entrées) génèrera le code de sortie de 1, etc., donnant ainsi le statut de sortie souhaité pour toute la plage d'entrées.
Remarque : si le débit échouera ou non, lors du paramétrage / obtention d'une capacité particulière, cela dépend du type de terminal que j'ai utilisé:
xterm with 256 colors
jot est un utilitaire BSD , qui imprime des données séquentielles ou aléatoires, et (autant que je sache) est également disponible tel quel sur les systèmes OSX.
Si votre système n'est pas
jot
disponible, vous pouvez utiliser une version légèrement plus longue (29 octets):Essayez-le en ligne! (la version 29 octets)
la source
Bash 4.2 + extras, 24 codes de sortie
Merci à @ KenY-N pour 3 codes de sortie. Merci à @ el.pescado pour 1 code de sortie.
Vérification
Tous les tests ont été effectués sur openSUSE 13.2.
la source
http_proxy=fafa curl http://example.org
INTERCAL (C-INTERCAL), 15 codes, 313 + 2 = 315 octets
Essayez-le en ligne!
Tous les espaces sont sans importance. (Le programme d'origine contenait des onglets, mais je les ai convertis en espaces pour qu'il s'aligne correctement sur SE. Il est classique d'utiliser une largeur de tabulation de 8 pour INTERCAL. J'ai testé une version du programme avec tous les onglets, espaces et les nouvelles lignes supprimées, cependant, et cela fonctionne bien.)
Compiler avec
-abm
(pénalité de 2 octets, car il-b
est nécessaire pour que le compilateur soit déterministe).Comme d'habitude pour INTERCAL, ceci prend une entrée numérique dans le format, par exemple,
ONE TWO THREE
pour123
.Explication
En cas d'erreur de sortie d'un programme C-INTERCAL, l'état de sortie est le code d'erreur modulo 256. Par conséquent, nous pouvons essayer d'écrire un programme capable de générer autant d'erreurs d'exécution que possible. Ce programme n'omet que deux erreurs d'exécution qui n'indiquent pas d'incident interne du compilateur: ICL200I, car sa reproduction nécessite l'utilisation de bibliothèques externes compatibles uniquement avec un programme à un seul thread (et les programmes multithreads ayant davantage d'erreurs disponibles); et ICL533I, car 533 a la même valeur modulo 256 que 277, et le programme est capable de produire ICL277I.
Le programme commence toujours de la même manière. Tout d'abord, nous entrons (
WRITE IN
) une valeur pour la variable.1
. Ensuite, nous utilisons uneCREATE
instruction calculée pour créer une nouvelle syntaxe (ici,A
); mais comme il est calculé, la définition de la syntaxe varie en fonction de la valeur de.1
. Enfin, dans la plupart des cas, nous exécutons notre nouvelleA
instruction, qui a été définie pour produire une erreur. Le tableau des définitions possibles que nous avons contient une définition pour chaque erreur d'exécution possible (autres que les exceptions énumérées ci-dessus).Premièrement, il y a deux exceptions à ce régime général.
(0)
n’est pas un numéro de ligne valide. Par conséquent, si l’utilisateur saisitZERO
, nous passons de la deuxième ligne (numérotée(8)
) à la quatrième à l’aide d’uneCOME FROM
instruction calculée . Cela tombe ensuite dans une erreur de syntaxeDO X
, qui produit une erreurICL000I
. (Dans INTERCAL, les erreurs de syntaxe se produisent lors de l'exécution, du fait que les commandes ont tendance à être désactivées, la syntaxe à être redéfinie sous vous, etc.). L'COME FROM
instruction a également un effet secondaire, même si rien neCOME FROM
se passe réellement , en créant une surcharge d'opérande de.1
à#1
chaque fois qu'une ligne avec un numéro de ligne est exécutée; ceci est utilisé plus tard lors de la production de la sortie 21. (Les effets secondaires globaux aléatoires sont assez idiomatiques dans INTERCAL.)L'autre exception est avec entrée
ONE TWO NINE
. Il n'y a pas de numéro de ligne(129)
dans le programme, nous obtenons donc une erreur pour un numéro de ligne manquant, qui estICL129I
. Donc, je n'ai pas eu à écrire de code pour couvrir ce cas du tout.Voici les autres erreurs et leurs causes:
NEXT
débordement de pile (DO (123) NEXT
). L'NEXT
instruction a besoin d'autres modificateurs (FORGET
ouRESUME
) afin de déterminer de manière rétroactive de quel type d'instruction de contrôle il s'agissait. N'ayant pas ces causes, l'erreur ICL123I une fois qu'il existe 80 instructions `NEXT non résolues.DO STASH .2
enCOME FROM
boucle). Les caches ne sont limités que par la mémoire disponible, mais celle-ci finira par s'épuiser, provoquant l'erreur ICL222I.DO ,1 <- #0
signifie, et cela provoque l’erreur ICL240I.,1
n'a pas été alloué (,
est utilisé pour les variables de type tableau dans INTERCAL), son indexation génère donc l'erreur ICL241I.#256 $ #0
) à une variable de 16 bits.2
. Cela ne convient pas, provoquant l'erreur ICL275I.#2
à.1
. Cela peut sembler être une tâche assez simple, mais nous avons surchargé.1
le sens#1
précédent, et tenter de modifier la valeur de 1 sans-v
option sur la ligne de commande provoque l’erreur ICL277I.GO BACK
), qui n'existe pas à ce stade du programme (nous n'avons exécuté aucune commande pour manipuler la pile de choix, elle est donc toujours vide). Cela provoque l'erreur ICL404I.RETRIEVE .2
partir d'une réserve inexistante (car nous n'avons rien caché dans cette branche du programme), provoquant l'erreur ICL436I.WRITE IN
) pour toujours dans uneCOME FROM
boucle. Finalement, nous finirons par lire après EOF, provoquant l'erreur ICL562I.DO RESUME #0
, qui n'a pas de sens et est spécifiquement documentée comme provoquant une erreur (ICL621I).DO RESUME #9
. Nous n'avons pas encore exécuté beaucoup d'NEXT
énoncés et nous avons donc l'erreur ICL120I. (Curieusement, cette erreur particulière est définie dans la documentation INTERCAL comme quittant le programme normalement puis causant l'erreur, plutôt que de quitter le programme avec une erreur. Je ne crois cependant pas que ces deux cas soient différents.)Vérification
Certaines des erreurs impliquent d'exécuter intentionnellement le programme avec peu de mémoire. Je suggère donc de définir des limites de mémoire assez petites. Voici la commande shell que j'ai utilisée pour tester le programme (avec de nouvelles lignes ajoutées pour la lisibilité; supprimez-les si vous l'exécutez vous-même):
Et voici le résultat (avec les numéros de ligne et les messages "VEUILLEZ CORRIGER LA SOURCE" supprimés pour économiser de l'espace), que j'ai ajouté en partie pour montrer que le programme fonctionne, mais surtout pour afficher les messages d'erreur stupides d'INTERCAL:
la source
Perl, 108 octets, 256 codes de sortie
Ce programme (ab) utilise le module Test :: More . Il essaie d'ouvrir le fichier nommé
""
n fois où n est donné comme argument de ligne de commande. Il échoue à chaque fois et chaque appel est traité comme un test. Test :: More renvoie le nombre de tests ayant échoué comme code de sortie.plan tests => $ARGV[0]%255
est nécessaire pour obtenir le code de sortie 255.la source
perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'
51 octets (38 octets + 13 octets pour-MTest::More<space>
). Prend une entrée sur stdin.C90 (gcc), 256 codes de sortie,
282718 octetsJe ne sais pas si cela est intelligent ou cheaty, mais je ne pense pas qu'il viole les règles que par écrit: il ne techniquement utilise pas
exit
,return
ou tout mécanisme lancer erreur, mais simplement sur le comportement repose non défini et le fait que gcc fait quelque chose d'assez pratique en ce qui concerne ce défi.Essayez-le en ligne!
Comment ça fonctionne
Cela utilise simplement
getchar
pour lire un octet de STDIN. En soi, cela ne fait rien.Cependant, un programme C90 conforme doit se terminer par une
return
déclaration ou quelque chose d’équivalent; tout le reste est un comportement indéfini. gcc termine l'assembly généré avec unret
anyway, donc quelle que soit la valeur trouvée dans le registre, EAX sera renvoyé par le programme. Heureusement, glibc'sgetchar
stocke l'octet lu à partir de STDIN dans EAX. La valeur de cet octet est donc le code de sortie de notre programme.la source
set -o fullexitcode
.return
ouexit
est une erreur en ce qui concerne la norme C90 et il en résulte un code de sortie indiquant un échec. C'est tout ce qu'un accident fait à coeur.C (gcc) sous shell bash sur x86, 230 octets, 8 codes de sortie
Ajout de nouvelles lignes pour améliorer la lisibilité. Commentaires ignorés dans le score.
Une caractéristique du shell bash:
Il suffit donc de déclencher divers signaux dans le programme ca À ce stade, je suppose que faire simplement
kill(n-128);
est interdit. Donc, au lieu de cela, nous exécutons du code qui déclenche divers signaux, ce qui entraîne la mise à disposition des codes d'erreur correspondants sur le shell appelant.Les codes de sortie sont 0, 130, 133, 134, 136, 139, 141, 142.
Essayez-le en ligne . Développez la section "Débogage" pour voir le code de retour.
Cela peut certainement être joué plus profondément. Mais je serais plus intéressé à ajouter plus de signaux.
la source
__asm("UD2")
exécute "l'instruction non définie" x86 qui provoquera une exception de la CPU qui sera relayée par le noyau au programme sous la forme d'un signal SIGILL. Pour l'socketpair
exemple, SIGPIPE sera envoyé par le noyau ou la glibc, comme nous essayons de le faire,write()
vers un canal qui étaitclose()
d à l'autre bout.int3
et nonint $3
2) un caractère si vous déclarez env
tant queint**
, étant donné que vous ne vous fiez pas fondamentalement à lachar
densité du type de données dans votre arithmétique de pointeur, plus 3) deux caractères si vous utilisez au*p
lieu dep[0]
, ou 4) six caractères, si vous êtes prêt compter sur les prévisiblesfd
chiffres retournés par tous les syscalls qui les créent et remplacentp[0]
etp[1]
par leurs valeurs quasi-certaine. Enfin,pipe(fd)
est beaucoup plus court quesocketpair(...)
et génère la même erreur lors de la fermeturefd[0]
et de l’écriture.fd[1]
.&63
au lieu de-128
. 2) Remplacersleep(2)
parfor(;;)
. 3) Remplacerc=*(int*)c
paratoi(0)
. 4) Remplacerc/=c-2
parc/=0
.Python 2, 13 octets, 2 codes de sortie
Si vous entrez 0, il essaie d’imprimer
1/-1
ce qui est -1, ce qui est parfaitement correct, ainsi le code de sortie 0. Si vous entrez 1, vous obtenez1/0
ce qui soulève unZeroDivisionError
dans lequel il y a un code de sortie de 1. Avec mon IDE, il n’ya que 0 et 1 pour les codes de sortie ...Les sorties:
la source
PHP, 15 octets, 2 codes de sortie
Sans
die
/exit
, PHP ne peut rien retourner d'autre que0
ou255
(autant que je sache, probablement~1
), alors ...Si l'argument de ligne de commande est faux, il est évalué à
1
et se ferme avec0
. Sinon, il essaie d'appeler une fonction et quitte avec<b>Fatal error</b>: Uncaught Error: Call to undefined function p()
.Courez avec
-r
.la source
exit()
définit un statut de sortie ... que vous ne pouvez pas utiliser pour ce défi, accordé. Mais votre code est également invalide. Il définit le statut de sortie à 2551
. J'ai cherché une liste de codes de sortie, mais je n’en ai pas trouvé.Excel VBA,
414514 533 + 3 octets, 14 codes de sortiePrend entrée en tant que
Conditional Compilation Argument
,n=[input value]
et produit le code d'erreur associé de ce nombre.+3 pour l'
n=[Value]
appel de compilation conditionnelleGère les entrées où
n=
Remarque: VBA n’a pas de code de sortie
0
ou1
. J'ai inclus les solutions pour3
et5
, qui sont les deux codes de sortie numérotés les plus bas disponibles pour VBA à leur placela source
#
fait ici?#if
et#ElseIf
sont des instructions de compilation conditionnelles, ce qui signifie que les instructions qui suivent ne sont compilées que si la condition est vraie.#
, où elles seraient compilées que les déclarations soient vraies ou non? Je sais commentIf
fonctionnent les déclarations, mais je suis novice en ce qui concerne la compilation , donc désolé pour une question aussi simple.#if
est utilisé à la placeIf
ouSelect Case
comme seules lestruthy
instructions conditionnelles sont réellement compilées. Dans ce cas en particulier, cela empêche le programme de quitter avec un code d'erreur3
,Return without GoSub
à chaque exécution, mais uniquement avec ce code lorsquen=3
Tourtèdre, 4 octets, 2 codes de sortie
Je ne sais pas s'il existe un moyen d'obtenir plus de codes de sortie ... existe-t-il encore d'autres moyens dans la langue de l'interprète?
J'ai trouvé quelques réponses de quatre longueurs
Essayez-le en ligne!
Essayez-le en ligne!
Essayez-le en ligne!
Comment ça marche:
dans mon interprète, il existe une fonctionnalité de
boguequi provoque des erreurs lorsque la grille en mémoire a plus d'une ligne et ne contient pas de caractères non-espace. ce programme efface le * de la cellule d'origine'[space]
, prend une entrée entière non négative?
(0 ou 1 en réalité), et descend de ce nombre;
, si elle est nulle, la grille n'aura qu'une seule ligne et pas d'erreur, sinon elle descendra et l'erreur se produirales parenthèses et les éléments ne sont pas analysés, ils sont simplement exécutés au moment de l’exécution pour signifier: "passez au paren correspondant, si le symbole de la cellule n’est pas correct". dans ce programme, inputting (
!
) amène le programme à l'écrire dans la cellule (.
), exécute le paren, qui vérifie si le symbole de la cellule est 0, essaie de passer au paren correspondant, mais renvoie une erreur car il n'y en a pas. . s'il est égal à zéro, il l'écrit, vérifie les parenthèses, se retrouve sur un 0, puis l'ignore et le programme se terminea des éléments de la réponse précédente, et le premier. il prend une entrée entière non négative, décale ce nombre et vérifie si la cellule est '*', en recherchant un parent supplémentaire non existant s'il ne l'est pas. si l'entrée est 1, il se déplacera hors de l'espace de départ et trouvera que la cellule est un espace. Si elle est égale à zéro, la cellule restera dans l'espace de début et ignorera le paren.
la source
Javascript (noeud), 19 octets, 2 codes de sortie
Programme complet:
Une fonction:
process.argv
est un tableau contenant le chemin d'accès à l'exécutable du noeud, le chemin d'accès au fichier javascript exécuté et les arguments de ligne de commande. Dans ce cas, ce sera soit"1"
ou"0"
. La chaîne est convertie en un nombre avec l'+
opérateur unaire . Si le nombre est égal à zéro, l'&&
opérateur lazy n'évaluera pas le côté droit. Si le nombre est vrai (et non zéro), le côté droit de&&
est évalué et une erreur est générée car il fait référence à une variable non définie et le programme existe. avec le code de sortie 1.La fonction attend l'entrée sous forme de nombre. Si l'entrée est véridique, la fonction s'appelle elle-même et bloque l'exécution du noeud avec un débordement de pile. Si l'entrée est 0, l'
&&
opérateur différé renvoie 0 sans évaluer le côté droit.la source
+process.argv[2]&&a
.ReferenceError.prototype.name=process.argv[2]?a:0
valide?Perl 6 , 57 octets, 256 codes de sortie
Essayez-le
Ceci est une traduction de l'exemple Perl 5.
Étendu
la source
Scala, 19 octets, 2 codes de sortie
if(args(0)=="1")1/0
1/(args(0).toInt-1)
La JVM ne prend en charge que les codes de sortie 1 et 0 si vous n'appelez pas
System.exit
.Le premier programme essaie de calculer
1/0
si le premier argument est1
, ce qui plantera la JVM avec un code de sortie de 1. Si l'argument est 0, il se terminera avec succès.Le second programme convertit l'argument en entier, en soustrait un et tente de diviser 1 par ce nombre. Si l'argument est égal à 1,
1/0
la machine virtuelle Java se bloque; si l'argument est 0, il calcule1/-1
et quitte.la source
Python 3 , 15 octets, 2 codes de sortie
Évidemment, c'est plus long que la solution Python 2 , car dans Python 3, nous ne pouvons pas prendre une entrée littérale sans appeler
eval
. Cependant, nous pouvons utiliser des techniques de comparaison de chaînes de manière intéressante ...L'entrée sera soit la chaîne,
0
soit1
- si elle vaut 1, la condition est évaluée à 0 (faux), ce qui entraîne une tentative de calcul1 / 0
qui se bloque évidemment (code de sortie 1). Sinon, rien ne se passe et Python se ferme avec le code de sortie normal 0.Autant que je sache, Python est incapable de planter avec d'autres codes de sortie.
la source
Java,
7166 octets, 2 codes de sortie4 octets économisés grâce à Holger
Programme complet:
Fonction prenant un int comme argument:
Le programme utilise le premier caractère du premier argument (ou
'0'
ou'1'
et soustrait 48 (valeur ascii de'0'
) pour obtenir un entier (0 ou 1). Il tente ensuite de définir l'argument situé à l'emplacement de cet entier sur la chaîne vide. l'entrée est 1, le programme se bloque avec unArrayIndexOutOfBoundsException
, parce que le tableau d'arguments n'a qu'un seul élément à la position 0 (index zéro).la source
a[a[0].equals("1")?1/0:1]="";
, ce qui est comparable àint x=a[0].equals("1")?1/0:1;
. Mais changer le programme plus loin pour provoquer unArrayIndexOutOfBoundsException
au lieu deArithmeticException
sauver quelques octets:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Python 2, 11 octets, 2 codes de sortie
Trois solutions différentes à 11 octets pour trois erreurs différentes! (Juste pour le plaisir, cela ne donne pas de points.) Par défaut, Python n'a que les codes de sortie 0 pour une sortie réussie et 1 pour une erreur. Les exécutions réussies ne produisent rien.
Sur l'entrée 1, donne "ValueError: compte de décalage négatif". Sur l'entrée 0, un décalage de zéro réussit et donne 1.
Sur l'entrée 1, donne "ZeroDivisionError: division entière ou modulo par zéro" en raison de
~-input()
, aliasinput()-1
0. Dans l'entrée 1,1/-1
donne -1.0**-input()
fonctionnerait aussi.Sur l'entrée 1, donne "NameError: le nom 'x' n'est pas défini". Sur l'entrée 0, cette première inégalité
0<0
est évaluée à False, le reste n'est pas évalué et le résultat est simplement False.la source
Node.js (ES6), 77 octets, 2 codes de sortie
la source
Gelée , 4 codes de sortie, 18 octets
Prend en charge les codes de sortie 0 , 1 , 137 (tué) et 139 (erreur de segmentation).
Essayez-le en ligne!
Comment ça fonctionne
la source
SmileBASIC, 640 octets, 39 codes de sortie (sur 52)
Cela pourrait certainement être raccourci. SB n'a que des codes d'erreur de 0 à 51, et certains sont impossibles à déclencher.
la source
ZX81 BASIC> 255 codes de sortie - 52 octets (liste)
Techniquement, il
N
pourrait s'agir d'un nombre à 24 bits dans la plage, mais nous supposerons ici des entiers. La ligne 2 est équivalente àIF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1
si ZX81 BASIC avaitIF/ELSE
dans ses instructions symboliques.la source
the program caused some fatal unintended exception
? Cela affiche simplement du texte et termine l'exécution.RAND USR N
Cela provoquera des effets inattendus, car appeler une partie de la ROM depuis un endroit inattendu n’est pas une bonne idée; ilRAND USR 0
a donc été exclu car cela est trop gracieux.LD BC, 0000 RST 10 RET
à 0x1000 mais appelé,RAND USR 4097
vous manquerez l'opérande LD et le code machine sera donc faussé. Je ne me souviens pas de tous les appels ROM, mais je vais régler toutes les fins juridiques / gracieuses et les exclure plus tard.