Me gusta el concepto de 0815 , excepto que el intérprete en el sitio web del creador devuelve un Error 404. ¡Así que decidí pedirles ayuda a todos!
Los basicos
0815 se basa en tres (3) registros y una cola. Los registros se denominan X, Y y Z, donde X es de solo escritura, Z es de solo lectura e Y es un registro "auxiliar" al que no se puede acceder directamente. Todos los registros comienzan en 0. Todos los números están en hexadecimal.
Instrucciones
Nota: Algunas instrucciones toman parámetros que están formateados como }:hello:
donde :hello:
está el parámetro. Otra nota: algunas de las descripciones de las instrucciones no son claras, así que me tomé algunas libertades con ellas. (Instrucciones originales aquí )
~
significa que el parámetro es obligatorio
----------|---|--------------------------------------------
~Move | < | <:8: will write 8 to X (parameter required)
----------|---|--------------------------------------------
Swap | x | Swap X and Y
----------|---|--------------------------------------------
~Label | } | }:hello: makes a label called 'hello'
----------|---|--------------------------------------------
Input | | | Set X to an integer from input in
Number | | hexadecimal greedily (regex: [0-9A-F]+)
----------|---|--------------------------------------------
Input | ! | Set X to the ASCII code of one ASCII
ASCII | | character in the input
----------|---|--------------------------------------------
Print | % | Prints an integer stored in Z
number | | (hexadecimal base)
----------|---|--------------------------------------------
Print | $ | Prints an ASCII char stored in Z
ASCII | |
----------|---|--------------------------------------------
Roll | | Rolls all registers to the left
Registers | ~ | X <- Y <- Z <- X
Left | | After roll: X = Y, Y = Z and Z = X
----------|---|--------------------------------------------
Roll | | Rolls all registers to the right
Registers | = | X -> Y -> Z -> X
Right | | After roll: Y = X, Z = Y and X = Z
----------|---|--------------------------------------------
~Jump if | ^ | ^:loop: Jumps to the label 'loop' if Z is
not zero | | not zero
----------|---|--------------------------------------------
~Jump if | # | #:loop: Jumps to the label 'loop' if Z is
zero | | zero
----------|---|--------------------------------------------
Instrucciones de cola
----------|---|--------------------------------------------
Clear | ? | Clears the queue
----------|---|--------------------------------------------
Enqueue | > | Enqueue the number stored in Z
----------|---|--------------------------------------------
Dequeue | { | Dequeue a number into X
----------|---|--------------------------------------------
| | Rolls the queue to the left, wrapping as
Roll | | necessary. The first number becomes the
Queue | @ | last; second becomes first and so on. Can
Left | | take a parameter to roll a certain number
| | of times. @:b: rolls 11 times.
----------|---|--------------------------------------------
Roll | |
Queue | & | The opposite of @
Right | |
----------|---|--------------------------------------------
Instrucciones aritméticas
----------|---|--------------------------------------------
Add | + | Z = X + Y
----------|---|--------------------------------------------
Subtract | - | Z = X - Y
----------|---|--------------------------------------------
Multiply | * | Z = X * Y
----------|---|--------------------------------------------
Divide | / | Z = X / Y
| | Y = remainder
----------|---|--------------------------------------------
Programas de ejemplo
Hola mundo: (Ligeramente golfizado)
<:48:~$<:65:~$<:6C:~$$><:6F:~$>@<:2C:~$<:20:~$<:57:~${~$<:72:~${~$<:64:~$
Gato:
}:_t:!~$^:_t:
Máquina de la verdad:
|~}:i:%^:i:
Este es el código de golf , por lo que gana el envío con la menor cantidad de bytes.
fuente
~
y~
en sus comandos "roll registers"? ¿Tiene un programa de ejemplo que la gente pueda usar para probar?Respuestas:
Pip ,
321262248 bytesMuy acortado usando eval y algunos trucos de complejidad de Kolmogorov.
Pruébalo en línea! (El ejemplo es el programa de números Collatz / hailstone del sitio web del autor del idioma).
Notas:
[0-9A-F]+
). Si, en una|
instrucción, el siguiente carácter de entrada no es0-9A-F
, la lectura falla y provoca un comportamiento potencialmente extraño. Esto significa que el programa impar del autor no funciona como está escrito ... No estoy seguro de cómo esperaba que funcionaran las lecturas de números múltiples, pero simplemente lo implementé de acuerdo con lo que decía la especificación.Mi versión sin golf con comentarios:
fuente
haxe, 987 bytes
o con algún espacio en blanco:
¿Golf con éxito con haxe? Guau.
fuente
Python 3, 1320 bytes
La versión no protegida, así como el análisis de (y cuando sea necesario, las versiones corregidas de) los programas de prueba, se pueden encontrar en esta esencia .
Decisiones de diseño:
Hay problemas con los programas de ejemplo que usan CR solo como su nueva línea (a veces), lo que hace que mi shell sobrescriba la línea actual en lugar de comenzar una nueva. Esto afecta la secuencia de Fibonacci y los programas de 99 botellas de cerveza. El último verso de 99 Botellas de cerveza tampoco se imprime correctamente, y todavía estoy investigando por qué.
fuente
Scala,
3.1232.8442.6262.540 bytesAdemás de las limitaciones esbozadas en la pregunta, este intérprete fue escrito para inclinarse lo más posible hacia los principios de FP. Específicamente:
Esto se logró, con la excepción de las cuatro líneas de código que impulsan el bucle principal del intérprete. Las estructuras inmutables eran muy difíciles de utilizar aquí porque el estado de los registros impulsa el flujo de control del bucle (específicamente las dos declaraciones GOTO). Todavía estoy pensando en cómo convertirlo para usar estructuras puras e inmutables, pero eso es irrelevante para el desafío del código de golf.
Publicaré la versión no protegida en Github y proporcionaré un enlace cuando lo haga. Por ahora, publicaré la versión original aquí:
fuente
Flex / C ++,
848838bytesCompilado con:
También podría compilarse con otros
lex
es, pero no lo comprobé. Funciona en dos pases, por lo que los saltos hacia adelante se manejan correctamente. Los nombres de las etiquetas pueden comenzar con un dígito, como ocurre más de una vez en los casos de prueba. Los literales hexadecimales solo pueden ser mayúsculas, de acuerdo con las especificaciones.Pasa todos los casos de prueba, incluidos los que se encuentran en Esolangs Wiki y la página 0815. El manejo de errores es inexistente y la salida en una etiqueta desconocida no es elegante, después de todo esto es code-golf.
Estoy preparando al intérprete no golfista (y mucho más amable) para un lanzamiento, para que OP pueda seguir jugando con 0815. Estén atentos :)
fuente
\r
lugar de\n
como una nueva línea (¿Mac OS de la vieja escuela?), Así que si quieres ver algo impreso en la pantalla, úsalo./0815 99bb.0815 | tr "\r" "\n"
. Lo mismo para Fibonacci.Lisp común, 1088 bytes
Sin golf
Con seguimiento opcional en tiempo de ejecución.
Fibonnaci
Macroexpansion
Salida
Quizás más explicaciones después
fuente
Python 3,
1573, 1499 bytesEjecuta los programas de ejemplo en http://paulo-jorente.de/poncho/esolang/0815/ e implementa todas las instrucciones (incluso las que escriben, de acuerdo con las especificaciones originales).
Ejecuta el archivo fuente pasado en la línea de comando.
fuente
j=raw_input
aj=input
), pero no me funciona en el programa "99 Botellas de cerveza". Una muestra ("//" para nueva línea): "0x63 // 0x63 vasos de cerveza en la pared // 0x62 uno hacia abajo y pásalo // 0x62 vasos de cerveza en la pared // 0x62 vasos de cerveza en la pared // 0x61 uno hacia abajo y pasarlo ")