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.
uint32
para los caracteres y MAXINT para las entradas