Inspirado por este valor predeterminado para IO .
La tarea
Escriba un programa que, dado un entero de entrada x
entre 0 y 255, se bloquea con el código de salida x
.
Restricciones
- No puede llamar a nada que esté destinado directamente a la salida del código de salida (
System.exit(x)
, regresarmain
, etc.). En cambio, su programa debe causar un error o bloqueo que causará, con una probabilidad de 1, que el programa salga con el entero de entrada.- En este caso, las palabras "error" y "bloqueo" significan que el programa causó alguna excepción fatal no deseada, en la que un método, operación o de otra manera se usó incorrectamente y causó una falla irreversible.
- No puede causar el error directamente al lanzarlo directamente. Debe causarlo utilizando un método, una función u otro cuyo propósito tenga una función diferente (es decir, intentar ejecutar una escritura de archivo en un directorio de solo lectura).
- Debe tener al menos dos códigos de salida en su programa.
- La terminación del proceso con el uso de señales está prohibida. (El razonamiento se puede encontrar en esta discusión )
Puntuación
La puntuación de su programa está determinada por la cantidad de códigos de salida admitidos, donde la concisión del código es desempate. ¡El mayor número de códigos de salida admitidos gana!
code-challenge
restricted-source
Addison Crump
fuente
fuente
throw new Exception()
estilo), eso es ilegal. Si es el subproducto del mal uso de una función existente, entonces está bien.one zero zero
para 100)? Tengo una idea para este desafío, pero el lenguaje tiene algunas ideas bastante inusuales sobre E / S, y este es el formato de entrada más natural.Respuestas:
Shell de Unix (+ ncurses + utilidades BSD),
36, 26 bytes, 256 códigos de salidaGolfed
Una vez que el código de salida de tput supera 255, simplemente se desborda, por lo que 253 (errores en la entrada) dará como resultado el código de salida de 1, etc., produciendo así el estado de salida deseado para todo el rango de entradas.
Nota : si tput fallará o no, al configurar / obtener una capacidad particular, depende del tipo de terminal, he usado:
xterm with 256 colors
jot es una utilidad BSD , que imprime datos secuenciales o aleatorios, y (AFAIK) también está disponible de fábrica en los sistemas OSX.
Si su sistema no tiene
jot
disponible, puede usar una versión un poco más larga (29 bytes):¡Pruébelo en línea! (la versión de 29 bytes)
fuente
Bash 4.2 + extras, 24 códigos de salida
Gracias a @ KenY-N por 3 códigos de salida. Gracias a @ el.pescado por 1 código de salida.
Verificación
Todas las pruebas se han realizado en openSUSE 13.2.
fuente
http_proxy=fafa curl http://example.org
INTERCAL (C-INTERCAL), 15 códigos, 313 + 2 = 315 bytes
Pruébalo en línea!
Todo el espacio en blanco aquí es irrelevante. (El programa original contenía pestañas, pero las convertí en espacios para que se alinearan correctamente en SE; es convencional usar un ancho de pestaña de 8 para INTERCAL. He probado una versión del programa con todas las pestañas, espacios , y las nuevas líneas eliminadas, sin embargo, y funciona bien).
Compilar con
-abm
(penalización de 2 bytes, porque-b
se requiere que el compilador sea determinista).Como de costumbre para INTERCAL, esto toma la entrada numérica en el formato, por ejemplo,
ONE TWO THREE
para123
.Explicación
Cuando un programa C-INTERCAL falla, el estado de salida es el código de error módulo 256. Como resultado, podemos apuntar a escribir un programa que sea capaz de producir tantos errores de tiempo de ejecución como sea posible. Este programa solo omite dos errores de tiempo de ejecución que no indican problemas internos del compilador: ICL200I, porque su reproducción requiere el uso de bibliotecas externas que solo son compatibles con un programa de subproceso único (y los programas multiproceso tienen más errores disponibles); e ICL533I, porque 533 tiene el mismo módulo de valor 256 que 277, y el programa es capaz de producir ICL277I.
El programa siempre comienza de la misma manera. Primero, ingresamos (
WRITE IN
) un valor para la variable.1
. Luego, usamos unaCREATE
declaración calculada para crear una nueva sintaxis (aquí,A
); pero debido a que se calcula, la definición de la sintaxis varía según el valor de.1
. Finalmente, en la mayoría de los casos ejecutamos nuestra nuevaA
declaración, que se ha definido para producir un error; La tabla de posibles definiciones que tenemos contiene una definición para cada posible error de tiempo de ejecución (que no sean las excepciones enumeradas anteriormente).Primero, hay dos excepciones a este esquema general.
(0)
no es un número de línea válido, por lo que si el usuario ingresaZERO
, saltamos de la segunda línea (numerada(8)
) a la cuarta línea por medio de unaCOME FROM
declaración calculada . Esto luego cae en un error de sintaxisDO X
, que produce un errorICL000I
. (En INTERCAL, los errores de sintaxis ocurren en tiempo de ejecución, debido a la tendencia de los comandos a deshabilitarse, a redefinirse la sintaxis, etc.). LaCOME FROM
declaración también tiene un efecto secundario, incluso si no hay realCOME FROM
ocurre, la creación de una sobrecarga operando a partir.1
de#1
cada vez que se ejecuta una línea con un número de línea; esto se usa más adelante cuando se produce la salida 21. (Los efectos secundarios globales aleatorios son bastante idiomáticos en INTERCAL).La otra excepción es con entrada
ONE TWO NINE
. No hay un número de línea(129)
en el programa, por lo que obtenemos un error para un número de línea faltante, que esICL129I
. Así que no tuve que escribir ningún código para cubrir ese caso en absoluto.Aquí están los otros errores y lo que los causa:
NEXT
desbordamiento de pila (DO (123) NEXT
). LaNEXT
declaración necesita otros modificadores (FORGET
oRESUME
) para determinar retroactivamente qué tipo de declaración de control era. No tener esas causas causa el error ICL123I una vez que hay 80 sentencias `NEXT 'sin resolver.DO STASH .2
en unCOME FROM
bucle). Las reservas están limitadas solo por la memoria disponible, pero eventualmente se agotará, causando el error ICL222I.DO ,1 <- #0
significa, y causa el error ICL240I.,1
no se ha asignado (,
se usa para variables de tipo matriz en INTERCAL), por lo que la indexación causa el error ICL241I.#256 $ #0
) a una variable de 16 bits.2
. No encaja, causando el error ICL275I.#2
a.1
. Puede parecer una tarea lo suficientemente simple, pero sobrecargamos.1
para significar#1
antes, e intentar cambiar el valor de 1 sin-v
opción en la línea de comando causa el error ICL277I.GO BACK
), que no existe en este punto del programa (no hemos ejecutado ningún comando para manipular la pila de puntos de elección, por lo que todavía está vacía). Eso causa el error ICL404I.RETRIEVE .2
de un alijo inexistente (porque no escondimos nada allí en esta rama del programa), causando el error ICL436I.WRITE IN
) para siempre en unCOME FROM
bucle. Eventualmente terminaremos leyendo más allá de EOF, causando el error ICL562I.DO RESUME #0
, que no tiene sentido y está documentada específicamente como causante de un error (ICL621I).DO RESUME #9
. Todavía no hemos ejecutado tantasNEXT
declaraciones y, por lo tanto, tenemos el error ICL120I. (Curiosamente, este error particular se define en la documentación de INTERCAL como salir del programa normalmente y luego causar el error, en lugar de salir del programa con un error. Sin embargo, no creo que estos dos casos sean notablemente diferentes).Verificación
Algunos de los errores implican ejecutar intencionalmente el programa sin memoria, por lo que sugiero establecer límites de memoria bastante pequeños. Aquí está el comando de shell que usé para probar el programa (con nuevas líneas agregadas para facilitar la lectura; elimínelas si lo ejecuta usted mismo):
Y aquí está la salida (con los números de línea y los mensajes "POR FAVOR CORREGIR FUENTE" eliminados para ahorrar espacio), que agregué en parte para demostrar que el programa funciona pero principalmente para mostrar los tontos mensajes de error de INTERCAL:
fuente
Perl, 108 bytes, 256 códigos de salida
Este programa (ab) utiliza Test :: Más módulo. Intenta abrir un archivo llamado
""
n veces donde n se proporciona como argumento de línea de comando. Falla cada vez, y cada invocación se trata como una prueba. Prueba :: Más número devuelto de pruebas fallidas como código de salida.plan tests => $ARGV[0]%255
es necesario para obtener el código de salida 255.fuente
perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'
51 bytes (38 bytes + 13 bytes para-MTest::More<space>
). Toma entrada en stdin.C90 (gcc), 256 códigos de salida,
282718 bytesNo estoy seguro si esto es inteligente o cheaty, pero yo no creo que viola las reglas como por escrito: técnicamente no utiliza
exit
,return
o cualquier error de tiro mecanismo, sino que simplemente se basa en un comportamiento indefinido y el hecho de que gcc hace algo bastante conveniente en lo que respecta a este desafío.Pruébalo en línea!
Cómo funciona
Esto simplemente se usa
getchar
para leer un byte de STDIN. Por sí solo, esto no hace nada.Sin embargo, un programa C90 compatible debe terminar con una
return
declaración o algo equivalente; todo lo demás es comportamiento indefinido. gcc finaliza el ensamblado generado con un deret
todos modos, por lo que cualquier valor que se encuentre casualmente en el registro EAX será devuelto por el programa. Afortunadamente, glibc'sgetchar
almacena el byte que lee de STDIN en EAX, por lo que el valor de ese byte es el código de salida de nuestro programa.fuente
set -o fullexitcode
.return
oexit
es un error en lo que respecta al estándar C90, y resulta en un código de salida que indica falla. Eso es todo lo que un choque hace en el fondo.C (gcc) bajo shell bash en x86, 230 bytes, 8 códigos de salida
Se agregaron nuevas líneas para facilitar la lectura. Comentarios ignorados en la puntuación.
Una característica del bash shell:
Entonces, todo lo que tenemos que hacer es activar varias señales desde el programa de CA. En este punto, supongo que simplemente
kill(n-128);
está prohibido hacerlo . Entonces, en su lugar, ejecutamos código que activa varias señales, lo que hace que los códigos de error correspondientes estén disponibles en el shell de llamada.Los códigos de salida son 0, 130, 133, 134, 136, 139, 141, 142.
Pruébalo en línea . Expanda la sección "Depurar" para ver el código de retorno.
Esto ciertamente se puede jugar más profundo. Pero estaría más interesado en agregar más señales.
fuente
__asm("UD2")
ejecuta la "instrucción indefinida" x86 que provocará una excepción de CPU que el núcleo transmitirá al programa en forma de una señal SIGILL. Porsocketpair
ejemplo, SIGPIPE será enviado por el kernel o glibc mientras intentamos llegarwrite()
a una tubería que estabaclose()
en el otro extremo.int3
y noint $3
y 2) un carácter si declarav
comoint**
, dado que no depende fundamentalmente de lachar
naturaleza del tipo de datos en su aritmética de puntero, más 3) dos caracteres si usa*p
en lugar dep[0]
, o 4) seis caracteres, si está dispuesto, confíe en losfd
números predecibles devueltos por todas las llamadas al sistema que los crean, y reemplacep[0]
yp[1]
por sus valores casi ciertos. Por último,pipe(fd)
es mucho más cortosocketpair(...)
y genera el mismo error al cerrarfd[0]
y escribir en.fd[1]
.&63
lugar de-128
. 2) Reemplazarsleep(2)
confor(;;)
. 3) Reemplazarc=*(int*)c
conatoi(0)
. 4) Reemplazarc/=c-2
conc/=0
.Python 2, 13 Bytes, 2 códigos de salida
Si ingresa 0, intenta imprimir
1/-1
cuál es -1, que está perfectamente bien, por lo tanto, salga del código 0. Si ingresa 1, obtiene el1/0
que eleva unZeroDivisionError
en el que hay un código de salida de 1. Con mi IDE, solo hay 0 y 1 para los códigos de salida ...Salidas:
fuente
PHP, 15 bytes, 2 códigos de salida
Sin
die
/exit
, PHP no puede devolver nada más que0
o255
(afaik; probablemente~1
), así que ...Si el argumento de la línea de comando es falso, se evalúa
1
y sale con0
. Si no, intenta llamar a una función y sale con<b>Fatal error</b>: Uncaught Error: Call to undefined function p()
.Corre con
-r
.fuente
exit()
establece un estado de salida ... que no puedes usar para este desafío, concedido. Pero tu código también es inválido. Establece el estado de salida en 2551
. Busqué una lista de códigos de salida, pero no pude encontrar uno.Excel VBA,
414514 533 + 3 bytes, 14 códigos de salidaToma de entrada como una
Conditional Compilation Argument
,n=[input value]
y produce código de error asociado de ese número.+3 para
n=[Value]
llamada de compilación condicionalManeja entradas donde
n=
Nota: VBA no tiene códigos de salida
0
o1
. He incluido las soluciones para3
y5
, que son los dos códigos de salida con el número más bajo disponibles para VBA en su lugarfuente
#
aquí?#if
y#ElseIf
son condicionales, lo que significa que las declaraciones que siguen solo se compilan si la condición es verdadera#
, ¿dónde se compilarían si las declaraciones son verdaderas o no? Sé cómoIf
funcionan las declaraciones, pero soy nuevo en llegar a lo que realmente se compila , lo siento por una pregunta tan simple.#if
se usa en lugar deIf
oSelect Case
como solotruthy
se compilan declaraciones condicionales. En este caso específicamente, esto evita que el programa salga con código de error3
,Return without GoSub
en cada ejecución, sino que solo sale con este código cuandon=3
Turtlèd, 4 bytes, 2 códigos de salida
No sé si hay alguna forma de obtener más códigos de salida ... ¿hay incluso más formas en el idioma del intérprete?
Encontré algunas respuestas de cuatro
Pruébalo en línea!
Pruébalo en línea!
Pruébalo en línea!
Cómo funcionan estos:
en mi intérprete, hay una función de
errorque causa errores cuando la cuadrícula en la memoria tiene más de una línea y no tiene caracteres que no sean espacios. este programa borra el * en la celda de origen'[space]
, toma una entrada entera no negativa?
(0 o 1 realmente) y se mueve hacia abajo esa cantidad;
, si es cero, la cuadrícula solo tendrá una línea y no error, de lo contrario se moverá hacia abajo y ocurrirá el errorlos paréntesis y demás no se analizan, simplemente se ejecutan en tiempo de ejecución para significar: "salte al par coincidente, si el símbolo de celda no es correcto". en este programa, ingresar (
!
) uno hace que el programa lo escriba en la celda (.
), ejecute el par, que verifica si el símbolo de celda es 0, intenta saltar al par correspondiente, pero en su lugar arroja un error ya que no hay ninguno . si es cero, lo anota, comprueba los paréntesis, se encuentra en un 0 y luego lo ignora, y el programa terminatiene elementos de la respuesta anterior y la primera. toma una entrada entera no negativa, baja esa cantidad y comprueba si la celda es '*', buscando un par extra no existente si no lo es. si la entrada es 1, se moverá fuera del espacio inicial, y encontrará que la celda es un espacio, y error, si es cero, permanecerá en el espacio inicial e ignorará el par.
fuente
Javascript (nodo), 19 bytes, 2 códigos de salida
Programa completo:
Función:
process.argv
es una matriz que contiene la ruta al ejecutable del nodo, la ruta al archivo javascript ejecutado y los argumentos de la línea de comandos. En este caso, esto será"1"
o"0"
. La cadena se convierte en un número con el+
operador unario . Si el número es cero, el&&
operador diferido no evaluará el lado derecho, si el número es verdadero (no cero), se evalúa el lado derecho y se genera&&
un error porque hace referencia a una variable indefinida, y el programa existe con código de salida 1.La función espera la entrada como un número. Si la entrada es verdadera, la función se llama a sí misma y bloquea el tiempo de ejecución del nodo con un desbordamiento de pila. Si la entrada es 0, el
&&
operador diferido devuelve 0 sin evaluar el lado derecho.fuente
+process.argv[2]&&a
.ReferenceError.prototype.name=process.argv[2]?a:0
sería válido?Perl 6 , 57 bytes, 256 códigos de salida
Pruébelo
Esta es una traducción del ejemplo Perl 5.
Expandido
fuente
Scala, 19 bytes, 2 códigos de salida
if(args(0)=="1")1/0
1/(args(0).toInt-1)
La JVM solo admite 1 y 0 como códigos de salida si no llama
System.exit
.El primer programa intenta calcular
1/0
si el primer argumento es1
, lo que bloqueará la JVM con un código de salida de 1. Si el argumento es 0, saldrá con éxito.El segundo programa para convertir el argumento a entero, resta uno e intenta dividir 1 entre ese número. Si el argumento es 1, se calcula
1/0
, por lo que la JVM se bloqueará; si el argumento es 0, calcula1/-1
y sale.fuente
Python 3 , 15 bytes, 2 códigos de salida
Obviamente, esto es más largo que la solución Python 2 , porque en Python 3 no podemos tomar una entrada literal sin llamar
eval
. Sin embargo, podemos usar técnicas de comparación de cadenas de manera interesante ...La entrada será la cadena
0
o1
, si es 1, la condición se evalúa a 0 (falso), lo que resulta en un intento de cálculo1 / 0
que obviamente falla (código de salida 1). De lo contrario, no pasa nada y Python sale con el código de salida regular 0.Que yo sepa, Python es incapaz de chocar con otros códigos de salida.
fuente
Java,
7166 bytes, 2 códigos de salida4 bytes guardados gracias a Holger
Programa completo:
Función tomando un int como argumento:
El programa toma el primer carácter del primer argumento (o
'0'
o'1'
y resta 48 (valor ascii de'0'
) para obtener un número entero (0 o 1). Luego intenta establecer el argumento en la posición de ese número entero en la cadena vacía. la entrada es 1, el programa se bloquea con unArrayIndexOutOfBoundsException
, porque la matriz de argumentos solo tiene un elemento en la posición 0 (indexado a cero).fuente
a[a[0].equals("1")?1/0:1]="";
, que está a la parint x=a[0].equals("1")?1/0:1;
. Pero cambiar aún más el programa para provocar unos bytes enArrayIndexOutOfBoundsException
lugar deArithmeticException
guardarlos:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Python 2, 11 bytes, 2 códigos de salida
¡Tres soluciones diferentes de 11 bytes para tres errores diferentes! (Solo por diversión, esto no da puntos). Por defecto, Python solo tiene códigos de salida 0 para una salida exitosa y 1 para un error. Las ejecuciones exitosas no generan nada.
En la entrada 1, aparece "ValueError: conteo de desplazamiento negativo". En la entrada 0, un conteo de desplazamiento cero tiene éxito y da 1.
En la entrada 1, aparece "ZeroDivisionError: división entera o módulo por cero" debido a
~-input()
, también conocidoinput()-1
como 0. En la entrada 1,1/-1
da -1.0**-input()
También funcionaría.En la entrada 1, aparece "NameError: el nombre 'x' no está definido". En la entrada 0, esta primera desigualdad
0<0
se evalúa como False, por lo que el resto no se evalúa y el resultado es simplemente False.fuente
Node.js (ES6), 77 bytes, 2 códigos de salida
fuente
Jelly , 4 códigos de salida, 18 bytes
Admite los códigos de salida 0 , 1 , 137 (muertos) y 139 (error de segmentación).
Pruébalo en línea!
Cómo funciona
fuente
SmileBASIC, 640 bytes, 39 códigos de salida (de 52)
Esto definitivamente podría hacerse más corto. SB solo tiene códigos de error de 0 a 51, y algunos son imposibles de activar.
fuente
ZX81 BASIC> 255 códigos de salida - 52 bytes (listado)
Técnicamente,
N
podría ser cualquier número de coma flotante de 24 bits dentro del rango, pero aquí asumiremos números enteros. La línea 2 es equivalente aIF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1
si ZX81 BASIC tuvieraIF/ELSE
en sus instrucciones simbólicas.fuente
the program caused some fatal unintended exception
? Esto solo imprime algo de texto y finaliza la ejecución.RAND USR N
causará efectos no deseados ya que llamar a parte de la ROM desde un lugar inesperado no es una buena idea, por lo tanto,RAND USR 0
se ha excluido ya que es demasiado elegante.LD BC, 0000 RST 10 RET
en 0x1000 pero lo llamóRAND USR 4097
, se perderá el operando LD y, por lo tanto, el código de la máquina estará sesgado. No recuerdo todas las llamadas de ROM, pero resolveré todos los fines legales / agraciados y los excluiré más adelante.