Golf un intérprete morado
El púrpura es un esolang que está diseñado con dos propósitos principales:
- Para ser una minimización de Aubergine , ya que simplemente no hay suficientes lenguajes de una sola instrucción auto modificables.
- Para admitir la posibilidad de intérpretes de golf terriblemente pequeños . Mi primer pase en un intérprete de Python 2 razonablemente completo es de solo 702 bytes, y estoy seguro de que un golfista más experimentado podría afeitarse un poco.
Su objetivo es escribir un intérprete para este idioma.
Información sobre púrpura:
Un programa púrpura es una secuencia de caracteres colocados en una matriz de memoria infinita y direccionable, de modo que el primer carácter del programa se coloca en la dirección cero. El resto de la matriz (tanto antes como después de donde se almacena el programa Purple) se inicializa a cero.
Hay tres registros en púrpura, llamados a y b y i , cada uno de los cuales puede contener un número entero firmado y se inicializa a cero. i también es el puntero de instrucciones, y siempre apunta a la instrucción Purple que se está ejecutando actualmente.
Cada ciclo, el intérprete leerá una secuencia de tres caracteres contiguos a partir de la ubicación de memoria indicada por el puntero de la instrucción e intentará ejecutar esta secuencia como la instrucción Púrpura. Posteriormente, el puntero de instrucciones siempre se incrementa en 3.
Sintácticamente, la instrucción Púrpura consta de tres caracteres (o codificaciones de los mismos) en una fila, como " xyz ".
El primer carácter x puede ser cualquiera de los siguientes:
abABio
Estos símbolos tienen el siguiente significado:
a - Place the result in register a.
b - Place the result in register b.
A - Place the result in the location in memory referred to by register a.
B - Place the result in the location in memory referred to by register b.
i - Set the instruction pointer to the result.
o - Output the result to stdout.
Los otros dos bytes y y z pueden ser cualquiera de los siguientes:
abABio1
Cada uno de estos símbolos tiene el siguiente significado:
a - Return the contents of register a.
b - Return the contents of register b.
A - Return the contents of the memory array at the address stored in register a.
B - Return the contents of the memory array at the address stored in register b.
i - Return the contents of register i (the instruction pointer).
o - Return the value of a single character read from stdin.
1 - Return the literal numeric value 1.
Después de buscar la instrucción, el intérprete de Purple evaluará y y luego z , restará el resultado de z del resultado de y , y luego realizará la acción indicada por x en la diferencia.
Si la secuencia de tres caracteres (o sus codificaciones) no es una instrucción púrpura válida, el intérprete se detiene inmediatamente sin dar ningún error.
Su intérprete debe:
- Sea un programa completo, no una función.
- Nunca envíe a stderr, a menos que se lea EOF .
- Comportarse de manera idéntica a la implementación de referencia en todas las entradas bien formadas que no involucren números muy grandes, incluidos los programas de prueba que se proporcionan a continuación. (Bueno, idénticamente hasta el momento, ¡puede correr más lento, pero no demasiado!)
Puede proporcionar el programa al intérprete en cualquier forma que desee: leerlo desde un archivo, incrustarlo en el programa como una cadena o leerlo desde stdin.
Casos de prueba:
El programa
ooo
cuando se ejecuta con entrada
z!
debería rendir
Y
El programa
bbboobiii
cuando se ejecuta con entrada
It's a cat program.
(o cualquier otro insumo) debería producir
It's a cat program.
(o cualquier entrada que haya recibido) y luego comience de nuevo y haga lo mismo nuevamente .
El programa
Aoab11bi1bABoAaiba
cuando se ejecuta con entrada
0
debería rendir
0
y luego detener, pero cuando se ejecuta con entrada
1
debería continuar produciendo
1
Siempre.
El programa
b1bbb1oAbabaa1ab1Ab1Bi1b
debería rendir
b1bbb1oAbabaa1ab1Ab1Bi1b
El programa
aA1aa1bb1oAbbi1bb1bbAb1Bi1b Purple is the awesomest! Why haven't you tried it yet?
!dlroW ,olleG
debería rendir
Hello, World!
Puntuación:
Este es el código de golf , por lo que gana la fuente más corta en bytes, modificada potencialmente por el siguiente bono.
Prima:
- -10% si su intérprete lee un nombre de archivo de stdin o de un argumento de línea de comando y carga el programa desde el archivo.
fuente
uint32
para los caracteres y MAXINT para las entradasRespuestas:
Pyth,
148128121 bytes (o 124 * .9 = 111.6, ver abajo)Banco de pruebas
Código dado en la primera línea de STDIN, entrada al programa Purple en el resto de STDIN. Para usar código con líneas nuevas, use una versión alternativa en la parte inferior.
Razonablemente golfizado. Aquí está con saltos de línea y sangría para mayor claridad:
Básicamente, un
#
bucle realiza la ejecución y se detiene a través de un corte de error.a
yb
se combinan en una sola variable,J
.Z
es el puntero de instrucciones.k
es entrada al programa Purple.H
es la cinta, representada como un diccionario.b
es el resultado actualY
es el primer byte actual de la instrucción.Lectura del archivo:
Indique el nombre del archivo como primera línea de STDIN. Prueba de funcionamiento:
fuente
JavaScript (ES6), 292 bytes
Explicación
Las respuestas de JavaScript son siempre extrañas cuando
STDIN
ySTDOUT
se requieren ...El primer aviso es la entrada para la cadena del programa. Cada solicitud que resulte de una
o
instrucción leerá solo el primer carácter.eval
se usa para reemplazar una frase común que ahorra algunos bytes. Sin golf y sin eleval
programa se ve así:fuente
c="charCodeAt"
puede reemplazar el segundo por soloc
?array[-1] = 1
es el mismo quearray = { "-1": 1 }
. Se puede acceder a ambos conarray[-1]
.Ceilán,
827792671 bytesSe comporta de manera un poco diferente a la implementación de referencia cuando el programa intenta leer la entrada en EOF: la implementación de referencia se bloquea con un TypeError, que es demasiado costoso para reproducir aquí (y también es probable que sea un error), por lo que esto devolverá -1 en su lugar ( repetidamente, si es necesario).
(Sin embargo, cuando intente escribir este -1 en stdout, el intérprete terminará con un OverflowError. Sucederá algo similar si sale un número entero fuera del rango Unicode).
El intérprete toma el programa como su primer argumento de línea de comando (asegúrese de citarlo para su shell cuando contenga espacios en blanco u otras cosas interesantes).
En Ceilán solo podemos leer fácilmente la entrada en línea (supongo que esto cambiará en una de las próximas versiones), así que cuando
o
se usa para leer, estoy leyendo una línea completa y almacenando las partes para usos futuros. Supongo que funciona de manera similar en la implementación de Python cuando está conectado a una terminal.Al intentar ejecutar un comando (parte) que no es uno de los caracteres válidos, el
nothing
provocará que se arroje un AssertionError, que luego atraparemos en el bloque catch alrededor del bucle principal.Creo que esto debería ser preferiblemente un tipo de excepción personalizado (ya que AssertionError también podría ocurrir en otros lugares si tengo un error), pero eso tomaría mucho más espacio, consumiendo la mayoría de las mejoras que hice desde la primera versión.
Algunos trucos utilizados para jugar al golf:
map
función, y creamos uno nuevo cada vezA
oB
se usa como x .variable
anotación, que es ahoral
).E
(para el entorno) y els
método (paso): ahora todo sucede dentro de larun
función..integer
para obtener el punto de código de un personaje,.hash
da el mismo resultado. Porstring*.hash
lo tanto, es lo mismo questring.map(Character.integer)
(da un iterable de los puntos de código de una cadena).is I ...
es más corto queexists ...
.x
. Ej. ) En una cadena,"``t``"
es más corto quet.string
(o, lo que usé para un personajeString{t}
).Aquí está la versión formateada (y comentada):
fuente