Ich mag das Konzept von 0815 , mit Ausnahme des Interpreten auf der Website des Erstellers einen Fehler 404 zurückgibt. Also habe ich beschlossen, Sie alle um Hilfe zu bitten!
Die Grundlagen
0815 basiert auf drei (3) Registern und einer Warteschlange. Die Register heißen X, Y und Z, wobei X schreibgeschützt ist, Z schreibgeschützt ist und Y ein "Hilfsregister" ist, auf das nicht direkt zugegriffen werden kann. Alle Register werden zu Beginn auf 0 gesetzt. Alle Zahlen sind hexadezimal.
Anleitung
Hinweis: Einige Befehle Parameter übernehmen , die wie formatiert sind , }:hello:
wo das :hello:
ist der Parameter. Anderer Hinweis: Einige der Anweisungsbeschreibungen sind unklar, deshalb habe ich mir einige Freiheiten damit genommen. (Originalanleitung hier )
~
bedeutet, dass der Parameter erforderlich ist
----------|---|--------------------------------------------
~Move | < | <:8: will write 8 to X (parameter required)
----------|---|--------------------------------------------
Swap | x | Swap X and Y
----------|---|--------------------------------------------
~Label | } | }:hello: makes a label called 'hello'
----------|---|--------------------------------------------
Input | | | Set X to an integer from input in
Number | | hexadecimal greedily (regex: [0-9A-F]+)
----------|---|--------------------------------------------
Input | ! | Set X to the ASCII code of one ASCII
ASCII | | character in the input
----------|---|--------------------------------------------
Print | % | Prints an integer stored in Z
number | | (hexadecimal base)
----------|---|--------------------------------------------
Print | $ | Prints an ASCII char stored in Z
ASCII | |
----------|---|--------------------------------------------
Roll | | Rolls all registers to the left
Registers | ~ | X <- Y <- Z <- X
Left | | After roll: X = Y, Y = Z and Z = X
----------|---|--------------------------------------------
Roll | | Rolls all registers to the right
Registers | = | X -> Y -> Z -> X
Right | | After roll: Y = X, Z = Y and X = Z
----------|---|--------------------------------------------
~Jump if | ^ | ^:loop: Jumps to the label 'loop' if Z is
not zero | | not zero
----------|---|--------------------------------------------
~Jump if | # | #:loop: Jumps to the label 'loop' if Z is
zero | | zero
----------|---|--------------------------------------------
Warteschlangenanweisungen
----------|---|--------------------------------------------
Clear | ? | Clears the queue
----------|---|--------------------------------------------
Enqueue | > | Enqueue the number stored in Z
----------|---|--------------------------------------------
Dequeue | { | Dequeue a number into X
----------|---|--------------------------------------------
| | Rolls the queue to the left, wrapping as
Roll | | necessary. The first number becomes the
Queue | @ | last; second becomes first and so on. Can
Left | | take a parameter to roll a certain number
| | of times. @:b: rolls 11 times.
----------|---|--------------------------------------------
Roll | |
Queue | & | The opposite of @
Right | |
----------|---|--------------------------------------------
Rechenanweisungen
----------|---|--------------------------------------------
Add | + | Z = X + Y
----------|---|--------------------------------------------
Subtract | - | Z = X - Y
----------|---|--------------------------------------------
Multiply | * | Z = X * Y
----------|---|--------------------------------------------
Divide | / | Z = X / Y
| | Y = remainder
----------|---|--------------------------------------------
Beispielprogramme
Hallo Welt: (leicht golfen)
<:48:~$<:65:~$<:6C:~$$><:6F:~$>@<:2C:~$<:20:~$<:57:~${~$<:72:~${~$<:64:~$
Katze:
}:_t:!~$^:_t:
Wahrheitsmaschine:
|~}:i:%^:i:
Das ist Code-Golf , also gewinnt die Einsendung mit den wenigsten Bytes!
quelle
~
und~
in Ihren "Rollenregistern" -Befehlen? Haben Sie ein Beispielprogramm, mit dem die Leute testen können?Antworten:
Pip ,
321262248 BytesMit eval und einigen Kolmogorov-Komplexitätstricks stark verkürzt.
Probieren Sie es online! (Das Beispiel ist das Programm "Collatz / Hagelkörner" auf der Website des Sprachautors.)
Anmerkungen:
[0-9A-F]+
). Wenn bei einer|
Anweisung das nächste Zeichen der Eingabe nicht ist0-9A-F
, schlägt der Lesevorgang fehl und verursacht möglicherweise ein seltsames Verhalten. Dies bedeutet, dass das gerade oder ungerade Programm des Autors nicht so funktioniert, wie es geschrieben wurde. Ich bin mir nicht sicher, wie er erwartet hat, dass mehrere Lesevorgänge funktionieren, aber ich habe es nur gemäß der Spezifikation implementiert.Meine ungolfed Version mit Kommentaren:
quelle
Haxe, 987 Bytes
oder mit etwas Leerzeichen:
Mit Haxe erfolgreich golfen? Wow.
quelle
Python 3, 1320 Bytes
Die ungolfed-Version sowie die Analyse (und gegebenenfalls Korrekturen) der Testprogramme finden Sie in dieser Übersicht .
Designentscheidungen:
Es gibt Probleme mit den Beispielprogrammen, die (manchmal) nur CR als Zeilenumbruch verwenden, sodass meine Shell die aktuelle Zeile überschreibt, anstatt eine neue zu beginnen. Dies betrifft die Programme Fibonacci Sequence und 99 Bottles of Beer. Der letzte Vers von 99 Flaschen Bier wird auch nicht richtig gedruckt, und ich untersuche immer noch, warum.
quelle
Scala,
3.1232.8442.6262.540 BytesZusätzlich zu den in der Frage dargelegten Einschränkungen wurde dieser Dolmetscher so geschrieben, dass er sich so weit wie möglich an die FP-Prinzipien anlehnt. Speziell:
Dies wurde mit Ausnahme der vier Codezeilen erreicht, die die Hauptschleife des Interpreters steuern. Unveränderliche Strukturen waren hier sehr schwierig zu verwenden, da der Zustand der Register den Steuerungsfluss der Schleife (insbesondere die beiden GOTO-Anweisungen) steuert. Ich überlege immer noch, wie ich es konvertieren soll, um reine und unveränderliche Strukturen zu verwenden, aber das ist für die Code-Golf-Herausforderung irrelevant.
Ich werde die ungolfed Version auf Github posten und einen Link bereitstellen, wenn ich das tue. Vorerst werde ich die Originalversion hier posten:
quelle
Flex / C ++,
848838 BytesZusammengestellt mit:
Es könnte mit anderen kompilieren
lex
, aber ich habe es nicht überprüft. Es funktioniert in zwei Durchgängen, sodass Vorwärtssprünge korrekt gehandhabt werden. Markennamen dürfen mit einer Ziffer beginnen, da dies in den Testfällen mehrmals vorkommt. Hexadezimal-Literale können gemäß den Spezifikationen nur in Großbuchstaben geschrieben werden.Besteht alle Testfälle, einschließlich der im Esolangs-Wiki und auf der 0815-Seite gefundenen. Fehlerbehandlung ist nicht vorhanden und das Beenden auf einem unbekannten Etikett ist nicht sinnvoll, schließlich handelt es sich um Code-Golf.
Ich bereite den ungolfed (und viel netteren) Interpreter auf eine Veröffentlichung vor, damit OP weiter an 0815 basteln kann. Bleib dran :)
quelle
\r
statt\n
als neue Zeile (altmodisches Mac OS?) Verwendet, wenn Sie also etwas auf dem Bildschirm drucken möchten, verwenden Sie./0815 99bb.0815 | tr "\r" "\n"
. Gleiches gilt für Fibonacci.Common Lisp, 1088 Bytes
Ungolfed
Mit optionalem Trace zur Laufzeit.
Fibonnaci
Makroexpansion
Ausgabe
Vielleicht später mehr Erklärungen
quelle
Python 3,
1573, 1499 BytesFührt die Beispielprogramme unter http://paulo-jorente.de/poncho/esolang/0815/ aus und implementiert alle Anweisungen (auch solche, die der ursprünglichen Spezifikation entsprechen).
Führt die in der Befehlszeile übergebene Quelldatei aus.
quelle
j=raw_input
zuj=input
funktioniert), aber es funktioniert nicht für das Programm "99 Bottles of Beer". Ein Beispiel ("//" für Newline): "0x63 // 0x63tles Bier an der Wand // 0x62 eins runter und weitergeben // 0x62tles Bier an der Wand // 0x62tles Bier an der Wand // 0x61 eins runter und weitergeben ")