Neste desafio, você escreverá um intérprete para 2 Ω (transcrito como TwoMega ), uma linguagem baseada livremente no cérebro, com um espaço de armazenamento de dimensão infinita.
O idioma
2 Ω contém três partes do estado:
A fita , que é uma lista infinita de bits, foi inicializada como 0. Ela possui um elemento mais à esquerda, mas nenhum elemento à direita.
O ponteiro de memória , que é um número inteiro não negativo que é um índice de um elemento na fita. Um ponteiro de memória mais alto refere-se a uma célula de fita mais à direita; um ponteiro de memória 0 refere-se ao elemento mais à esquerda. O ponteiro de memória é inicializado em 0.
O Hipercubo , que é uma "caixa" conceitual ∞- dimensional de células, cada uma das quais contém um bit inicializado como 0. A largura do Hipercubo é vinculada em todas as dimensões a apenas 2 células, mas a infinidade de dimensões significa o número de células. células é incontável .
Um índice no hipercubo é uma lista infinita de bits que se refere a uma célula no hipercubo (da mesma maneira que uma lista finita de bits pode ser usada para se referir a um hipercubo de dimensão finita). Como a fita é uma lista infinita de bits, a fita inteira sempre se refere a um elemento do Hypercube; esse elemento é chamado de referente .
2 Ω dá sentido a 7 caracteres diferentes:
<
diminui o ponteiro da memória em 1. Decrementá-lo abaixo de 0 é um comportamento indefinido, portanto você não precisa lidar com isso.>
aumenta o ponteiro da memória em 1.!
vira o bit no referente..
gera o bit no referente.^
substitui o bit na célula apontada pelo ponteiro de memória na fita pelo inverso do bit no referente.[x]
executa o códigox
contanto que o bit no referente seja 1.
O desafio
Sua tarefa é escrever um programa que use uma string como entrada e execute essa entrada como um programa de 2 Ω .
Isso é código-golfe , então a resposta mais curta e válida (medida em bytes) vence.
Notas
- Você pode assumir que o programa consistirá apenas dos caracteres
<>!.^[]
e que[]
será aninhado corretamente. - Seu intérprete deve ser limitado apenas pela memória disponível no sistema. Ele deve ser capaz de executar os programas de amostra em um período de tempo razoável.
Programas de exemplo
Impressão 1:
!.
Impressão 010:
.!.!.
Imprimir 0 para sempre:
![!.!]
Imprima 0 para sempre ou 1 para sempre se !
for anexado:
[.]![!.!]
cat
programa: não parece haver uma instrução para receber sugestões.
.
- imprime um único zero e depois existe; !^!.
- imprime uma única e sai. Mais seria bom embora. No momento em que é preciso entender apresentações, a fim de verificar-los (e, portanto, upvote-los!)
[0,0,0,0,0,0,0...]
(ou seja, a presença de um !
no início do programa).
[.]![!.!]
para imprimir o valor dessa célula para sempre
1
s na fita é sempre finito. De fato, existe uma bijeção bastante simples entre os números naturais e os estados da fita (interpreta o conteúdo da fita como um número binário reverso), o que mostra que o Hypercube é basicamente uma matriz 1D infinita, acessada por bits de inversão em um valor de ponteiro inteiro , em vez de diminuir / diminuir como no cérebro.