Usted debe escribir un programa o función que, cuando se les da un no vacío cadena de S de N caracteres ASCII imprimibles † , da salida a un programa que va a salir con el código de salida C , donde C es el punto de código ASCII en la posición 0 en S . Este programa se escribe lo hará, además, un programa de salida P , de tal manera que, cuando se ejecuta, se sale con código de salida C ' , donde C' es el punto de código ASCII en la posición 1 en S . El programa P generará otro programa P ' . Este proceso se repite hasta que no quedan caracteres en S. Una vez hecho esto, no debe generar nada, seguido de una nueva línea opcional; y debe salir con el código de salida 0.
† Los caracteres entre 0x20
e 0x7e
inclusive.
Algunas reglas más:
- Los programas auto modificables no están permitidos: debe enviar la fuente a STDOUT (o, inicialmente, devolver el valor)
- No puede leer su propio código fuente.
El programa más corto de este tipo en bytes ganará.
Para algunas pruebas rudimentarias, se puede usar este script ruby . (El primer argumento es la forma en que invocas el script, el segundo es el programa y el tercero es la cadena de entrada).
Ejemplo hipotético
Digamos que el programa es FOO
. Cuando se le da la cadena "ABC", sale BARA
. Este programa sale con código 65
y salidas BARB
. Esto a su vez sale con código 66
y salidas BARC
. Este programa sale con código 67
y salidas BAR!
. Esto no genera nada y sale con código 0
.
0
es el éxito tio.run/nexus/…33 throw
arrojar un número arbitrario. Utiliza negativos para el nivel del sistema operativo y el desplazamiento es -512. Tampoco mucho, pero estoy buscando aquí: complang.tuwien.ac.at/forth/gforth/Docs-html/…Respuestas:
Python 2,
12610194 bytesEn el proceso de hacer esto, descubrí que el código Python puede no contener bytes NUL literales.
Pruébelo en línea (muestra el código de salida en la información de depuración)
Tenga en cuenta que cada uno de los programas no vacíos a continuación tiene un salto de línea final.
Para la entrada
Hello
, las salidas anteriores:que imprime
...
que imprime
que imprime
que no imprime nada (el programa vacío)
que no imprime nada y sale con el código 0.
fuente
Python 3, 77 bytes
Este código toma la entrada de STDIN y emite el primer programa a STDOUT.
Si la entrada es
ABCDE
, los resultados sondonde cada línea contiene el código de salida y la salida del programa ejecutado previamente (la primera línea es el primer programa).
fuente
Python 3 ,
115108100 bytesPruébalo en línea!
Para la entrada
Hello
, el programa imprime:El programa anterior imprime:
y sale con código
72
.Pruébalo en línea!
El programa anterior imprime
y sale con código
101
.Pruébalo en línea!
El programa anterior imprime:
y sale con código
108
.Pruébalo en línea!
El programa anterior imprime:
y sale con código
108
.Pruébalo en línea!
El programa anterior no imprime nada y sale con código
111
.Pruébalo en línea!
El programa vacío no imprime nada y sale con código
0
.Pruébalo en línea!
fuente
C, 156 bytes
Pruébalo en línea! (Abra la pestaña de depuración para ver el código de salida).
Toma la entrada como un argumento de línea de comando.
Para la entrada "ABC", esto genera el programa
que devuelve 65 y produce
que devuelve 66 y produce
que devuelve 67 y produce
que no genera nada y devuelve 0.
fuente
Python 2, 67 bytes
Basado en esta respuesta , pero modificado para usar Python 2, con un programa trivial
0
para imprimir nada y salir.Pruébalo en línea
fuente
RPL, 73 bytes
Con la página de códigos hp8.
Encienda su HP48 o similar, o dispare droid48 . No te olvides de
-52 SF
una mejor visualización de la pila. Supongo que ya ha empujado la cadena, por ejemplo"ABC"
, en la pila. Luego ingrese la siguiente función:(Por conveniencia, sugiero presionar la tecla α dos veces antes de escribir cualquier cosa, por lo tanto, bloquear el modo de entrada alfa. Posteriormente use la tecla DEL para cancelar los delimitadores de cierre insertados automáticamente. Simplemente use la tecla ENTER para validar. No olvide el espacio después del operador de puñalada.)
Esta función empuja inmediatamente en la pila un programa auto modificable, bajo la forma de una lista. (Pero la función anterior no se modifica a sí misma). Como L en RPL originalmente significa LISP, presionar la tecla EVAL evaluará este programa. Devuelve el código de salida en el nivel dos de la pila y se deja modificado (sí, aquí es cuestionable), para un último EVAL. Por lo tanto, presione EVAL varias veces hasta que el programa finalmente se detenga para caer en el nivel uno de la pila. El código de salida final 0 aparece así en el nivel uno, con los códigos de salida anteriores arriba. Si olvidó hacerlo
-52 SF
, puede navegar en la pila después de cada EVAL presionando la tecla ▴ (salga de este modo de navegación con la tecla ON). La función anterior acepta cadenas con caracteres 0x0 dentro, para crear tales cadenas0 CHR
y+
son tus amigos. La auto modificación consiste en eliminar el char usado de la cadena incrustada (laSUB 2 SWAP PUT
rama). Por lo tanto, el programa eliminado es más corto después de cada EVAL. La4 DROPN
rama asegura que la salida no respeta las instrucciones del OP, eliminando entre otros el programa en sí. Por supuesto, todo esto supone que su nota es-55 SF
experta. Los usuarios de-55 SF
serán prohibidos. Siempre.Supongo que existe una solución RPL / 2, y podría presentar un código de salida de Unix real, pero afaik RPL / 2 tiene una introspección limitada y no puede evaluar listas.
fuente
sed ,
467461 bytesLos códigos de caracteres son difíciles:
Pruébalo en línea!
De lo contrario, la lógica es bastante sencilla: (1) escapar caracteres especiales (hay dos), (2) envolver en una
s/^/…/;q\1
capa adicional , (3) repetir.Aquí está la salida para
hello
:Y un pequeño script que usé:
fuente
PowerShell,
172156bytes.La
h3l}'{l0
entrada dará como resultado la próxima salidaPruébalo en línea!
Que a su vez dará salida
Pruébalo en línea!
La última ejecución no generará nada y el código de salida será 0.
Pruébalo en línea!
fuente