Schreiben Sie einen Dolmetscher für 2B

12

Schreiben Sie einen Dolmetscher für 2B

Ich mag David Catt 's esoterische Sprache 2B, bei der der Speicher auf einem Band gespeichert ist, in dem jede Zelle ein einzelnes Band von Bytes ist (das "Subtape"). Schreibe einen Dolmetscher dafür!

Sprachspezifikation

Die offizielle Spezifikation finden Sie hier . In dieser Beschreibung "bedeutet eine Zahl im Bereich 0-9( 0wird interpretiert als 10) und _bedeutet eine Zeichenfolge beliebiger Länge. In jeder Zelle wird ein Wert im Bereich gespeichert 0-255, und Überlauf / Unterlauf werden wie bei einem BF umbrochen. (Danke @ MartinBüttner). 0-255Verwenden Sie ASCII-Codes, um Text in Zahlen umzuwandeln . Da ich keine Details dazu finden kann, werde ich sagen, dass die Bandlänge 255minimal sein sollte, aber wenn Sie etwas anderes wissen, bearbeiten Sie es bitte.

+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 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.                                                                                                  |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+

Tests

+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)

Sollte ausgeben Hello world!


+1:i:{()*i*}

Eine Art catProgramm, nur ohne Zeilenumbruch.


+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*}%

Sollte zuerst ein Name akzeptiert werden, dann sollte beim Drücken von Returnausgegeben werden Hello name(wobei Name das ist, was eingegeben wurde).

Der Kredit für dieses Programm geht an David Catt .


Ich arbeite an einem vollständigen Testprogramm.

Regeln

  • Standardlücken sind verboten
  • Ihr Dolmetscher muss alle Spezifikationen erfüllen, mit Ausnahme von Kommentaren, die nicht erforderlich sind.

Wertung

  • Das ist , also gewinnen die wenigsten Bytes!
  • -10 Byte, wenn Ihr Interpreter Kommentare verarbeitet.

Bestenliste

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu erstellen.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

# Ruby, <s>104</s> <s>101</s> 96 bytes

JimBobOH
quelle
4
Großartige Idee! Hier ein paar Gedanken: Bitte definieren Sie die Anzahl der Zellen pro Subtape und die Anzahl der Subtapes, die wir in unseren Implementierungen verwenden sollen (oder geben Sie an, ob es sich um eine Art adaptives / unendliches Subtape handeln soll). Wie soll eine Eingabezeichenfolge in Zahlen von 0 bis 255 konvertiert werden? ASCII-Codes vielleicht?
Fehler

Antworten:

4

Python2, 748 736 731 709 704 691 Bytes

Das war eine lustige kleine Herausforderung, ich bin sicher, ich kann diesen Code noch kürzer machen (vielleicht mache ich das später).

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

Diese Implementierung erfordert, dass Labels und Funktionen deklariert (implementiert) werden, bevor sie aufgerufen werden. Es funktioniert perfekt mit den beiden angegebenen Tests, aber es funktioniert leider nicht mit dem "SayHi.2b" -Programm, das vom Autor der Sprache geschrieben wurde (auch nach Änderung der Reihenfolge der Deklaration der Funktionen). Ich denke, dieses Problem hängt möglicherweise damit zusammen, wie ich das Tape- und Subtape-System verstanden habe. Wird beim Bewegen entlang des Hauptbands die Position auf dem entsprechenden Unterband auf 0 zurückgesetzt? Im Moment behalte ich die Position auf dem Teilband, auch wenn ich mich auf dem Hauptband bewege.

Hier ist die besser lesbare Version:

#!/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

Bearbeiten: Berücksichtigen Sie die Behandlung von Kommentaren (-10 Bytes) und beheben Sie einen Fehler, der um eins ausfällt. Diese Implementierung unterstützt keine verschachtelten Funktionsaufrufe (ich könnte es implementieren, wenn es eine erforderliche Funktion ist)

Edit2: Die Handler-Funktion wurde geändert, um Addition, Subtraktion und Zellenbewegung durchzuführen. Mehr Lambdas! : D (Die "besser lesbare Version" ist möglicherweise nicht mehr synchron)

Edit3: Mir ist gerade klar geworden, dass die Bearbeitung von Kommentaren 5 Bytes kostet (unter Berücksichtigung der -10). Also habe ich es gerade entfernt, es ist schade, dass es sich jetzt unvollständig anfühlt.

Edit4: Definition von n von Lambda nach Var im Handler verschoben h ()

Basilikum-Henry
quelle
Bei so vielen ist +a+es vielleicht besser, mitzumachen a? Es würde auch Sie loswerden, wenn Sie es einem var zuweisen müssten.
Maltysen
Nun, es sei denn, ich kann die Zeichenfolgen nicht in einem Wörterbuch als Ganzes zusammenfügen, und es wäre nicht wert, dies für jede Zeichenfolge einzeln zu tun. Das Zuweisen der Zeichenfolge zu a ist nur ein Trick, um einige Bytes zu erhalten, die für den Code eigentlich nicht nützlich sind.
basile-henry
Ich kann mich wohl nicht über die Reihenfolge der Funktionen beschweren, da ich das eigentlich nicht angegeben habe, aber versuche, die SayHi.2bDatei zum Laufen zu bringen . Was passiert, wenn es geändert wird, um das Teilband bei einer Schicht auf Null zurückzusetzen?
JimBobOH