Golfe um intérprete roxo
Roxa é um esolang que é projetado com dois objetivos principais:
- Para ser uma minimização de Aubergine , já que simplesmente não existem linguagens de instrução única modificáveis o suficiente.
- Admitir a possibilidade de terrivelmente pequena intérpretes de golfe. Minha primeira passagem em um intérprete razoavelmente completo de Python 2 tem apenas 702 bytes, e tenho certeza de que um jogador mais experiente pode se barbear um pouco com isso.
Seu objetivo é escrever um intérprete para esse idioma.
Informação sobre Estados Unidos da América:
Um programa Purple é uma sequência de caracteres inseridos em uma matriz de memória infinita e endereçável, de modo que o primeiro caractere do programa seja colocado no endereço zero. O restante da matriz (antes e depois de onde o programa Purple está armazenado) é inicializado como zero.
Há três registros em roxo, chamados a e b e i , cada um dos quais pode conter um inteiro assinado e é inicializado para zero. i também é o ponteiro da instrução e sempre aponta para a instrução Purple em execução no momento.
A cada ciclo, o intérprete lê uma sequência de três caracteres contíguos, começando na localização da memória indicada pelo ponteiro da instrução e tenta executar essa sequência como a instrução Roxa. Depois, o ponteiro da instrução é sempre incrementado em 3.
Sintaticamente, a instrução Purple consiste em três caracteres (ou codificações) em uma linha, como " xyz ".
O primeiro caractere x pode ser um dos seguintes:
abABio
Esses símbolos têm o seguinte 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.
Os outros dois bytes y e z podem ser qualquer um dos seguintes:
abABio1
Cada um desses símbolos tem o seguinte 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.
Após buscar a instrução, o intérprete Purple avaliará ye depois z , subtrairá o resultado de z do resultado de y e executará a ação indicada por x na diferença.
Se a sequência de três caracteres (ou suas codificações) não for uma instrução roxa válida, o intérprete será interrompido imediatamente sem erros.
Seu intérprete deve:
- Seja um programa completo, não uma função.
- Nunca envie para stderr, a menos que EOF seja lido .
- Comporte-se de maneira idêntica à implementação de referência em todas as entradas bem formadas que não envolvam números muito grandes, incluindo os programas de teste fornecidos abaixo. (Bem, identicamente até o momento - ele pode ser mais lento, mas não muito!)
Você pode fornecer o programa ao intérprete da forma que desejar: leia-o de um arquivo, incorpore-o ao programa como uma string ou leia-o de stdin.
Casos de teste:
O programa
ooo
quando executado com entrada
z!
deve render
Y
O programa
bbboobiii
quando executado com entrada
It's a cat program.
(ou qualquer outra entrada) deve render
It's a cat program.
(ou qualquer outra entrada recebida) e, em seguida, comece novamente e faça a mesma coisa novamente .
O programa
Aoab11bi1bABoAaiba
quando executado com entrada
0
deve render
0
e depois parar, mas quando executado com entrada
1
deve continuar produzindo
1
para sempre.
O programa
b1bbb1oAbabaa1ab1Ab1Bi1b
deve render
b1bbb1oAbabaa1ab1Ab1Bi1b
O programa
aA1aa1bb1oAbbi1bb1bbAb1Bi1b Purple is the awesomest! Why haven't you tried it yet?
!dlroW ,olleG
deve render
Hello, World!
Pontuação:
Esse é o código-golfe , e a fonte mais curta em bytes, potencialmente modificada pelo bônus a seguir, vence.
Bônus:
- -10% se o seu intérprete lê um nome de arquivo do stdin ou de um argumento da linha de comando e carrega o programa a partir do arquivo.
uint32
caracteres e MAXINT para ints