Interpretiere DOGO!

9

Interpretiere DOGO

DOGO ist eine weniger bekannte Programmiersprache. Während das ursprüngliche DOGO (eine Scherzsprache aus einem Usenet-Beitrag) nie implementiert wurde, wurde eine ähnliche Sprache erstellt. Die Befehle für die Sprache sind:

+===========+================================================================+
|  Command  |                          Description                           |
+===========+================================================================+
| SIT       | If the value of the current memory cell is 0, jump to STAY.    |
+-----------+----------------------------------------------------------------+
| STAY      | If the value of the current memory cell is not 0, jump to SIT. |
+-----------+----------------------------------------------------------------+
| ROLL-OVER | Select the next operation from the operation list.             |
+-----------+----------------------------------------------------------------+
| HEEL      | Execute the currently selected operation.                      |
+-----------+----------------------------------------------------------------+

Die Operationen sind:

+========+=======================================================+====+
| Number |                      Description                      | BF |
+========+=======================================================+====+
|      0 | Increment current memory cell.                        | +  |
+--------+-------------------------------------------------------+----+
|      1 | Decrement current memory cell.                        | -  |
+--------+-------------------------------------------------------+----+
|      2 | Move to next memory cell.                             | >  |
+--------+-------------------------------------------------------+----+
|      3 | Move to previous memory cell.                         | <  |
+--------+-------------------------------------------------------+----+
|      4 | Input a byte and store it in the current memory cell. | ,  |
+--------+-------------------------------------------------------+----+
|      5 | Output the current memory cell as ASCII.              | .  |
+--------+-------------------------------------------------------+----+

Beispiele

Hallo Welt:

roll-over roll-over heel roll-over roll-over roll-over roll-over heel heel heel 
heel heel heel heel heel heel sit roll-over roll-over roll-over heel roll-over 
roll-over roll-over heel heel heel heel heel heel heel heel roll-over roll-over 
heel roll-over roll-over roll-over roll-over roll-over heel roll-over roll-over 
roll-over roll-over roll-over stay roll-over roll-over roll-over heel roll-over 
roll-over heel roll-over roll-over roll-over heel roll-over roll-over roll-over 
roll-over heel heel heel heel heel heel heel sit roll-over roll-over roll-over 
heel roll-over roll-over roll-over heel heel heel heel roll-over roll-over heel 
roll-over roll-over roll-over roll-over roll-over heel roll-over roll-over 
roll-over roll-over roll-over stay roll-over roll-over roll-over heel roll-over  
roll-over roll-over heel roll-over roll-over roll-over roll-over roll-over heel 
roll-over heel heel heel heel heel heel heel roll-over roll-over roll-over 
roll-over roll-over heel heel roll-over heel heel heel roll-over roll-over 
roll-over roll-over roll-over heel roll-over roll-over roll-over heel heel heel 
roll-over roll-over roll-over roll-over heel heel heel heel heel heel heel heel 
sit roll-over roll-over roll-over heel roll-over roll-over roll-over heel heel 
heel heel roll-over roll-over heel roll-over roll-over roll-over roll-over 
roll-over heel roll-over roll-over roll-over roll-over roll-over stay roll-over 
roll-over roll-over heel roll-over roll-over heel roll-over roll-over roll-over 
heel heel heel roll-over roll-over roll-over roll-over heel heel heel heel heel 
heel heel heel heel heel sit roll-over roll-over roll-over heel roll-over 
roll-over roll-over heel heel heel heel heel heel heel heel heel roll-over 
roll-over heel roll-over roll-over roll-over roll-over roll-over heel roll-over 
roll-over roll-over roll-over roll-over stay roll-over roll-over roll-over heel 
roll-over roll-over roll-over roll-over heel heel heel roll-over roll-over 
roll-over roll-over heel roll-over roll-over roll-over roll-over heel heel heel 
heel roll-over roll-over heel roll-over heel heel heel roll-over roll-over 
roll-over roll-over roll-over heel roll-over roll-over heel heel heel heel heel 
heel roll-over roll-over roll-over roll-over heel roll-over roll-over heel heel 
heel heel heel heel heel heel roll-over roll-over roll-over roll-over heel 
roll-over roll-over roll-over heel heel roll-over roll-over roll-over roll-over 
heel roll-over roll-over roll-over roll-over roll-over heel

99 Flaschen Bier

Regeln

  • Jede Einreichung sollte entweder ein vollständiges Programm oder eine vollständige Funktion sein. Wenn es sich um eine Funktion handelt, muss sie ausgeführt werden können, indem nur der Funktionsaufruf am Ende des Programms hinzugefügt werden muss. Alles andere (z. B. Überschriften in C) muss enthalten sein.
  • Wenn es möglich ist, geben Sie bitte einen Link zu einer Online-Site an, auf der Ihr Code getestet werden kann.
  • Ihr Programm kann nichts schreiben STDERR(oder ähnliches).
  • Sie können Eingaben von STDIN(oder der nächstgelegenen Alternative in Ihrer Sprache) oder als Argument verwenden.
  • Standardlücken sind verboten.

Wertung

Programme werden nach Bytes bewertet . Der Standardzeichensatz ist UTF-8. Wenn Sie einen anderen verwenden, geben Sie dies bitte an.

Abgesehen davon ist dies und die niedrigste Byteanzahl wird als Gewinner gewertet!

Einsendungen

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift unter Verwendung der folgenden Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihrer Einreichung? 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

Wenn Sie dort mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder Sie die Strafen für Dolmetscherflaggen separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

# Perl, 43 + 2 (-p flag) = 45 bytes

Sie können den Sprachnamen auch zu einem Link machen, der dann im Leaderboard-Snippet angezeigt wird:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Bestenliste

Hier ist ein Stack-Snippet, mit dem Sie sowohl eine regelmäßige Rangliste als auch eine Übersicht der Gewinner nach Sprache erstellen können.

Aktualisieren:

Entschuldigen Sie, dass Sie die Befehle sitund nicht staysehr gut geklärt haben. Sie sind, wie @ user6245072 sagte, wie [und ]in BF.

Update 2:

Um die Fragen von @ KennyLau zu klären:

  • Die Standardoperation ist 0.
  • Der Speicher besteht aus 8-Bit-Zellen.
  • Zellen wickeln sich auf Überlauf / Unterlauf.
  • Für Operation 4 ist eine Eingabe erforderlich.
George Gibson
quelle
Müssen wir mit fremden Eingaben umgehen? Wie eine Eingabe vonsit lie-down roll-over play-dead heel
Value Ink
1
Die Operation 1sagt auch "nächste Zelle inkrementieren", aber der entsprechende BF-Code lautet "aktuelle Zelle dekrementieren". Welches Verhalten ist korrekt?
Wert Tinte
@ KevinLau-notKenny Danke, meine Schuld.
George Gibson

Antworten:

1

Ruby, 287 Bytes

Läuft auf einem unendlichen Band in beide Richtungen. Die DOGO-Eingabe ist eine Datei in der Befehlszeile. Wenn es kein Befehlszeilenargument gibt, funktioniert ein DOGO-Programm weiterhin, wenn es als STDIN übergeben wird, es sei denn, es verwendet eine Operation 3(ein Byte von STDIN abrufen). In diesem Fall habe ich keine Ahnung. In jedem Fall ist die Dateieingabe am besten.

Angenommen, in der Programmdatei ist kein anderer Text als die vier Befehle und Leerzeichen vorhanden.

Hallo Weltdemonstration

i=k=o=0;m={}
c=$<.read.upcase.split.map{|e|%w{SIT STAY ROLL-OVER HEEL}.index e}.join
(m[k]||=0
e=c[i].to_i
e>2?o>4?$><<m[k].chr:
o>3?m[k]=STDIN.getc.ord:
o>1?k+=o>2?-1:1:
m[k]=o<1?-~m[k]%256:~-m[k]%256:
e>1?o=-~o%6:
e>0?m[k]>0?i=c.rindex(?0,i):0:
m[k]<1?i=c.index(?1,i):0
i+=1)while c[i]
Wert Tinte
quelle
2

Python 3, 388 398 373 371 Bytes

Nimmt 256 Speicherzellen an. Nur eine einfache Implementierung, leicht zu schlagen, kann wahrscheinlich mehr Golf gespielt werden. Probieren Sie es auf repl.it aus .

Vielen Dank an @EasterlyIrk, dass ich festgestellt habe, dass Python 3 viel kürzer als Python 2 ist.

BEARBEITEN: Es wurde festgestellt, dass ich beim Drucken nur Über- / Unterlauf berücksichtigt habe, nicht den tatsächlichen Wert.

Vielen Dank an @ KevinLau-notKenney für das Speichern von 25 (!) Bytes mit Tricks der Listenmultiplikation und des Inversionsoperators

BEARBEITEN: -3 Bytes durch Einfügen von 256 in eine Variable, -4 Durcheinander mit Operatoren, +8 durch Sicherstellen, dass es sich um Kleinbuchstaben handelt

def p(s):
 b=256
 l,m=[w[-1]for w in s.lower().split()],[0]*b
 i=p=x=0
 while x<len(l):
  c=l[x]
  if'm'>c:
   if 1>i:m[p]=-~m[p]%b
   if 1==i:m[p]=~-m[p]%b
   if 2==i:p=-~p%b
   if 3==i:p=~-p%b
   if 4==i:m[p]=ord(input()[0])
   if 4<i:print(chr(m[p]),end="")
  if'r'==c:i=-~i%6
  if't'==c and m[p]<1:x+=l[:x].index('y')
  if'x'<c and m[p]>0:x-=l[x::-1].index('t')
  x+=1
Blau
quelle
Warum verwenden sys.stdout.write? Warum nicht print?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ print fügt Zeilenumbrüche hinzu. Die eigentliche Druckfunktion mit dem Endarg ist in Python 3
Blue
Was macht Python3 nicht in Frage? Gerade getestet, funktioniert gut mitprint(...,end='')
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ Ich war zu faul, um es zu installieren. Ich könnte genauso gut die Antwort ändern, bis
Blue
Dann versuchen Sie es vielleicht mit ideone oder einem Online-Python-Interpreter. Oder installieren Sie es. : P
Rɪᴋᴇʀ