7 , 2 Bytes
In 7 wird ein 3-Bit-Zeichensatz verwendet, die Eingabe wird jedoch in Bytes gepackt (und gemäß Meta werden Sprachen mit Sub-Byte-Zeichensätzen mit Bytes für die Datei auf der Festplatte gezählt ). Hier ist ein xxd
Dump des Programms:
00000000: 4cf4 L.
Wenn Sie diese Datei an den Interpreter 7 übergeben, wird das folgende Programm ausgegeben:
00000000: 4fa6 7f O..
Dieser gibt dann wiederum das ursprüngliche Programm wieder aus.
Also, was ist hier los? Es ist kein Quellenlesen involviert (eigentlich glaube ich nicht, dass es möglich ist, die Quelle in 7 zu lesen), obwohl das Programm wohl auf andere Weise schummelt; Lass mich wissen was du denkst. So funktioniert das Programm. (Beachten Sie, dass jeder 7-Befehl zwei Varianten hat, von denen einige keine Namen haben und nicht im Originalprogramm erscheinen können. Es gibt insgesamt zwölf Befehle in sechs Paaren. Ich verwende Fett für aktive Befehle, Fett nicht für passive Befehle, und in Fällen , in denen der aktive Befehl hat keinen Namen, ich habe es den gleichen Namen wie die entsprechende passive Befehl und unter Berufung auf die fett gebe. im Fall zu unterscheiden , wo beide benannt sind, zum Beispiel , 7
die die aktive Variante ist 1
, Jeder Befehl erhält einen eigenen Namen und die Fettschrift ist nur eine Hervorhebung der Syntax.)
231 7 23 Originalprogramm, entpackt in Oktal
231 237 drücken auf den Stapel
23 Push - 23 auf den Stapel
Fügen Sie (implizit) eine Kopie des obersten Stapels an das Programm an
2 Stapeloberseite duplizieren (derzeit 23 )
3 Stapeloberseite ausgeben, zweites Stapelelement einfügen
Zu diesem Zeitpunkt sieht der Interpreter 7, dass der obere Teil des Stacks Befehle enthält (2
und 3
) enthält, die nicht darstellbar sind. Daher wird der obere Bereich des Stapels verlassen und produziert723
(was ist). Die erste Befehlsausgabe wählt das Ausgabeformat aus; In diesem Fall ist es Format 7, "Formatieren Sie die Ausgabe auf die gleiche Weise wie das Programm". Die Befehle werden also in Bytes gepackt ausgegeben. Dann geht das Programm weiter:
231 7 23 23
Fügen Sie (implizit) eine Kopie des obersten Stapels an das Programm an
2 Doppelte Stapeloberseite (derzeit 237 )
3 Stapeloberseite ausgeben, zweites Stapelelement einfügen
7 Ein leeres Element auf den Stapel schieben
Zu diesem Zeitpunkt befinden sich nur leere Stapelelemente auf dem Stapel, sodass das Programm beendet wird. Wir geben 23
früher aus. Wenn wir entkommen 237
(und wir müssen, weil es nicht darstellbare Befehle enthält), bekommen wir 7231
. Das wird direkt ausgegeben, was die endgültige Ausgabe des Programms ergibt237231
(formatiert wie das Programm, dh in Bytes gepackt). Das ist 4fa67f
. (Es ist anzumerken, dass das 1
völlig sinnlos in Bezug auf die Auswirkung auf die Ausgabe war; der einzige Grund dafür ist, dass die beiden Programme unterschiedlich sind.)
Das Laufen 237231
verläuft fast genauso; Der Unterschied besteht darin, dass das unbrauchbare 1
Element direkt nach dem ersten Ausdruck ausgeführt wird (und das leere Element implizit gelöscht wird, wenn das aktuelle Programmende zum zweiten Mal erreicht wird). Wiederum gibt das 231
Ende sich selbst aus, das 23
Ende gibt sich selbst aus, gefolgt von einem 7
und wir erhalten 231723
das ursprüngliche Programm.
Der Beobachter könnte bemerken, dass die beiden Programme, obwohl sie im "nativen" Oktal der Sprache gleich lang sind, unterschiedliche Längen auf der Festplatte haben. Das liegt daran, dass ein 7-Programm mit einer beliebigen Anzahl von 1 Bit aufgefüllt werden kann und das gepackte Format das nachfolgende Auffüllen verwirft. So erfolgt die Codierung:
2 3 1 7 2 3
010011001111010011(1...)
4 c f 4 padding
Mit anderen Worten, zwei Bytes 4C
F4
reichen aus, um das Programm darzustellen. Das ist alles, was ich verwendet habe.