Escreva um intérprete para 2B
Gosto da linguagem esotérica 2B de David Catt , com memória armazenada em uma fita em que cada célula é uma fita separada de bytes (a 'subtape'). Escreva um intérprete para ele!
Especificação de idioma
Especificações oficiais podem ser encontradas aqui . Nesta especificação, "
significa um número no intervalo 0-9
( 0
é interpretado como 10
) e _
significa uma sequência de qualquer comprimento. Cada célula armazena um valor no intervalo 0-255
e o transbordamento / transbordamento envolve como um BF. (Obrigado @ MartinBüttner). Para converter texto em números 0-255
, use códigos ASCII . Como não encontro detalhes sobre isso, vou dizer que o comprimento da fita deve ser 255
mínimo, mas se você souber o contrário, edite.
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| Instruction | Description |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 0 | Zeroes the current cell and clears the overflow/underflow flag. |
| { | If the current cell is zero, jump to the matching }. |
| } | A placeholder for the { instruction. |
| ( | Read a byte from the input stream and place it in the current cell. |
| ) | Write the value of the current cell to the console. |
| x | Store the value of the current cell in a temporary register. |
| o | Write the value of the temporary register to the console. |
| ! | If the last addition overflowed, add one to the current cell. If the last subtraction underflowed, subtract one from the current cell. |
| ? | Performs a binary NOT on the current cell. |
| +" | Adds an amount to the current cell. |
| -" | Subtracts an amount from the current cell. |
| ^" | Moves the subtape up a number of times. |
| V" | Moves the subtape down a number of times. |
| <" | Moves the tape left a number of times. |
| >" | Moves the tape right a number of times. |
| :_: | Defines a label of name _. |
| *_* | Jumps to a label of name _. |
| ~_~ | Defines a function of name _. |
| @_@ | Calls a function of name _. |
| % | Ends a function definition. |
| #_# | Is a comment. |
| [SPACE] | Is an NOP. |
| [NEWLINE] | Is treated as whitespace and removed. |
| [TAB] | Is treated as whitespace and removed. |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
Testes
+0+0+0+0+0+0+0+2)+0+0+9)+7))+3)-0-0-0-0-0-0-0-9)+0+0+0+0+0+0+0+0+7)-8)+3)-6)-8)-7-0-0-0-0-0-0)
Saída Hello world!
+1:i:{()*i*}
Tipo de cat
programa, apenas sem uma nova linha.
+1:loop:{@ReadChar@*loop*}@PrintHello@@WriteAll@(~ReadChar~(x-0-3<2o^1>1+1>1%~PrintHello~+0+0+0+0+0+0+0+2)-1+0+0+0)+7))+3)+1-0-0-0-0-0-0-0-0)%~WriteAll~<1x:reverse:{<1v1>1-1*reverse*}o-1:print:{-1<1)^1>1*print*}%
Primeiro, você deve aceitar um nome e, ao pressionar Return, deve sair Hello name
(onde nome é o que foi inserido).
O crédito para esse programa vai para David Catt .
Estou trabalhando em um programa de teste completo.
Regras
- As brechas padrão são proibidas
- Seu intérprete deve atender a todas as especificações, exceto comentários, que não são necessários.
Pontuação
- Isso é código-golfe , e o menor número de bytes vence!
- -10 bytes se o seu intérprete manipular comentários.
Entre os melhores
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
fonte
Respostas:
Python2,
748736731709704691 bytesEsse foi um pequeno desafio divertido, tenho certeza de que posso tornar esse código ainda mais curto (talvez faça isso mais tarde).
Essa implementação requer que rótulos e funções sejam declarados (implementados) antes de serem chamados. Ele funciona perfeitamente com os dois testes fornecidos, mas infelizmente não funciona com o programa "SayHi.2b", escrito pelo autor do idioma (mesmo depois de alterar a ordem de declaração das funções). Acho que esse problema pode ter a ver com a maneira como entendi o sistema de fita e subtape. Ao se mover pela fita principal, a posição na subtape correspondente é redefinida para 0? No momento, estou mantendo a posição na subtape mesmo quando movo a fita principal.
Aqui está a versão mais legível:
Editar: leve em consideração a manipulação de comentários (-10 bytes), corrigindo um erro por um erro. Esta implementação não suporta chamadas de função aninhadas (eu poderia implementá-la se for um recurso necessário)
Edit2: Alterada a função do manipulador para fazer adição, subtração e movimento da célula. Mais lambdas! : D (a "versão mais legível" pode estar fora de sincronia agora)
Edit3: Acabei de perceber que lidar com comentários me custa 5 bytes (levando em conta o -10). Acabei de removê-lo, é uma pena que agora pareça incompleto.
Edit4: definição movida de n de lambda para var dentro do manipulador h ()
fonte
+a+
, seria melhor participara
? Também eliminaria a necessidade de atribuí-lo a um var.SayHi.2b
arquivo funcionar. O que acontece se for alterado para redefinir a subtape para zero em um turno?