99 (pronunciado "noventa y nueve") es un nuevo lenguaje de programación esotérico (que no debe confundirse con 99 , tenga en cuenta las cursivas). Su tarea en este desafío es escribir un intérprete para 99 que sea lo más breve posible. El envío con la menor cantidad de bytes gana. Tiebreaker va a la presentación publicada primero.
Dado que esta pregunta es un poco más profunda de lo habitual, y estoy ansioso por ver buenas respuestas, otorgaré una recompensa de 250 repeticiones a mi respuesta favorita (no necesariamente el ganador).
99 Especificaciones
99 es un lenguaje imperativo . Cada línea en un programa 99 es una declaración única , y durante la ejecución, el puntero de instrucción comienza en la línea superior y pasa por cada una de las líneas posteriores en orden, ejecutándolas en el camino. El programa finaliza cuando se ejecuta la última línea. Las instrucciones Goto pueden redirigir la ruta del puntero de instrucción.
Newline, space y 9
son los únicos tres caracteres que importan en un programa 99 . Todos los demás personajes son completamente ignorados. Además, los espacios finales en cada línea se ignoran y se leen múltiples espacios seguidos como un solo espacio. ("Nueva línea" se refiere a cualquier codificación de salto de línea común . No importa cuál use su intérprete).
Entonces este programa:
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
Es idéntico a este programa:
9 99 9999
9 9
Variables
Todas las variables en 99 tienen nombres que son uno o más 9
encadenados ( 9+
en expresiones regulares). Por ejemplo, 9
, 99
, y 9999999999
son todas las variables distintas. Naturalmente, hay infinitos (salvo limitaciones de memoria).
El valor de cada variable es un entero de precisión arbitrario con signo. Por defecto, cada variable se asigna a su propia representación numérica. Entonces, a menos que haya sido reasignado, el valor de la variable 9
es el número 9, y el valor de la variable 99
es el número 99, y así sucesivamente. Se podría considerar que trata las variables como números simples hasta que se asignan explícitamente.
Usaré V
para referirme a un nombre de variable arbitrario a continuación.
Cada instancia de V
podría ser reemplazado con 9
, 99
, 999
, 9999
, etc.
Declaraciones
Hay cinco tipos de declaraciones diferentes en 99 . Cada línea en un programa 99 contiene exactamente una declaración.
La sintaxis descrita aquí supone que todos los caracteres extraños se han eliminado, todos los espacios finales se han eliminado y todas las secuencias de espacios múltiples se han reemplazado por espacios individuales.
1. Sin operación
Una línea vacía es un no-op . No hace nada (además de incrementar el puntero de instrucción).
2. Salida
V
Una sola variable V
en una línea imprime esa variable en stdout.
Si V
tiene un número impar de 9
's ( 9
, 999
, etc.), entonces el valor entero de V
dividido por 9 será impreso (en decimal).
Si V
tiene un número par de 9
's ( 99
, 9999
, etc.) entonces el ASCII carácter con código V
dividido por 9, mod 128 será impreso. (Es decir (V / 9) % 128
, un valor de 0 a 127.)
Ejemplo : el programa
9
9999
imprimiría 1W
. La primera línea se imprime 1
porque 9/9 es 1. La segunda línea se imprime W
porque 9999/9 es 1111, y 1111 mod 128 es 87, y 87 es el código de caracteres para W
.
Tenga en cuenta que los saltos de línea no se imprimen entre los tokens de salida. \n
debe imprimirse explícitamente para un salto de línea.
3. Entrada
V
Una sola variable V
en una línea con un espacio inicial toma la entrada de stdin y la almacena en esa variable.
Si V
tiene un número impar de 9
's, entonces el usuario puede escribir cualquier número entero con signo, y V
se establecerá en 9 veces ese valor.
Si V
tiene un número par de 9
's, entonces el usuario puede escribir cualquier carácter ASCII, y V
se establecerá en 9 veces su código de caracteres.
Ejemplo : dado -57
y A
como entrada, este programa
9
9
99
99
haría de salida -57A
. Internamente, la variable 9
tendría el valor -513 y 99
tendría el valor 585.
Su intérprete puede suponer que las entradas son siempre sintácticamente válidas.
4. Asignación
Esta declaración puede ser arbitrariamente larga. Son dos o más variables en una línea, separadas por espacios:
V1 V2 V3 V4 V5 ...
Esto se asigna a la suma de todos los 's con índices pares, menos la suma de los ' s con índices impares (excluyendo ). Las asignaciones son por valor, no por referencia.V1
V
V
V1
Se podría traducir en la mayoría de los idiomas como .V1 = V2 - V3 + V4 - V5 + ...
Entonces, si solo hay dos variables, es una asignación normal:
V1 V2
→ V1 = V2
Si hay tres, entonces es resta:
V1 V2 V3
→ V1 = V2 - V3
Y el signo +
/ -
sigue cambiando de un lado a otro con cada variable adicional:
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
Ejemplo : este programa generaría 1110123
:
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5. Ir a (saltar si todo es cero)
Esta declaración también puede ser arbitrariamente larga. Son dos o más variables en una línea, separadas por espacios, con un espacio inicial :
V1 V2 V3 V4 V5 ...
Si algunos de los valores además no son cero, entonces esto se comporta como un no-op. El puntero de instrucciones se mueve a la siguiente línea como de costumbre.V1
Si todos los valores además son cero, entonces el puntero de instrucción se mueve al número de línea . Las líneas están indexadas a cero, por lo que si es cero, el puntero se mueve a la línea superior. El programa finaliza (normalmente, sin error) si es negativo o es mayor que el índice más alto posible (número de líneas menos uno).V1
V1
V1
V1
Tenga en cuenta que no se dividió por 9 aquí. Y dado que es imposible que una variable sea un valor que no sea múltiplo de 9, solo se puede saltar a los números de línea que son múltiplos de 9.V1
Ejemplos:
Este programa imprimirá 1
para siempre:
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
Este programa
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
mostrará los números del 11 al 1, en orden decreciente, rodeados por G
's:
G11G10G9G8G7G6G5G4G3G2G1G
Detalles adicionales
El intérprete ideal se ejecutará desde la línea de comandos con el nombre del archivo del programa 99 como argumento. La E / S también se realizará sobre la marcha en la línea de comando.
Sin embargo, puede escribir una función de intérprete que tome el programa como una cadena, así como una lista de los tokens de entrada (por ejemplo ["-57", "A"]
). La función debe imprimir o devolver la cadena de salida.
Formas ligeramente diferentes de ejecutar el intérprete y manejar la E / S están bien si estas opciones son imposibles en su idioma.
Bonificación: escriba algo genial en 99 y con gusto lo pondré en esta publicación como ejemplo.
- Aquí hay un Pastebin de un lindo programa "99 Botellas de cerveza" de la respuesta de Mac .
¡Espero que hayas disfrutado de mi 99º desafío! :RE