Instruções
Subleq
Subleq é um exemplo de máquina de uma instrução (OISC).
Ele é nomeado a partir de sua única instrução, que é SUbtract e Branch if Less than or EQual to zero.
Sua tarefa é criar um interpretador que emule esse tipo de máquina.
A memória da máquina consiste em um array de números inteiros com sinal. Qualquer tamanho razoável de palavra é bom, mas a memória deve ser capaz de manter números negativos e positivos.
A execução começa com o ponteiro de instrução mirando a primeira palavra, que é o endereço 0. Ela prossegue da seguinte forma:
<ol>
<li>Let A, B, and C be the value stored in the three consecutive words in memory starting at the instruction pointer.</li>
<li>Advance the instruction pointer 3 words to point at the address after the one containing C.</li>
<li>If A is -1, then a character is read from standard input and its code point stored in the address given by B. C is unused.</li>
<li>If B is -1, then the number contained in the address given by A is interpreted as a code point and the corresponding character output. C is again unused.</li>
<li>Otherwise, both A and B are treated as the addresses of memory locations. The number contained in the address given by A is subtracted from the number at the address given by B (and the result stored back in address B). If the result is zero or negative, the value C becomes the new instruction pointer.</li>
<li>If the instruction pointer becomes negative, execution halts.</li>
</ol>
Outros endereços negativos além de -1 podem ser tratados como equivalentes a -1 ou gerar um erro, como você achar adequado.
A solução deve aceitar um programa que será executado na máquina, separadamente da entrada alimentado no programa em si.
Este programa deve estar em "código de máquina" subleq puro - números decimais separados por espaços em branco, sem nomes simbólicos ou outras extensões de nível de assembly, a serem carregadas na memória começando no endereço 0. Mostre a saída da sua solução quando alimentada com este programa "Hello, world!". (Observe que o exemplo assume ASCII ou um superconjunto dele, como qualquer um dos conjuntos de caracteres Latin-N ou Unicode. Você pode traduzi-lo para outro conjunto de caracteres se a implementação estiver em um ambiente não compatível com ASCII.)
<pre>15 17 -1 17 -1 -1 16 1 -1 16 3 -1 15 15 0 0 -1 72 101 108 108 111 44 32 119 111 114 108 100 33 10 0</pre>
O que corresponde a algo assim em uma linguagem hipotética de assembler:
<pre>start:
zero, message, -1
message, -1, -1
neg1, start+1, -1
neg1, start+3, -1
zero, zero, start
zero: 0
neg1: -1
message: "Hello, world!\n\0"
</pre>
O que fazer:
Escreva uma função que receba um array de números inteiros como parâmetro. Ele representa os elementos da memória. A função deve interpretar a sequência e retornar a string de saída. Para esta tarefa, considere que não há uma entrada padrão.
Critérios de Aceitação:
Critérios de Aceitação:
Testes:
- `Subleq` deve ser uma função.
- `Subleq([15, 17, -1, 17, -1, -1, 16, 1, -1, 16, 3, -1, 15, 15, 0, 0, -1, 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 0])` deve retornar uma string.
- `Subleq([15, 17, -1, 17, -1, -1, 16, 1, -1, 16, 3, -1, 15, 15, 0, 0, -1, 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 0])` deve retornar `"Hello, world!"`.
Console