Scrivi un interprete per 2B
Mi piace il linguaggio esoterico 2B di David Catt , con memoria memorizzata in un nastro in cui ogni cella è un nastro separato di byte (il "sottotipo"). Scrivi un interprete per questo!
Specifica della lingua
Le specifiche ufficiali sono disponibili qui . In questa specifica, "
indica un numero nell'intervallo 0-9
( 0
viene interpretato come 10
) e _
indica una stringa di qualsiasi lunghezza. Ogni cella memorizza un valore nell'intervallo 0-255
e overflow / underflow si avvolge come se fosse un BF. (Grazie @ MartinBüttner). Per convertire il testo in numeri 0-255
, utilizzare i codici ASCII . Poiché non riesco a trovare alcun dettaglio su questo, sto per dire che la lunghezza del nastro dovrebbe essere 255
minima, ma se sai diversamente, modifica.
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 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. |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
test
+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)
Dovrebbe produrre Hello world!
+1:i:{()*i*}
Sorta di un cat
programma, solo senza una nuova riga.
+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*}%
Dovrebbe prima accettare un nome, quindi, alla pressione di Return, dovrebbe essere visualizzato Hello name
(dove nome è ciò che è stato immesso).
Il merito di quel programma va a David Catt .
Sto lavorando a un programma di test completo.
Regole
- Sono vietate le scappatoie standard
- L'interprete deve soddisfare tutte le specifiche, ad eccezione dei commenti, che non sono richiesti.
punteggio
- Questo è code-golf , quindi vince meno byte!
- -10 byte se l'interprete gestisce i commenti.
Classifica
Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.
Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:
# Language Name, N bytes
dov'è N
la dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:
# Ruby, <s>104</s> <s>101</s> 96 bytes