Scrivi un interprete per 2B


12

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( 0viene interpretato come 10) e _indica una stringa di qualsiasi lunghezza. Ogni cella memorizza un valore nell'intervallo 0-255e 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 255minima, 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 catprogramma, 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 è , 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'è Nla 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


4
Grande idea! Ecco alcune considerazioni: si prega di definire il numero di celle per sottotipo e il numero di sottotipi che dovremmo usare nelle nostre implementazioni (o specificare se dovrebbe essere una sorta di adattivo / infinito). Come dovrebbe essere convertita una stringa di input in numeri 0-255? Codici ASCII forse?
flawr

Risposte:


4

Python2, 748 736 731 709 704 691 byte

Questa è stata una piccola sfida divertente, sono sicuro di poter rendere questo codice ancora più breve (forse lo farò ad un certo punto in seguito).

from sys import*
w=stdout.write
p=open(argv[1],'r').read()
c,r,s,x,y,t,o=0,0,256,0,0,0,0
g=[[0]*s]*s
e=lambda d:p.find(d,c+1)
def h(i,j=0,k=0):global c,x,y;c+=1;n=1+(int(p[c])-1)%10;l=g[x][y]+n*i;g[x][y]=l%s;o=l/s;x=(x+n*j)%s;y=(y+n*k)%s
a="g[x][y]"
b="[p[c+1:i]]"
l={}
f={}
d={'0':a+"=0",'{':"if "+a+"<1:c=e('}')",'(':"i=stdin.read(1);"+a+"=ord(i)if i else 0",')':"w(chr("+a+"))",'x':"t="+a,'o':"w(chr(t))",'!':a+"+=o",'?':a+"=0if "+a+"else 1",'+':"h(1)",'-':"h(-1)",'^':"h(0,1)",'V':"h(0,-1)",'<':"h(0,0,-1)",'>':"h(0,0,1)",':':"i=e(':');l"+b+"=i;c=i",'*':"i=e('*');c=l"+b,'~':"i=e('~');f"+b+"=i;c=e('%')",'@':"i=e('@');r=i;c=f"+b,'%':"c=r"}
while c<len(p):
    if p[c]in d:exec d[p[c]]
    c+=1

Questa implementazione richiede che le etichette e le funzioni siano dichiarate (implementate) prima di essere chiamate. Funziona perfettamente con i due test forniti ma sfortunatamente non funziona con il programma "SayHi.2b" scritto dall'autore della lingua (anche dopo aver cambiato l'ordine di dichiarazione delle funzioni). Penso che questo problema potrebbe avere a che fare con il modo in cui ho capito il sistema a nastro e sottotipo. Quando si sposta lungo il nastro principale, la posizione sulla sottotipo corrispondente viene reimpostata su 0? Al momento sto mantenendo la posizione sul sottotipo anche quando mi muovo sul nastro principale.

Ecco la versione più leggibile:

#!/usr/bin/python

import sys
w=sys.stdout.write
p=open(sys.argv[1],'r').read()
c,r,s,x,y,t,o=0,0,256,0,0,0,0
# c is the current index in the program string
# r is the return index (for functions)
# s is the size of the tape, subtapes and modulo for ints (max int will be 255)
# x and y are the coordinates in the grid
# t is the temporary register
# o is overflow
g=[[0]*s]*s # initialise a grid 256x256 with 0

e=lambda d:p.find(d,c+1)
def n():global c;c+=1;i=int(p[c]);return i if i>0 else 10 # get the number specified
def h(i):j=g[x][y]+i;g[x][y]=j%s;o=j/s # handle addition and substraction
def m(i,j):global x,y;x=(x+i)%s;y=(y+j)%s # move current cell

a="g[x][y]" # string of current cell
b="[p[c+1:i]]" # key for label or function
l={} # dictionary of labels
f={} # dictionary of functions
d={'0':a+"=0",
   '{':"if "+a+"<1:c=e('}')",
   '(':"i=sys.stdin.read(1);"+a+"=ord(i)if i else 0",
   ')':"w(chr("+a+"))",
   'x':"t="+a,
   'o':"w(chr(t))",
   '!':a+"+=o",
   '?':a+"=0if "+a+"else 1",
   '+':"h(n())",
   '-':"h(-n())",
   '^':"m(n(),0)",
   'V':"m(-n(),0)",
   '<':"m(0,-n())",
   '>':"m(0,n())",
   ':':"i=e(':');l"+b+"=i;c=i",
   '*':"i=e('*');c=l"+b,
   '~':"i=e('~');f"+b+"=i;c=e('%')",
   '@':"i=e('@');r=i;c=f"+b,
   '%':"c=r",
   '#':"c=e('#')"
   }

while c<len(p): # loop while c is not EOF
    # print c, p[c]
    if p[c]in d:exec d[p[c]] # execute code kept as a string
    c+=1 # increment index

Modifica: prendere in considerazione la gestione dei commenti (-10 byte), risolvendo un off da un errore. Questa implementazione non supporta le chiamate di funzione nidificate (potrei implementarla se è una funzionalità richiesta)

Modifica2: modificata la funzione del gestore per eseguire addizioni, sottrazioni e movimenti di celle. Più lambda! : D (la "versione più leggibile" potrebbe non essere sincronizzata ora)

Edit3: Mi sono appena reso conto che la gestione dei commenti mi costa 5 byte (tenendo conto del -10). Quindi l'ho appena rimosso, è un peccato che ora sembri incompleto.

Edit4: spostata la definizione di n da lambda a var all'interno del gestore h ()


con così tanti +a+potrebbe essere meglio aderire a? Si libererebbe anche di dover assegnarlo a un var.
Maltysen,

Beh, tranne che non posso unire le stringhe in un dizionario nel suo insieme e non varrebbe la pena farlo per ogni stringa separatamente. Assegnare la stringa a è solo un trucco per ottenere alcuni byte, nulla di veramente utile per il codice.
basile-henry,

Immagino di non potermi lamentare dell'ordine delle funzioni, dato che non l'ho specificato, ma cerco di far funzionare il SayHi.2bfile. Cosa succede se viene modificato per azzerare il sottotipo su uno spostamento?
JimBobOH,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.