var QUESTION_ID=69;
var OVERRIDE_USER=98;
var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;function answersUrl(index){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}
function commentUrl(index,answers){return"https://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}
function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=!1;comment_page=1;getComments()}})}
function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}
getAnswers();var SCORE_REG=(function(){var headerTag=String.raw `h\d`
var score=String.raw `\-?\d+\.?\d*`
var normalText=String.raw `[^\n<>]*`
var strikethrough=String.raw `<s>${normalText}</s>|<strike>${normalText}</strike>|<del>${normalText}</del>`
var noDigitText=String.raw `[^\n\d<>]*`
var htmlTag=String.raw `<[^\n<>]+>`
return new RegExp(String.raw `<${headerTag}>`+String.raw `\s*([^\n,]*[^\s,]),.*?`+String.raw `(${score})`+String.raw `(?=`+String.raw `${noDigitText}`+String.raw `(?:(?:${strikethrough}|${htmlTag})${noDigitText})*`+String.raw `</${headerTag}>`+String.raw `)`)})();var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}
function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))
body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)
valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,})});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)
lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<i>'+a.language+'</i>').text().toLowerCase();languages[lang]=languages[lang]||{lang:a.language,user:a.user,size:a.size,link:a.link,uniq:lang}});var langs=[];for(var lang in languages)
if(languages.hasOwnProperty(lang))
langs.push(languages[lang]);langs.sort(function(a,b){if(a.uniq>b.uniq)return 1;if(a.uniq<b.uniq)return-1;return 0});for(var i=0;i<langs.length;++i)
{var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;float:left}#language-list{padding:10px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/primary.css?v=f52df912b654"> <div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td><a href="{{LINK}}">{{SIZE}}</a></td></tr></tbody> </table>
Antworten:
Hexagony , Seitenlänge
1716,816705 BytesProbieren Sie es online!
So sieht es ungefaltet aus:
Ach ja, das war ganz die emotionale Achterbahnfahrt ... Ich hielt die wievielten Mal ich zwischen switched „Haha, das ist Wahnsinn“ und „warten, wenn ich es tue dies sollte es eigentlich ziemlich machbar sein“. Die Einschränkungen, die Hexagony durch seine Layoutregeln für den Code auferlegt hat, waren ... schwerwiegend.
Es könnte möglich sein, die Seitenlänge um 1 oder 2 zu reduzieren, ohne den allgemeinen Ansatz zu ändern, aber es wird schwierig (nur die Zellen mit
#
sind derzeit unbenutzt und für den Decoder verfügbar). Im Moment habe ich auch absolut keine Ideen mehr, wie man effizienter vorgehen könnte, aber ich bin mir sicher, dass es eine gibt. In den nächsten Tagen werde ich darüber nachdenken und vielleicht versuchen, nebenbei Golf zu spielen, bevor ich eine Erklärung und alles hinzufüge.Zumindest habe ich bewiesen, dass es möglich ist ...
Einige CJam-Skripte für meine eigene zukünftige Referenz:
quelle
!
und dann mit einem gedruckt wird Spiegeln/
Sie die zweitletzte Zeile und geben Sie den Decoder-Code ein, um das Quine zu vervollständigen. Dies nutzt auf wundersame Weise<
und>
liest die mehrzeilige, sehr große Ganzzahl und baut den Speicherbereich für den Decoder auf. Ich würde wirklich gerne wissen, welche "Dutzende von Ansätzen" in Betracht gezogen werden?MySQL, 167 Zeichen
Stimmt. :-)
Ich habe das wirklich selbst geschrieben. Es wurde ursprünglich auf meiner Website veröffentlicht .
quelle
GolfScript, 2 Bytes
(Beachten Sie den Zeilenvorschub) Dies drückt die Nummer 1 auf den Stapel. Am Ende des Programms druckt GolfScript alle Elemente im Stapel aus (ohne Leerzeichen dazwischen) und druckt dann eine neue Zeile.
Dies ist eine echte Quine (wie in der Frage aufgeführt), da sie den Code tatsächlich ausführt. Es wird nicht nur "die Quelldatei gelesen und gedruckt" (im Gegensatz zur PHP-Übermittlung).
Ein weiteres Beispiel ist das folgende GolfScript-Programm zum Drucken
12345678
:9
: 9 zum Stapel schieben,
: verbrauchen Sie die 9 als Argument, schieben Sie das Array[0 1 2 3 4 5 6 7 8]
auf den Stapel(
: Verbrauchen Sie das Array als Argument, verschieben Sie das Array[1 2 3 4 5 6 7 8]
und das Element0
in den Stapel;
: Lege den obersten Gegenstand des Stapels abDer Stack enthält nun das Array
[1 2 3 4 5 6 7 8]
. Dies wird in die Standardausgabe geschrieben, ohne Leerzeichen zwischen den Elementen, gefolgt von einer neuen Zeile.quelle
1
ist es in GolfScript kein Quine: Es wird ausgegeben1\n
, wobei\n
eine Newline bezeichnet wird. Das Zwei-Zeichen-Programm1\n
ist jedoch ein Quine.\n
wahrscheinlich auch?Brain-Flak ,
9.8e5801.3e5629.3e51612818110244452433242404200418038523656361635402485 + 3 = 2488 BytesPasst jetzt in das beobachtbare Universum!
Probieren Sie es online!
Erläuterung
Diese Quine funktioniert wie die meisten Quines in esoterischen Sprachen. Es besteht aus zwei Teilen, einem Encoder und einem Decoder. Der Encoder steht am Anfang in Klammern und der Decoder ist am Ende der komplexere Teil.
Eine naive Art, das Programm zu codieren, besteht darin, den ASCII-Wert jedes Zeichens im Decoder auf den Stapel zu legen. Dies ist keine sehr gute Idee, da Brain-Flak nur 8 Zeichen (
()<>[]{}
) verwendet, sodass Sie am Ende ziemlich viele Bytes bezahlen, um sehr wenig Informationen zu codieren. Eine klügere Idee, und die bisher verwendete ist es, jede der 8 geschweiften Klammern einer viel kleineren Zahl (1-8) zuzuweisen und diese mit unserem Decoder in die ASCII-Werte umzuwandeln. Das ist nett, weil es nicht mehr als 18 Bytes kostet, ein Zeichen zu codieren, im Gegensatz zum vorherigen 252.Dieses Programm funktioniert jedoch nicht. Es beruht auf der Tatsache, dass alle Brain-Flak-Programme so aufeinander abgestimmt sind, dass sie die 8 Klammern mit den Zahlen bis 5 codieren. Es codiert sie wie folgt.
Allen geschweiften Klammern wird 1 zugewiesen, da wir mithilfe des Kontexts bestimmen können, welche von ihnen in einem bestimmten Szenario verwendet werden müssen. Das klingt nach einer entmutigenden Aufgabe für ein Brain-Flak-Programm, ist es aber nicht. Nehmen Sie zum Beispiel die folgenden Kodierungen, bei denen die offenen Klammern dekodiert und die schließenden Klammern durch ein ersetzt werden
.
:Hoffentlich können Sie sehen , dass der Algorithmus ziemlich einfach ist, lesen wir links nach rechts, jedes Mal , wenn wir stoßen auf eine offene Klammer wir die enge Klammer zu einer gedachten Stapel schieben und wenn wir begegnen ein
.
Pop wir den Top-Wert und legen Sie sie anstelle der.
. Diese neue Kodierung spart uns eine enorme Anzahl von Bytes im Kodierer, während wir nur eine Handvoll Bytes im Dekodierer verlieren.Low Level Erklärung
In Arbeit
quelle
Prelude ,
51574514234817611537664569535423241214184178175169148142136133 BytesDanke an Sp3000 für das Speichern von 3 Bytes.
Das ist ziemlich lang ...(okay, es ist immer noch lang ... zumindest schlägt es bei dieser Herausforderung die kürzestebekannteC # -Qualität vonBrainfuck), aber es ist die erste Quine, die ich selbst entdeckt habe (meine Einsendungen von Lua und Julia sind wirklich nur Übersetzungen von Standard Quine Techniken in anderen Sprachen) und soweit ich weiß, hat noch niemand eine Quine in Prelude geschrieben, also bin ich ziemlich stolz darauf. :)Diese große Anzahl von Ziffern ist nur eine Kodierung des Kerncodes, weshalb der Quine so lang ist.
Die Ziffern, die das Quine codieren, wurden mit diesem CJam-Skript generiert .
Dies erfordert einen standardkonformen Interpreter, der Zeichen druckt (wobei die Werte als Zeichencodes verwendet werden). Wenn Sie also den Python-Interpreter verwenden, müssen Sie festlegen
NUMERIC_OUTPUT = False
.Erläuterung
Zunächst ein paar Worte zum Prelude: Jede Zeile im Prelude ist eine eigene "Stimme", die ihren eigenen Stack manipuliert. Diese Stapel werden auf eine unendliche Anzahl von Nullen initialisiert. Das Programm wird Spalte für Spalte ausgeführt, wobei alle Befehle in der Spalte auf der Grundlage der vorherigen Stapelzustände "gleichzeitig" ausgeführt werden. Die Ziffern werden einzeln auf den Stapel geschoben, so
42
dass zuerst a4
und dann a gedrückt werden2
. Es gibt keine Möglichkeit, größere Zahlen direkt zu übertragen. Sie müssen sie addieren. Mitv
und können Werte aus benachbarten Stapeln kopiert werden^
. Brainfuck-artige Loops können mit runden Klammern eingefügt werden. Weitere Informationen finden Sie unter dem Link in der Überschrift.Hier ist die Grundidee des Quines: Zuerst schieben wir eine Menge Ziffern auf den Stapel, die den Kern des Quines kodieren. Der Kern nimmt dann diese Ziffern, decodiert sie, um sie selbst zu drucken, und druckt dann die Ziffern, wie sie im Code (und dem nachfolgenden Code
)
) erscheinen.Dies ist etwas kompliziert durch die Tatsache, dass ich den Kern über mehrere Zeilen aufteilen musste. Ursprünglich hatte ich die Kodierung am Anfang, musste dann aber die anderen Zeilen mit der gleichen Anzahl von Leerzeichen auffüllen. Aus diesem Grund waren die anfänglichen Punktzahlen alle so groß. Jetzt habe ich die Codierung am Ende eingefügt, aber das bedeutet, dass ich zuerst den Kern überspringen, dann die Ziffern eingeben und zum Anfang zurückspringen und den Druck ausführen muss.
Die Kodierung
Da der Code nur zwei Stimmen hat, und und Nachbarschaft ist zyklisch
^
undv
sind synonym. Das ist gut so, weilv
es mit Abstand den größten Zeichencode hat. Wenn Sie ihn also immer verwenden, wird^
die Codierung einfacher. Jetzt liegen alle Zeichencodes im Bereich von 10 bis einschließlich 94. Das heißt, ich kann jedes Zeichen mit genau zwei Dezimalstellen codieren. Es gibt jedoch ein Problem: Einige Zeichen, insbesondere der Zeilenvorschub, haben eine Null in ihrer Dezimaldarstellung. Dies ist ein Problem, da Nullen nicht leicht vom unteren Ende des Stapels zu unterscheiden sind. Zum Glück gibt es eine einfache Lösung: Wir versetzen die Zeichencodes um2
, sodass wir einen Bereich von 12 bis einschließlich 96 haben, der immer noch bequem in zwei Dezimalstellen passt. Nun von allen Zeichen, die im Prelude-Programm erscheinen können,0
hat eine 0 in seiner Darstellung (50), aber wir brauchen0
überhaupt nicht. Das ist also die Kodierung, die ich verwende, indem ich jede Ziffer einzeln drücke.Da wir jedoch mit einem Stapel arbeiten, werden die Darstellungen umgekehrt verschoben. Wenn Sie sich also das Ende der Kodierung ansehen:
In Paare aufteilen und umkehren, dann zwei subtrahieren und dann die Zeichencodes nachschlagen:
Wo
32
ist entspricht Leerzeichen. Der Core führt genau diese Transformation durch und druckt dann die Zeichen.Der Kern
Schauen wir uns also an, wie diese Zahlen tatsächlich verarbeitet werden. Zunächst ist zu beachten, dass übereinstimmende Klammern in Prelude nicht in derselben Zeile stehen müssen. Es kann nur eine Klammer pro Spalte geben, daher gibt es keine Mehrdeutigkeit, in der Klammern zusammengehören. Insbesondere ist die vertikale Position der schließenden Klammer immer irrelevant - der Stapel, der überprüft wird, ob die Schleife endet (oder vollständig übersprungen wird), ist immer derjenige, der die hat
(
.Wir wollen den Code genau zweimal ausführen - beim ersten Mal überspringen wir den Kern und drücken alle Zahlen am Ende, beim zweiten Mal führen wir den Kern aus. Tatsächlich werden wir, nachdem wir den Core ausgeführt haben, alle diese Zahlen erneut übertragen, aber da die Schleife danach endet, ist dies irrelevant. Dies ergibt das folgende Skelett:
Zuerst drücken wir eine
7
auf die erste Stimme - wenn wir das nicht tun, treten wir niemals in die Schleife ein (für das Skelett ist es nur wichtig, dass dies nicht Null ist ... warum es spezifisch ist, werden7
wir später sehen) . Dann betreten wir die Hauptschleife. Jetzt enthält die zweite Stimme einen weiteren Loop. Beim ersten Durchlauf wird diese Schleife übersprungen, da der zweite Stapel leer ist / nur Nullen enthält. Also springen wir direkt zur Kodierung und schieben alle diese Ziffern auf den Stapel. Das, was7
wir auf den ersten Stapel geschoben haben, ist noch da, also wiederholt sich die Schleife.Dieses Mal gibt es auch einen
7
auf dem zweiten Stapel, also geben wir eine Schleife auf der zweiten Stimme ein. Die Schleife der zweiten Stimme ist so ausgelegt, dass der Stapel am Ende wieder leer ist und nur einmal ausgeführt wird. Es wird auch den ersten Stapel erschöpfen ... Wenn wir also die Schleife mit der zweiten Stimme verlassen, drücken wir erneut alle Ziffern, aber jetzt wurde7
der erste Stapel verworfen, sodass die Hauptschleife endet und das Programm endet.Als nächstes schauen wir uns die erste Schleife im eigentlichen Kern an. Es ist sehr interessant, Dinge gleichzeitig mit einem
(
oder zu tun)
. Ich habe den Schleifenkörper hier markiert mit=
:Dies bedeutet, dass die Spalte, die enthält,
(
nicht als Teil der Schleife betrachtet wird (die Zeichen dort werden nur einmal ausgeführt, und selbst wenn die Schleife übersprungen wird). Die Spalte, die das enthält,)
ist Teil der Schleife und wird bei jeder Iteration einmal ausgeführt.Also fangen wir mit einer Single an
-
, die7
den ersten Stack in einen-7
... verwandelt , dazu später mehr. Wie für die eigentliche Schleife ...Die Schleife wird fortgesetzt, solange der Ziffernstapel nicht geleert wurde. Es verarbeitet zwei Ziffern gleichzeitig. Der Zweck dieser Schleife besteht darin, die Codierung zu decodieren, das Zeichen auszudrucken und gleichzeitig den Ziffernstapel auf die erste Stimme zu verschieben. Also dieser Teil zuerst:
In der ersten Spalte wird die Ziffer zur ersten Stimme verschoben. In der zweiten Spalte wird die 10-stellige Zahl in die erste Stimme kopiert, während gleichzeitig die 1-stellige Zahl in die zweite Stimme zurückkopiert wird. Die dritte Spalte verschiebt diese Kopie zurück zur ersten Stimme. Das heißt, die erste Stimme hat jetzt die 1-Stelle zweimal und die 10-Stelle dazwischen. Die zweite Stimme hat nur eine weitere Kopie der 10-stelligen. Das heißt, wir können mit den Werten oben auf den Stapeln arbeiten und sicherstellen, dass auf dem ersten Stapel noch zwei Kopien für später vorhanden sind.
Nun stellen wir den Zeichencode aus den beiden Ziffern wieder her:
Der untere Teil ist eine kleine Schleife, die nur die 10-stellige Zahl auf Null dekrementiert. Für jede Iteration wollen wir 10 an die Spitze setzen. Denken Sie daran, dass der erste
2
nicht Teil der Schleife ist. Der Loop-Body+8+2
addiert also 10 (mit dem2
zuvor gedrückten) und der andere 2. Wenn wir also mit der Schleife fertig sind, hat der erste Stack tatsächlich die Basis. 10 Wert und eine weitere 2. Wir subtrahieren diese 2 mit-
, um den Versatz in der Kodierung zu berücksichtigen, und drucken das Zeichen mit!
. Der#
wirft einfach die Null am Ende der unteren Schleife ab.Sobald diese Schleife abgeschlossen ist, ist der zweite Stapel leer und der erste Stapel enthält alle Ziffern in umgekehrter Reihenfolge (und a
-7
unten). Der Rest ist ziemlich einfach:Dies ist die zweite Schleife des Kerns, die nun alle Ziffern ausgibt. Dazu müssen wir zu jeder Ziffer 48 eingeben, um den richtigen Zeichencode zu erhalten. Wir machen das mit einer einfachen Schleife, die jedes Mal läuft
8
und addiert6
. Das Ergebnis wird mit!
und8
am Ende für die nächste Iteration gedruckt .Was ist mit dem
-7
? Ja,48 - 7 = 41
das ist der Zeichencode von)
. Magie!Wenn wir mit dieser Schleife fertig sind, verwerfen
8
wir die gerade gedrückte#
, um sicherzustellen, dass die äußere Schleife für die zweite Stimme belassen wird. Wir geben alle Ziffern erneut ein und das Programm wird beendet.quelle
Hexagony , Seitenlänge 11, 314 Bytes
Probieren Sie es online!
Ältere Version:
Hexagony , Seitenlänge 11, 330 Bytes
Probieren Sie es online!
Encoder: Online ausprobieren!
Das Programm entspricht in etwa diesem Python-Code: Probieren Sie es online aus!
Ungefalteter Code:
Zwei
.
s dauert 1 Bit. Alle anderen Zeichen enthalten 1 Bit und eine Basis-97-Ziffer.Erläuterung
Klicken Sie auf die Bilder für eine größere Darstellung. Jeder Erklärungsteil enthält zum besseren Verständnis den entsprechenden Python-Code.
Datenteil
Anstelle der komplexen Struktur in einigen anderen Antworten verwendet (mit
<
,"
und einige andere Dinge), lasse ich nur die IP durch die untere Hälfte passieren.Erstens durchläuft die IP viele Nummern und No-Ops (
.
) und Mirrors (\
). Jede Ziffer wird an die Nummer im Speicher angehängt, sodass der Speicherwert am Ende der Nummer am Anfang des Programms entspricht.!
druckt es,und
$
springt durch die nächsten>
.Ausgehend von der
<
. Wenn der Speicherwertmem
falsch ist (<= 0
dh die Bedingungmem > 0
ist nicht erfüllt), haben wir das Programm ausgedruckt und sollten das Programm beenden . Die IP würde dem oberen Pfad folgen.(Lassen Sie die IP-Adresse für ungefähr 33 Befehle rund
um die Weltlaufen, bevor Sie die@
(die das Programm beendet) drücken, da das Platzieren an einer anderen Stelle einige zusätzliche Bytes erfordert.)Wenn dies zutrifft, folgen wir dem unteren Pfad, werden einige Male umgeleitet und führen einige weitere Befehle aus, bevor wir eine andere Bedingung treffen.
Nun sieht die Erinnerung so aus:
Wenn der Wert wahr ist:
Der folgende Code wird ausgeführt:
Eine ausführliche Erläuterung der Antwort finden Sie
Q4
bei MartinEnder unter HelloWorld Hexagony . Kurz gesagt, dieser Code wird.
zweimal gedruckt .Ursprünglich hatte ich geplant, dies
.
einmal zu drucken . Als ich darauf kam (.
zweimal drucken ) und es implementierte, wurden ungefähr 10 Stellen gespeichert.Dann,
Hier ist eine wichtige Tatsache, die mir etwa 14 Stellen erspart hat: Sie müssen nicht an der Stelle sein, an der Sie angefangen haben.
Um zu verstehen, was ich sage, lassen Sie uns eine BF-Analogie haben. (überspringen Sie dies, wenn Sie bereits verstanden haben)
Angesichts des Codes
Angenommen, wir seien
a
der Wert der aktuellen Zelle undb
der Wert der rechten Zelle, dann lautet eine einfache Übersetzung davon in BF:Beachten Sie jedoch, dass wir während des Programms nicht immer an derselben Position sein müssen. Wir können den Wert von
a
so lassen, wie wir zu Beginn jeder Iteration sind, dann haben wir diesen Code:Das ist einige Bytes kürzer.
Außerdem erspart mir das Verhalten beim Einwickeln von Ecken einen
\
Spiegel - ohne diesen könnte ich die Ziffern nicht anpassen (+2 Ziffern für sich\
selbst und +2 Ziffern für ein ungepaartes Zeichen.
rechts davon, ganz zu schweigen von dem Flaggen)(Einzelheiten:
\
das es widerspiegelt, jetzt geht es nach oben)
Wenn der Wert (der obigen Mod 2-Operation) falsch (Null) ist, folgen wir diesem Pfad:
Ich werde hier nicht zu detailliert erklären, aber der Versatz ist eigentlich nicht genau
33
, aber kongruent zu33
mod256
. Undchr
hat eine implizite% 256
.quelle
Vim, 11 Bytes
iq"qP<Esc>
: Fügen Sie manuell ein Duplikat des Texts ein, das sich außerhalb der Aufnahme befinden muss.q"
undhqP
: Nehmen Sie das Innere direkt in das unbenannte""
Register auf, damit es in der Mitte eingefügt werden kann. Dash
ist die einzige Repositionierung erforderlich; Wenn Sie es in das Makro einfügen, wird es in das Ergebnis eingefügt.Bearbeiten
Ein Hinweis zum Aufnehmen mit
q"
: Das unbenannte Register""
ist eine lustige Sache. Es ist kein richtiges Register wie die anderen, da dort kein Text gespeichert ist."-
Tatsächlich ist es ein Zeiger auf ein anderes Register (normalerweise für Löschvorgänge ohne Zeilenumbruch,"0
für Yanks oder"1
für Löschvorgänge mit Zeilenumbruch).q"
bricht die Regeln; es schreibt tatsächlich an"0
. Wenn Sie""
bereits auf ein anderes Register als verwiesen haben"0
,q"
wird es überschrieben , bleibt"0
jedoch""
unverändert. Wenn Sie ein neues Vim starten, zeigt es""
automatisch auf"0
, sodass es Ihnen in diesem Fall gut geht.Grundsätzlich ist Vim komisch und fehlerhaft.
quelle
y
oder etwas vor dem Laufen helfen kann␛
Drücken der <Esc> -Taste? Teil dieses Unicode-Blocks „Control Pictures“<Esc>
Notation ist in Vim-Mappings (:help <>
) Standard und wird von vimgolf.com verwendet. Jeder erfahrene Vimgolfer wird es gewohnt sein, es zu lesen. Was den Unicode betrifft, muss ich schielen, um die kleinen Buchstaben zu lesen, und sie verdecken die Methode, sie einzugeben und die Hilfedatei zu durchsuchen.Cubix , 20 Bytes
Habe fast die
\o/
...Netto :
Probieren Sie es online aus
Probieren Sie es hier aus !
Zusätzliche Bemerkungen
Hintergrundgeschichte
Nachdem ich beeindruckt war, diese großartige Antwort von @ ais523 zu lesen, begann ich über das weitere Golfen des Quine nachzudenken. Immerhin gab es dort einige No-Ops, und das fühlte sich nicht sehr komprimiert an. Da die Technik, die seine (und auch meine) Antwort verwendet, erfordert, dass der Code vollständige Zeilen umfasst, war eine Einsparung von mindestens 12 Bytes erforderlich. Es gab eine Bemerkung in seiner Erklärung, die mich wirklich zum Nachdenken brachte:
Dann plötzlich, als ich aufstand und wegging, um etwas zu trinken zu holen, fiel mir auf: Was, wenn das Programm keine Zeichencodes, sondern Zahlen zur Darstellung der Oberseite verwendete? Dies ist besonders kurz, wenn die Zahl, die wir drucken, zweistellig ist. Cubix 3 Ein-Byte - Befehle hat zweistellige Zahlen zu drücken:
N
,S
undQ
, die schieben10
,32
und34
jeweils so sollte dies ziemlich Golfy sein, dachte ich.Die erste Schwierigkeit bei dieser Idee ist, dass die Oberseite jetzt mit unnützen Zahlen gefüllt ist, so dass wir das nicht mehr verwenden können. Die zweite Komplikation ist, dass die Oberseite eine Größe hat, die der quadratischen Größe des Würfels entspricht, und eine gerade Größe haben muss, da sonst auch eine Zahl an der Startposition des Befehlszeigers landen würde, was zu einem verschmutzten Stapel führt. Aufgrund dieser Komplikationen musste mein Code auf einen Würfel der Größe 2 passen (der "nur" 24 Bytes enthalten kann, also musste ich mindestens 21 Bytes abwerfen). Außerdem hatte ich nur 16 effektive Bytes, da die Ober- und Unterseite unbrauchbar sind.
Also wählte ich zunächst die Zahl, die die Hälfte der oberen Fläche ausmachen würde. Ich habe mit
N
(10) angefangen , aber das hat nicht ganz geklappt, weil ich versucht habe, alles zu drucken. In jedem Fall habe ich neu begonnen undS
(32) aus irgendeinem Grund verwendet. Das hat zu einem richtigen Quine geführt, dachte ich. Es hat alles sehr gut funktioniert, aber die Anführungszeichen fehlten. Dann kam mir der Gedanke, dass dieQ
(34) wirklich nützlich sein würde. Immerhin ist 34 der Zeichencode des doppelten Anführungszeichens, der es uns ermöglicht, ihn auf dem Stapel zu halten und (2, in dem damals verwendeten Layout) wertvolle Bytes zu speichern. Nachdem ich die IP-Route ein wenig geändert hatte, war alles, was übrig blieb, eine Übung, um die Lücken auszufüllen.Wie es funktioniert
Der Code kann in 5 Teile aufgeteilt werden. Ich werde sie einzeln durchgehen. Beachten Sie, dass wir die mittleren Flächen in umgekehrter Reihenfolge codieren, da das Stack-Modell First-In-Last-Out ist.
Schritt 1: Bedrucken der Oberseite
Die irrelevanten Anweisungen wurden durch No-Ops (
.
) ersetzt. Die IP beginnt in der dritten Zeile ganz links und zeigt nach Osten. Der Stapel ist (offensichtlich) leer.Die IP endet an der am weitesten links gelegenen Position in der vierten Zeile und zeigt nach Westen, um sich an der am weitesten rechts gelegenen Position in derselben Zeile zu bewegen. Die ausgeführten Anweisungen lauten (ohne das Kontrollflusszeichen):
Der Stapel enthält nur 34 Zeichen, die das letzte Zeichen der Quelle darstellen.
Schritt 2: Codieren Sie die vierte Zeile
Dieses Bit macht so ziemlich das, was Sie erwarten: Codieren Sie die vierte Zeile. Die IP beginnt mit dem doppelten Anführungszeichen am Ende dieser Zeile und geht nach Westen, während die Zeichencodes aller Zeichen gedrückt werden, auf denen sie landen, bis ein übereinstimmendes doppeltes Anführungszeichen gefunden wird. Dieses übereinstimmende doppelte Anführungszeichen ist auch das letzte Zeichen in der vierten Zeile, da die IP-Adresse erneut umgebrochen wird, wenn sie den linken Rand erreicht.
Tatsächlich ist die IP um eine Position nach links verschoben worden, und der Stapel enthält jetzt die Darstellung der vierten Zeile in Zeichencodes und umgekehrter Reihenfolge.
Schritt 3: Drücken Sie ein anderes Zitat
Wir müssen ein weiteres Zitat vorlegen, und wie kann man das
Q
am Anfang des Programms besser recyceln , indem man es von rechts betrachtet? Dies hat den zusätzlichen Bonus, dass die IP direkt in das Zitat läuft, das die dritte Zeile codiert.Hier ist die Netzversion für diesen Schritt. Irrelevante Eingriffe wurden wieder durch No-Ops ersetzt, die ausgeführten No-Ops wurden
#
zu Illustrationszwecken durch Hashtags ( ) ersetzt und die IP beginnt beim letzten Zeichen in der vierten Zeile.Die IP endet in der dritten Zeile bei der ersten Anweisung und wird am Ende dieser Zeile umgebrochen, da sie nach Westen zeigt. Die folgenden Anweisungen (ohne Kontrollfluss) werden ausgeführt:
Dieses doppelte Anführungszeichen steht am Ende der dritten Zeile.
Schritt 4: Kodieren der dritten Zeile
Dies funktioniert genauso wie in Schritt 2, daher suchen Sie dort nach einer Erklärung.
Schritt 5: Drucken Sie den Stapel
Der Stapel enthält nun die vierte und dritte Zeile in umgekehrter Reihenfolge. Sie müssen ihn also nur noch drucken. Die IP beginnt mit der vorletzten Anweisung in der dritten Zeile und bewegt sich nach Westen. Hier ist der relevante Teil des Würfels (wieder wurden irrelevante Teile durch No-Ops ersetzt).
Dies ist eine Schleife, wie Sie vielleicht gesehen / erwartet haben. Der Hauptteil ist:
Die Schleife endet, wenn das oberste Element 0 ist. Dies geschieht nur, wenn der Stapel leer ist. Wenn die Schleife endet,
@
wird ausgeführt und das Programm beendet.quelle
Javascript ES6 - 21 Bytes
Ich nenne das Quine "The Bling Quine".
Manchmal muss man stilvoll Golf spielen.
quelle
!$=_=>`!$=${$}()`()
Ihnen 2 Bytes?Invalid assignment left hand side
. Ich wünschte, es hat funktioniert :(Array.prototype.join
.alert
oderconsole.log
nach der Pfeilfunktion und das Umschließen der Vorlagenzeichenfolge in Klammern würde jedoch funktionieren.Brainf * ck (755 Zeichen)
Dies basiert auf einer von Erik Bosman (ejbosman at cs.vu.nl) entwickelten Technik. Beachten Sie, dass die "ESultanik's Quine!" Text ist eigentlich notwendig, damit es ein Quine ist!
quelle
ESultanik's Quine!
Einrichten des Speichers als StapelcodierungESultanik's Quine!
und weiter, mit zwei Byte Speicher für jedes Zeichen (ASCII-Wert versetzt von 0x1F). Das letzte Codebit durchläuft den Speicher, wobei zuerst die++>+++…
Codes für jedes Zeichen programmgesteuert reproduziert und dann die Zeichen tatsächlich gedruckt werden.Sechseck , Seitenlänge
15 14 1312,616 533 456383 BytesNach einigen Tagen sorgfältigen Golfspiels, Neuanordnens von Loops und Neuanfangens habe ich es endlich geschafft, es auf ein Sechseck von Seite 12 zu bringen.
Probieren Sie es online!
Entfaltet:
Obwohl es nicht so aussieht, als wäre es der meiste Hexagony-Code, ist die von mir verwendete Codierung für längere Läufe von No-Ops optimiert, was Sie sonst vermeiden würden.
Erläuterung
Dies schlägt die vorherige Hexagony-Antwort, indem die no-ops (
.
) auf andere Weise codiert werden. Während diese Antwort Platz spart, indem Sie jedes andere Zeichen zu einem a machen.
, codiert meins die Anzahl der No-Ops. Dies bedeutet auch, dass die Quelle nicht so eingeschränkt sein muss.Hier verwende ich eine Basis 80 Codierung, wo Zahlen unter 16 läuft der No-ops zeigen und Zahlen zwischen 16 und 79 stellen den Bereich 32 (
!
) bis 95 (_
) (Ich bin jetzt nur noch zu realisieren ich golfed alle_
s aus meinem Code lol). Pythonischer Pseudocode:Die Zahl wird in der ersten Hälfte des Sechsecks mit allen Zeichen codiert
auf der linken Seite und der
auf der rechten Seite den Zeiger umleiten, um die Zahl in eine Zelle zu kodieren. Dies ist Martin Enders Antwort entnommen (danke), da ich keinen effizienteren Weg finden konnte.
Es gelangt dann in den unteren Bereich durch
->
:!
druckt die Nummer und'
navigiert zur rechten Speicherzelle, bevor die Schleife gestartet wird.P='%
modifiziert die aktuelle Zahl um 80. Wenn das Ergebnis 0 ist, gehe hoch zum Abschluss@
, sonst gehe runter und erstelle eine Zelle neben dem Mod-Ergebnis mit dem Wert-16
.Stellen Sie die Zelle auf (Mod-Wert + -16). Wenn dieser Wert negativ ist, gehen Sie an der Verzweigung nach oben
>+'\
, andernfalls nach unten.Wenn der Wert positiv ist:
Der Zeiger landet an der Stelle, an der
;-<
die Zelle steht (mod value - -16) und gibt sie aus.Der Wert ist negativ:
Gehen Sie zu dem
> ) <
Abschnitt, der die Schleife startet. Hier ist es isoliert:Dieser führt den Code aus,
'Q4;="=
der ein ausgibt.
(nochmals danke an Martin Ender, der ein Programm geschrieben hat , um die Buchstaben-Zahlen-Kombinationen für Zeichen zu finden) und geht zurück in die Startzelle. Anschließend wird)
die Mod-Wert-Zelle inkrementiert ( ) und erneut eine Schleife ausgeführt, bis der Mod-Wert positiv ist.Wenn das erledigt ist, bewegt es sich nach oben und verbindet sich mit dem anderen Abschnitt unter:
Der Zeiger springt dann wieder zum Anfang der größeren Schleife zurück
Dies wird ausgeführt,
='=:'
wobei die aktuelle Zahl durch 80 geteilt wird und zur richtigen Zelle navigiert wird.Alte Version (Seitenlänge 13)
Probieren Sie es online!
Ich kann definitiv eine andere Nebenlänge Golf spielen, aber ich muss es bis morgen lassen, weil es spät wird.Es stellt sich heraus, dass ich ungeduldig bin und nicht bis morgen warten kann.Vielleicht kann eine andere Seite Golf spielen?:(ahhhhhhhhh ich habe es getan!Ich habe sogar ein paar zusätzliche Ziffern mit einer Base-77-Codierung abgespielt , aber das spielt keine Rolle, da es den gleichen Bytecount hat.
quelle
PostScript, 20 Zeichen
Kurz und richtig. 20 Zeichen inklusive nachfolgender Newline.
quelle
Cubix , 45 Bytes
Sie können diesen Code hier testen .
Dieses Programm ist ziemlich schwer zu befolgen, aber um eine Chance zu haben, müssen wir es zunächst zu einem Cube erweitern, wie es der Cubix-Interpreter tut:
Dies ist eine Art Befunge-Quine, die über das Ausnutzen von Wrapping funktioniert, um String-Literale in ausführbaren Code "einfließen" zu lassen (mit nur einer
"
Markierung befindet sich der Code gleichzeitig sowohl innerhalb als auch außerhalb des Zitats, was möglich wird, wenn Sie haben nichtlineare und nichtplanare Programme). Beachten Sie, dass dies unserer Definition eines richtigen Quines entspricht, da sich zwei der doppelten Anführungszeichen nicht selbst codieren, sondern später mithilfe von Arithmetik berechnet werden.Im Gegensatz zu Befunge verwenden wir hier jedoch nicht nur eine, sondern vier Saiten. Hier ist, wie sie auf den Stapel geschoben werden;
Das Programm beginnt oben am linken Rand und läuft nach rechts. es dreht sich zweimal nach rechts (
R
) und bewegt sich dabei entlang der dritten und letzten Linie, die den gesamten Würfel umgibt, nach links. Das doppelte Anführungszeichen passt zu sich selbst, also schieben wir die gesamte dritte Zeile rückwärts auf den Stapel. Dann wird die Ausführung nach dem Anführungszeichen fortgesetzt.Der
u
Befehl führt eine Kehrtwende nach rechts aus, sodass wir als Nächstes von nun'"
an auf der Mittellinie fahren. Das drückt einen"
auf den Stapel. Wir wickeln uns weiter umher, treffen die<
linke Seite des Würfels und hüpfen zurück. Wenn wir uns aus dieser Richtung nähern, sehen wir einen einfachen"
Befehl, nicht jedoch'"
, und die gesamte zweite Zeile wird rückwärts über der dritten Zeile und dem doppelten Anführungszeichen auf den Stapel geschoben.Wir beginnen damit, dass wir a
!
auf den Stapel schieben ('!
) und inkrementieren ()
); Dies erzeugt ein doppeltes Anführungszeichen, ohne dass ein doppeltes Anführungszeichen in unserem Quellcode erforderlich ist (was die Zeichenfolge beenden würde). Ein Spiegel (\
) spiegelt die Ausführungsrichtung nach Norden wider; dann geht derW
Befehl zur linken Seite. Dies lässt uns in der siebten Spalte nach oben gehen. Da dies ein Würfel ist, wird er in der dritten Zeile nach links und in der dritten Spalte nach unten gewickelt. Wir schlagen einR
, um rechts abzubiegen und gehen links entlang der oberen Reihe; Dann$
überspringt das den Weg,R
über den wir das Programm eingegeben haben, so dass die Ausführung"
am Ende der Zeile endet und wir die erste Zeile in einer Zeichenkette auf die gleiche Weise erfassen, wie wir es für die zweite und dritte Zeile getan haben.Der
^
Befehl schickt uns in nördlicher Richtung die elfte Spalte hinauf, die in südlicher Richtung die fünfte ist (Würfelumhüllung erlaubt). Das Einzige, was uns dort begegnet, ist!
(Skip, wenn nicht Null; die Spitze des Stapels ist tatsächlich ungleich Null), das deno
Befehl überspringt und die fünfte Spalte praktisch vollständig leer macht. Alsou
kehren wir zu dem Befehl zurück, der erneut umkehrt, aber diesmal bleiben wir auf der letzten Spalte nach Süden, die zur vierten Spalte nach Norden führt. Wir haben jedoch während der Kehrtwende ein doppeltes Anführungszeichen getroffen, sodass wir die gesamte vierte Spalte in einer Zeichenfolge von unten nach oben erfassen. Im Gegensatz zu den meisten Anführungszeichen im Programm schließt sich dieses nicht von alleine. Vielmehr wird es durch das Symbol"
in der rechten oberen Ecke geschlossen, was bedeutet, dass wir die Zeichenfolge mit neun Zeichen erfassen...>.....
.Das Stack-Layout ist also jetzt von oben nach unten: vierte Spalte; oberste Reihe;
"
; mittlere Reihe;"
; untere Reihe. Jedes dieser Zeichen wird auf dem Stapel mit dem ersten Zeichen am Anfang des Stapels dargestellt (Cubix drückt Zeichenfolgen in umgekehrter Reihenfolge wie Befunge, aber jedes Mal, wenn sich die IP in die entgegengesetzte Richtung zur natürlichen Leserichtung bewegt hat, so wurde es effektiv zweimal umgekehrt). Es ist anzumerken, dass der Inhalt des Stapels fast identisch mit dem ursprünglichen Programm ist (da die vierte Spalte und die Nord- / Oberseite des Würfels dieselben Zeichen in derselben Reihenfolge enthalten; offensichtlich wurde sie absichtlich so gestaltet).Der nächste Schritt besteht darin, den Inhalt des Stapels zu drucken. Nach all den Pushs geht die IP in der vierten Spalte nach Norden, trifft
>
dort also und tritt in eine enge Schleife ein>>o;?
(dh "nach Osten drehen, nach Osten drehen, als Zeichen ausgeben, Pop, nach rechts drehen, wenn positiv"). Da die siebte Zeile mit NOPs gefüllt ist, wird der Zeilenumbruch?
auf die erste zurückgesetzt>
, sodass der gesamte Inhalt des Stapels effektiv verschoben wird (?
bei einem leeren Stapel ist dies ein No-Op). Wir haben fast das gesamte Programm ausgedruckt! Leider ist es noch nicht ganz fertig; Wir vermissen das doppelte Anführungszeichen am Ende.Sobald die Schleife endet, reflektieren wir über ein Paar Spiegel auf die Mittellinie, die sich nach Westen bewegt. (Wir haben früher die "andere Seite" des
\
Spiegels verwendet; jetzt verwenden wir die Südwestseite. Der/
Spiegel wurde zuvor nicht verwendet.) Wir'!
treffen auf ein Ausrufezeichen (dh 33; wir verwenden ASCII) und Cubix unterscheidet nicht zwischen ganzen Zahlen und Zeichen auf dem Stapel. (Praktischerweise ist dies das gleiche, mit!
dem dero
Befehl früher übersprungen wurde.) WirR
treffen auf einR
Befehlspaar und verwenden es, um eine "manuelle" Kehrtwende durchzuführen (der zweite Befehl hier wurde früher verwendet, um den ersten zu erreichen Reihe, so schien es am natürlichsten, einen anderenR
Befehl daneben zu passen .W
Befehl, um nach links auszuweichen. Der Sidestep stürzt direkt in den>
Befehl in der zweiten Zeile und bringt die Ausführung genau dahin zurück, wo sie war. Wir gehen also wieder nach links, aber dieses Mal gehen wir nach Süden, und der nächste auszuführende Befehl ist der)
(Inkrementieren des Ausrufezeichens in ein doppeltes Anführungszeichen), gefolgt von einemo
(um es auszugeben). Schließlich wird die Ausführung entlang der achten Zeile bis zur zweiten Spalte fortgesetzt, wo ein gefunden wird@
, um das Programm zu beenden.Ich entschuldige mich für das verirrte Apostroph in der dritten Zeile. In dieser Version des Programms wird nichts ausgeführt. es war Teil einer früheren Idee, die ich hatte, die sich jedoch als nicht notwendig herausstellte. Sobald ich jedoch ein funktionierendes Quine erhalten hatte, wollte ich es nur einreichen, anstatt weiter damit herumzuspielen, zumal das Entfernen die Byteanzahl nicht ändern würde. Was das weitere Golfspielen angeht, würde es mich nicht überraschen, wenn dies bei 3 × 3 nur mit den ersten fünf Linien möglich wäre, aber ich sehe keinen offensichtlichen Weg, dies zu tun, und es würde notwendig sein noch engere Packung des gesamten Kontrollflusses zusammen mit einer anderen Möglichkeit, die Oberseite des Würfels darzustellen (oder den Algorithmus so zu modifizieren, dass die vierte Spalte weiterhin verwendet werden kann, obwohl sie jetzt zehn oder elf Zeichen lang wäre) .
quelle
"
istQ
.Python 2, 30 Bytes
Von hier genommen
quelle
_
, aber es liest sich besser, wenn Sie es einem Buchstaben zuweisen, dh s:s='s=%r;print s%%s';print s%s
Vim,
17, 14 TastenanschlägeJemand hat das nach dem Zufallsprinzip hochgestuft, also erinnerte ich mich, dass es existiert. Als ich es noch einmal las, dachte ich: "Hey, ich kann es besser als das!", Also habe ich zwei Bytes weniger gespielt. Es ist immer noch nicht die kürzeste, aber zumindest eine Verbesserung.
Ich habe mich lange gefragt, ob ein vim quine möglich ist. Einerseits muss es möglich sein, da vim vollständig ist. Aber nachdem ich sehr lange nach einer Quine gesucht hatte, konnte ich keine finden. Ich habe finden diese PPCG Herausforderung , aber es ist geschlossen und nicht genau über wörtliche quines. Also habe ich beschlossen, eine zu machen, da ich keine finden konnte.
Auf diese Antwort bin ich aus zwei Gründen sehr stolz :
Dies ist die erste Quine, die ich jemals gemacht habe, und
Soweit ich weiß, ist dies die erste vim-quine der Welt , die jemals veröffentlicht wurde! Ich könnte mich in dieser Sache irren. Wenn Sie eine kennen, lassen Sie es mich bitte wissen.
Also, nach dieser langen Einführung, hier ist es:
Probieren Sie es online!
Beachten Sie, dass der
<esc>
Tastenanschlag bei der Eingabe als angezeigt wird^[
. Dies ist immer noch korrekt, da^[
repräsentiert0x1B
, was in ASCII ein Escape ist , und die Art und Weise, wie vim intern den<esc>
Schlüssel repräsentiert .Auch beachten Sie , dass diese Prüfung fehlschlagen , wenn Sie eine vorhandene vim Sitzung laden. Ich schrieb ein Spitzen beantworten , die erklären hier , wenn Sie weitere Informationen wünschen, aber im Grunde müssen Sie vim starten mit
oder tippe
qqq
bevor du das ausführst.Erläuterung:
Nebenbei bemerkt, diese Antwort ist wahrscheinlich ein Weltrekord für die meisten Fragen in einer PPCG-Antwort oder so.
quelle
2i2i<esc>
ist so nah. Ich habe das Gefühl, dass es etwas geben muss, das ich tun kann, damit das funktioniert.<Esc>
ist in V implizit, so dass funktioniert . Leider gibt es auch eine neue Zeile, weshalb ich sie noch nicht gepostet habe.q"iq"qbP<Esc>qbP
ist 11. Nachdem du das auf reddit gesetzt hast , habe ich hier das Vimgolfing untersucht und beschlossen, ein Konto zu erstellen. Dies ist die Antwort, die ich dort gepostet habe.Verloren ,
120 116 98 96 76 7066 BytesBearbeiten: yay, unter 100
Bearbeiten: Speichert eine Menge Bytes, indem auf alle
/
s in der untersten Zeile gewechselt wirdProbieren Sie es online! + Überprüfung ist deterministisch für alle möglichen Zustände
Lost ist eine 2D-Sprache, in der Startposition und Richtung völlig zufällig sind. Dies bedeutet, dass in jeder Phase viele Fehlerprüfungen durchgeführt werden müssen, um sicherzustellen, dass Sie den richtigen Anweisungszeiger haben, und dass dieser nicht zufällig eingewandert ist.
Erläuterung:
Alle
/
s in der untersten Zeile sind dazu da, um sicherzustellen, dass alle Zeiger, die in vertikaler Richtung oder in der untersten Zeile erscheinen, in die richtige Richtung geleitet werden. Von dort aus landen sie an verschiedenen Orten, aber alle landen direkt in derDamit werden alle Zahlen ungleich Null im Stapel gelöscht. Der
([
nach , die keine zusätzlichen 0s auch entrümpelt.In der Mitte des Clear trifft es das
%
, was die "Sicherheit" ausschaltet, was es dem Programm ermöglicht, zu beenden, wenn es das trifft@
(ohne dies könnte das Programm sofort enden, wenn ein Zeiger auf das gestartet wird@
).Von dort aus wird eine ziemlich einfache 2D-Sprache erstellt, indem ein String-Literal (
"
) um die erste Zeile"
gewickelt und ein Zeichen durch Betätigen eines Leerzeichens (:2+
) und einer neuen Zeile (52*
) verschoben wird . In der zweiten Zeile wird ein/
Zeichen (95*2+
) erstellt und ein Bündel (>::1?:[:[[[[
) dupliziert , bevor es schließlich am endet@
und der Stapel implizit gedruckt wird. Das?1
ist es, den Prozess zu stoppen von zu vielen 0s zu schaffen , wenn der Zeiger früh eintritt, Speicher auf, die sie später zu löschen.Ich habe hier 20 Bytes gespart, indem ich die letzte Zeile immer mit dem gleichen Zeichen versehen habe, was bedeutet, dass ich direkt vom Duping-Prozess bis zum Ende gehen konnte
@
.Erklärung zum Duping-Vorgang:
[
ist ein Charakter, der als "Tür" bekannt ist. Wenn der Zeiger auf die flache Seite von a[
oder a trifft]
, wird er reflektiert, ansonsten passiert er es. Jedes Mal, wenn der Zeiger mit einer Tür interagiert, wechselt er zum entgegengesetzten Typ. Mit diesem Wissen können wir eine einfache Formel erstellen, wie oft eine Anweisung in einem>:[
Block ausgeführt wird.Fügen Sie die anfängliche Menge an Anweisungen hinzu. Fügen Sie jeweils
[
das Doppelte der Anweisungen links davon hinzu. Für das Beispiel>::::[:[[[
beginnen wir mit 5 als Anfangsbetrag. Die erste Tür hat 4 Dup-Anweisungen, also addieren wir 4 * 2 = 8 bis 5, um 13 zu erhalten. Die anderen drei Türen haben 5 Dupes zu ihrer Linken, also addieren wir 3 * (5 * 2) = 30 bis 13, um 43 zu erhalten dupe Anweisungen ausgeführt, und haben 44>
s auf dem Stapel. Der gleiche Vorgang kann auf andere Anweisungen angewendet werden, z. B.(
um eine große Menge von Elementen aus dem Stapel in den Bereich zu verschieben oder um Elemente aus dem Stapel zu löschen.Ein Trick, den ich hier benutzt habe, um zu vermeiden, zu viele Nullen zu täuschen, ist der
1?
. Wenn das Zeichen 0 ist,?
wird die 1 nicht übersprungen, was bedeutet, dass 1 für den Rest der Dupe dupliziert wird. Dies erleichtert das spätere Löschen des Stapels erheblich .quelle
Dies sind die beiden kürzesten Rubin quines von SO :
und
Frag mich nicht, wie der zweite funktioniert ...
quelle
<<2
beginnt eine Zeichenkette in der nächsten Zeile und*2
wiederholt die ZeichenketteSpaltung , 6 Bytes
Es scheint, dass dies nun die kürzeste "richtige" Antwort unter diesen Antworten ist.
Erläuterung
Der Kontrollfluss beginnt
R
mit einem einzelnen rechtsgerichteten(1,0)
Atom. Der"
Druckmodus wird umgeschaltet und anschließend um die Zeile gewickelt. Anschließend wird gedruckt,'!+OR
bevor derselbe"
erneut getroffen und der Druckmodus beendet wird.Das lässt
"
sich ausdrucken. Der kürzeste Weg ist'"O
(wobei'"
die Masse des Atoms auf den Zeichencode von gesetzt wird"
undO
das Zeichen gedruckt und das Atom zerstört wird), aber wenn wir dies tun, würde dies den"
Druckmodus stören. Also setzen wir stattdessen den Wert des Atoms auf'!
(eins weniger als"
), inkrementieren dann mit+
und drucken dann das Ergebnis mitO
.Alternativen
Hier sind ein paar Alternativen, die länger sind, aber vielleicht inspirieren ihre Techniken jemanden, eine kürzere Version mit ihnen zu finden (oder vielleicht sind sie in bestimmten verallgemeinerten Quines nützlicher).
8 Bytes mit
J
umpWieder beginnt der Code bei
R
. Die@
tauscht Masse und Energie zu geben(0,1)
. DadurchJ
springt das Atom über dieO
Gerade auf die"
. Dann werden, wie zuvor, alle außer den"
im Zeichenkettenmodus gedruckt. Danach schlägt das Atom|
um, um seine Richtung umzukehren, und durchläuft dann den'"O
Druckvorgang"
. Der Raum ist ein bisschen nervig, aber es scheint notwendig, weil sonst'
das Atom das|
als Zeichen anstelle eines Spiegels behandeln würde.8 Bytes mit zwei Atomen
Dies hat zwei Atome, die von links nach
L
rechts gehenR
. Das nach links gehende Atom bekommt seinen Wert gesetzt, mit'"
dem dann sofort gedruckt wirdO
(und das Atom zerstört wird). Für das rechtsgerichtete Atom tauschen wir wieder Masse und Energie aus, springen über dasO
, um den Rest des Codes im Druckmodus zu drucken. Danach wird sein Wert durch gesetzt,'L
aber das spielt keine Rolle, da das Atom dann mit verworfen wird;
.quelle
'!+
codiert"
.|R@JO"'
funktionieren, oder würdest du den Platz nach dem noch brauchen'
?'
erste drucken .Browserübergreifendes JavaScript (41 Zeichen)
Es funktioniert in den Top 5 Webbrowsern (IE> = 8, Mozilla Firefox, Google Chrome, Safari, Opera). Geben Sie es in die Entwicklerkonsole ein:
Es ist kein "Schummeln" - im Gegensatz zu Chris Jester-Youngs Single-Byte-Quine, da es leicht modifiziert werden könnte, um die
alert()
Funktion zu nutzen (mit 14 Zeichen):Oder konvertiert in ein Lesezeichen (mit 22 Zeichen):
quelle
C
6460 BytesBisher ist dies die kürzeste bekannte C-Quine. Es gibt ein erweitertes Kopfgeld, wenn Sie ein kürzeres finden.
Dies funktioniert in GCC , Clang und TCC in einer POSIX- Umgebung. Es ruft bei allen eine übermäßige Menge an undefiniertem Verhalten hervor.
Nur zum Spaß, hier ist ein Repo , das alle mir bekannten C-Quines enthält. Fühlen Sie sich frei, sich mit PR zu befassen, wenn Sie einen anderen finden oder schreiben, der etwas Neues und Kreatives über die vorhandenen hinzufügt.
Beachten Sie, dass es nur in einer ASCII- Umgebung funktioniert . Dies funktioniert für EBCDIC , erfordert jedoch weiterhin POSIX . Viel Glück beim Auffinden einer POSIX / EBCDIC-Umgebung: P
Wie es funktioniert:
main(s)
missbrauchtmain
die Argumente und deklariert eine praktisch untypisierte Variables
. (Beachten Sie, dasss
es sich nicht wirklich um einen untypisierten Compiler handelt. Da die aufgelisteten Compiler ihn jedoch bei Bedarf automatisch umwandeln, kann er auch * lauten.)printf(s="..."
Legts
die angegebene Zeichenfolge fest und übergibt das erste Argument anprintf
.s
ist eingestellt aufmain(s){printf(s=%c%s%1$c,34,s);}
.%c
ist auf ASCII gesetzt34
,"
. Das macht das Quine möglich. Nuns
sieht wie folgt aus :main(s){printf(s="%s%1$c,34,s);}
.%s
ist auf sichs
selbst eingestellt, was durch # 2 möglich ist. Nuns
sieht wie folgt aus :main(s){printf(s="main(s){printf(s=%c%s%1$c,34,s);}%1$c,34,s);}
.%1$c
wird auf ASCII 34 gesetzt"
,printf
das erste ** Argument. Nuns
sieht es so aus:main(s){printf(s="main(s){printf(s=%c%s%1$c,34,s);}",34,s);}
... was zufällig der ursprüngliche Quellcode ist.
* Beispiel dank @Pavel
** erstes Argument nach dem Formatbezeichner - in diesem Fall
s
. Es ist unmöglich, auf den Formatbezeichner zu verweisen.Ich denke, es ist unmöglich, dass dies mit dem gleichen Ansatz kürzer wird. Wenn
printf
der Formatbezeichner von über zugänglich$
wäre, würde dies für 52 Bytes funktionieren:quelle
s
ist vom Typint
, keine "untypisierte Variable".s=3
Das würde natürlich nicht funktionieren, da Sie die Zeichenfolge zweimal an übergeben müssenprintf
.Java, 528 Bytes:
Eine Java-Lösung mit einem originellen Ansatz:
in lesbarer Form:
quelle
if(++i==92)
,a*
Array in Java nicht beendet wird, ist das C. Einige andere Teile zum Golfspielen :,import java.math.*;class a{public static void main(String[]a){BigInteger b=new BigInteger("abc",36);int i=0;for(int c:b.toByteArray())System.out.printf("%s%c",++i==92?b.toString(36):"",c);}}
woabc
wäre die neu berechnete magische Zahl String. In Java 8+ es ist auch möglich , sich ändernclass a{public static void main
zuinterface a{static void main
, und in Java ist es auch möglich , 10+ zu ändernimport java.math.*;
undBigInteger b=new BigInteger(
zuvar b=new java.math.BigInteger(
.Huhn , 7
Nein, das wird nicht direkt wiedergegeben :)
quelle
chicken
!Netzhaut ,
201497 BytesBevor wir anfangen, möchte ich die triviale Lösung einer Datei erwähnen, die eine einzige enthält
0
. In diesem Fall wird Retina versuchen, das0
s in der leeren Eingabe zu zählen, dessen Ergebnis ebenfalls ist0
. Ich würde das aber nicht für eine richtige Quine halten.Also hier ist eine richtige:
Probieren Sie es online!
Alternativ könnten wir
;
statt verwenden>
.Erläuterung
Das Programm besteht aus einer einzelnen Ersetzung, die wir zweimal drucken.
In der ersten Zeile wird die
`
Konfiguration vom regulären Ausdruck getrennt, sodass der reguläre Ausdruck leer ist. Daher wird die leere Zeichenfolge (dh die nicht vorhandene Eingabe) durch die zweite Zeile wörtlich ersetzt.Um das Ergebnis zweimal auszudrucken, verpacken wir es in zwei Ausgangsstufen. Der innere
\
druckt das Ergebnis mit einem nachgestellten Zeilenvorschub und der äußere mit einem nachgestellten Zeilenvorschub.>
druckt es ohne einen.Wenn Sie ein wenig mit Retina vertraut sind, fragen Sie sich möglicherweise, was mit der impliziten Ausgabe von Retina geschehen ist. Die implizite Ausgabe von Retina schließt die letzte Stufe eines Programms in eine Ausgabestufe ein. Retina tut dies jedoch nicht, wenn die Endstufe bereits eine Ausgangsstufe ist. Der Grund dafür ist, dass es in einem normalen Programm sinnvoller ist, die implizite Ausgangsstufe durch eine spezielle wie
\
oder;
durch ein einzelnes Byte zu ersetzen (anstatt die implizite mit dem.
Flag ebenfalls entfernen zu müssen). Leider kostet uns dieses Verhalten zwei Bytes für das Quine.quelle
Javascript (36 Zeichen)
Dies ist, AFAICT, die kürzeste Javascript-Quine, die bisher veröffentlicht wurde.
quelle
a
, können Sie durch Aufrufen auf deren Inhalt zugreifena.toString
.a
genauso wie oben beschrieben stringiert . Es ist jedoch wahrscheinlich, dass die Ausgabe dieses Codes in jeder JavaScript-Implementierung eine Quine ist.!function a(){alert("!"+a+"()")}()
.(a=()=>alert(
($ {a})))()
GolfScript, 8 Bytes
Ich dachte immer, das kürzeste (wahre) GolfScript-Quine wäre 9 Bytes:
Wo der nachfolgende Zeilenvorschub erforderlich ist, weil GolfScript standardmäßig einen nachfolgenden Zeilenvorschub druckt.
Aber ich habe gerade ein 8-Byte-Quine gefunden, das genau diese Zeilenvorschub-Einschränkung umgeht:
Probieren Sie es online!
Der Haken ist also, dass GolfScript keinen nachgestellten Zeilenvorschub druckt, sondern den Inhalt
n
am Ende des Programms. Es ist nur so, dass esn
einen Zeilenvorschub gibt. Daher besteht die Idee darin, diese durch die Zeichenfolge zu ersetzen":n`"
und sie dann so zu verketten, dass die Kopie auf dem Stapel mit Anführungszeichen gedruckt wird und die Kopie inn
Abzügen ohne gedruckt wird.Wie Thomas Kwa betonte, kann das 7-Byte-CJam-Quine auch an eine 8-Byte-Lösung angepasst werden:
Auch hier brauchen wir den Trailing Linefeed.
quelle
Labyrinth ,
12411053 BytesDank an Sp3000 für das Golfen mit 9 Bytes, wodurch ich weitere 7 Bytes Golf spielen konnte.
Probieren Sie es online!
Erläuterung
Labyrinth 101:
n*10 + <digit>
. Dies ermöglicht den einfachen Aufbau großer Zahlen. Verwenden Sie_
, um eine neue Nummer zu beginnen , die Null drückt."
sind No-Ops.Zuerst erkläre ich eine etwas einfachere Version, die ein Byte länger, aber etwas weniger magisch ist:
Probieren Sie es online!
Die Hauptidee besteht darin, den Hauptteil der Quelle mit einer großen Basis in einer einzigen Zahl zu codieren. Diese Nummer kann dann einfach selbst zurückgedruckt werden, bevor sie dekodiert wird, um den Rest des Quellcodes auszudrucken. Die Dekodierung ist einfach die wiederholte Anwendung
divmod base
, bei der das Druckenmod
und Weiterarbeiten mit demdiv
bis zu seiner Null fortgesetzt wird .Wenn Sie dies vermeiden
{}
, ist der höchste benötigte Zeichencode_
(95), sodass die Basis 96 ausreicht (wenn Sie die Basis niedrig halten, ist die Zahl am Anfang kürzer). Also, was wir codieren wollen, ist Folgendes:Wenn wir diese Zeichen in ihre Codepunkte umwandeln und das Ergebnis als Zahl zur Basis 96 behandeln (wobei die niedrigstwertige Ziffer der Zahl
!
und die höchstwertige.
der Zahl entspricht , da dies die Reihenfolge ist, in der wir die Zahl zerlegen), erhalten wirJetzt beginnt der Code mit einem ziemlich coolen Trick (wenn ich so sagen darf), der es uns ermöglicht, die Kodierung zurückzudrucken und eine weitere Kopie zum Dekodieren mit sehr geringem Aufwand aufzubewahren: Wir setzen die Zahl in umgekehrter Reihenfolge in den Code. Ich habe das Ergebnis mit diesem CJam-Skript berechnet. Kommen wir also zum eigentlichen Code. Hier ist der Anfang:
Die IP beginnt in der oberen linken Ecke und geht nach Osten. Während es über diese Ziffern läuft, baut es einfach diese Zahl auf dem Stapel auf. Die Zahl selbst ist völlig bedeutungslos, weil es das Gegenteil von dem ist, was wir wollen. Wenn die IP das trifft
!
, wird diese Nummer vom Stapel genommen und gedruckt. Das ist alles, was Sie tun müssen, um die Codierung in der Ausgabe zu reproduzieren.Aber jetzt hat die IP eine Sackgasse erreicht. Das heißt, es dreht sich um und bewegt sich jetzt zurück nach Westen (ohne
!
erneut ausgeführt zu werden). Dieses Mal liest die IP bequemerweise die Nummer von hinten nach vorne, so dass dies jetzt die Nummer oben auf dem Stapel tut den Rest der Quelle codiert.Wenn die IP nun wieder die obere linke Ecke erreicht, ist dies keine Sackgasse, da die IP eine Linkskurve machen kann und sich nun nach Süden bewegt. Das
"
ist ein No-Op, den wir hier brauchen, um die Nummer von der Hauptschleife des Codes zu trennen. Apropos:Solange die Spitze des Stapels noch nicht Null ist, durchläuft die IP diesen ziemlich dichten Code in der folgenden Schleife:
Oder linear angelegt:
Der Grund dafür liegt in der Steuerungsflusssemantik von Labyrinth. Wenn die aktuelle Zelle mindestens drei Nachbarn hat, wechselt die IP bei einem negativen Stack-Wert nach links, bei einer Null nach vorne und bei einem positiven Stack-Wert nach rechts. Wenn die gewählte Richtung nicht möglich ist, weil es eine Mauer gibt, nimmt die IP stattdessen die entgegengesetzte Richtung (weshalb es im Code zwei linke Umdrehungen gibt, obwohl die Oberseite des Stapels niemals negativ ist).
Der Loop-Code selbst ist eigentlich ziemlich unkompliziert (wenn man ihn so stark komprimiert, ist das der Hauptbeitrag von Sp3000):
Sobald
N
Null erreicht ist, ändert sich der Kontrollfluss. Jetzt möchte die IP nach dem/
(dh nach Westen) geradeaus fahren , aber da ist eine Mauer. Also stattdessen, wenn sich umdreht (nach Osten), führt das6
wieder aus. Das macht die Spitze des Stapels positiv, also dreht sich die IP nach rechts (nach Süden) und führt die aus9
. Die Spitze des Stapels ist jetzt69
, aber alles, was uns interessiert, ist, dass es positiv ist. Die IP nimmt eine weitere Rechtskurve (West) und fährt auf die,@
die den Code beendet.Alles in allem ziemlich einfach.
Okay, wie können wir dieses zusätzliche Byte abschneiden? Klar, dass No-Op verschwenderisch erscheint, aber wir brauchen diese zusätzliche Zeile: Wenn die Schleife neben der Nummer wäre, würde sich die IP bereits sofort dorthin bewegen, anstatt die gesamte Nummer zu durchlaufen. Können wir mit diesem No-Op etwas Nützliches anfangen?
Im Prinzip können wir damit die letzte Ziffer zur Kodierung hinzufügen. Die Kodierung muss nicht unbedingt in der ersten Zeile stehen ... das
!
sorgt nur dafür, dass das, was auch immer da ist, auch dort gedruckt wird.Es gibt jedoch einen Haken, wir können das nicht einfach tun:
Das Problem ist, dass wir jetzt die Zahl
"
in eine geändert haben3
, wodurch sich auch die tatsächliche Zahl ändert, die wir haben möchten. Und sicher endet diese Zahl nicht mit3
. Da die Anzahl vollständig durch den Code bestimmt wird,!
können wir nicht viel dagegen tun.Aber vielleicht können wir eine andere Ziffer wählen? Es ist uns egal, ob sich
3
an dieser Stelle eine befindet, solange wir eine Zahl haben, die die Quelle korrekt codiert. Nun, leider ergibt keine der 10 Ziffern eine Kodierung, deren niedrigstwertige Ziffer mit der gewählten übereinstimmt. Glücklicherweise gibt es im Rest des Codes einen gewissen Spielraum, sodass wir ein paar weitere Codierungen ausprobieren können, ohne die Bytezahl zu erhöhen. Ich habe drei Möglichkeiten gefunden:@
zu/
. In diesem Fall können wir eine beliebige Ziffer verwenden1357
und eine passende Kodierung erhalten. Dies würde jedoch bedeuten, dass das Programm dann mit einem Fehler beendet wird, der zulässig ist, aber nicht sehr sauber zu sein scheint._
). 26 Auswahlmöglichkeiten bieten viele Möglichkeiten. ZB fürA
jede ungerade Ziffer funktioniert. Das ist ein bisschen schöner, aber es scheint nicht besonders elegant zu sein, da Sie dort niemals einen Buchstaben in echtem Code verwenden würden.1
, endet die Codierung auch mit1
. Dies ist die einzige Lösung unter den Basen 96, 97, 98, 99, also ist dies in der Tat sehr glücklich. Und so erhalten wir den Code oben in dieser Antwort.quelle
Verloren ,
293262249 BytesProbieren Sie es online!
Erläuterung
Dieses gesamte Projekt war ein Auf und Ab. Ich hielt es für unmöglich und kam dann auf eine verrückte Idee, die einfach funktionieren könnte.
Warum ist ein Lost Quine so schwer?
Wie Sie vielleicht wissen, handelt es sich bei Lost um eine 2D-Programmiersprache, deren Startort und -richtung völlig zufällig sind. Dies macht das Schreiben verlorener Programme genauso schwierig wie das Schreiben von strahlungsgehärtetem Code. Sie müssen jeden möglichen Ort und jede Richtung berücksichtigen.
Davon abgesehen gibt es einige Standardmethoden, um Dinge zu tun. Hier ist zum Beispiel die Standardmethode zum Drucken einer Zeichenfolge.
Am unteren Rand befindet sich ein Auflistungsstream, der die meisten ips aufnimmt und an den Startort zieht. Sobald sie die Startposition (oben links) erreicht haben, werden sie mit einer Schleife bereinigt, die alle Werte auf dem Stapel entfernt. Dann drehen Sie die Sicherheit, indem Sie die Schnur drücken und verlassen. (Sicherheit ist ein einzigartiges Konzept für Lost. Jedes Programm muss
%
vor dem Beenden einen Treffer erzielen. Dies verhindert, dass das Programm beim Start beendet wird.) Nun wäre meine Idee, diese Form zu einer vollwertigen Quine zu erweitern.Als erstes musste die Schleife ein wenig überarbeitet werden, die vorhandene Schleife war spezifisch für das String-Format.
Wir müssen einen zweiten Stream hinzufügen, um die Möglichkeit zu vermeiden,
!
über den Stream zu springen und eine Schleife zu erstellen.Jetzt wollen wir dies mit dem Standard-Quine-Format mischen. Da Lost sehr auf Klein basiert, habe ich mir im
Grunde genommendas Klien Quine für Martin Ender geliehen .Dies druckt ganz bequem die erste Zeile des Quines. Jetzt müssen wir nur noch die Streams hart codieren. Das ist leichter gesagt als getan. Ich habe ungefähr vier verschiedene Methoden ausprobiert. Ich beschreibe nur die, die funktioniert hat.
Die Idee hier ist, Türen zu verwenden, um die gewünschte Anzahl von Pfeilen zu erhalten. Eine Tür ist eine spezielle Art von Spiegel, die sich bei jedem Treffer ändert.
[
reflektiert ips von links und]
von rechts. Wenn sie von einer IP von einer dieser Seiten getroffen werden, wechselt die Ausrichtung. Wir können eine Reihe dieser Türen und einen statischen Reflektor herstellen, um eine Operation wiederholt durchzuführen.Wird
:
dreimal auftreten. Auf diese Weise<
können wir eine Menge von ihnen mit weniger Bytes erstellen , wenn wir a vor der Hand auf den Stapel schieben . Wir machen 2 davon, eine für jede Zeile, und dazwischen legen wir eine neue Zeile ab, die zweite muss jedoch nur so lange bestehen, bis sie die von!
uns hinzugefügte abdeckt. Alles andere kann leer bleiben und uns ein paar Bytes ersparen. Ok, jetzt müssen wir die vertikalen Pfeile zu unseren Streams hinzufügen. Hier kommt die Schlüsseloptimierung ins Spiel. Anstatt alle IPS direkt zum "Start" des Programms umzuleiten, leiten wir sie stattdessen nach ganz links um, da wir bereits wissen, dass die IPS ganz links beginnen müssenArbeit (oder wird zumindest in der endgültigen Version funktionieren) können wir auch nur die anderen IPS umleiten. Dies macht es nicht nur in Bytes billiger, ich denke, diese Optimierung macht das Quine möglich.Es gibt jedoch immer noch einige Probleme. Das wichtigste ist, dass ips nach dem Push startet,
>
aber bevor wir anfangen, Kopien davon zu machen. Solche ips werden in den Kopierer eingegeben und machen eine Reihe von Kopien von 0. Dies ist schlecht, da unser Stapellöschmechanismus Nullen verwendet, um den Boden des Stapels zu bestimmen, wobei eine ganze Reihe von Nullen am Boden verbleibt. Wir müssen eine stärkere Stack-Hygienemethode hinzufügen. Da es keine echte Möglichkeit gibt, festzustellen, ob der Stapel leer ist, müssen wir einfach versuchen, so viele Gegenstände wie möglich auf dem Stapel zu zerstören. Hier verwenden wir wieder die zuvor beschriebene Türmethode. Wir werden((((((((((([[[[[[[[[[[[[[
das Ende der ersten Zeile direkt nach dem Desinfektionsprogramm hinzufügen, um die Nullen zu entfernen.Jetzt gibt es noch ein weiteres Problem, da wir unsere Streams von oben nach links ips umgeleitet haben
%
und das Herunterfahren bereits die Sicherheit deaktiviert hat und vorzeitig beendet wird. Also müssen wir die Sicherheit ausschalten. Dazu fügen wir#
dem Stream ein hinzu. Auf diese Weise werden die durch den Stream fließenden IP-Adressen deaktiviert, die bereits bereinigten IP-Adressen jedoch nicht. Das#
muss auch in der ersten Zeile fest programmiert sein.Hoffentlich verstehen Sie jetzt, wie das funktioniert.
quelle
Ja ,
1165879606561540522498 + 7 = 505 BytesBenötigt das
-cheat
Flag, um die Definition von Aliasen zu ermöglichen.Probieren Sie es online!
Erläuterung
Dazu gibt es zwei Teile (wie bei den meisten Quines). Die Daten:
Und der Decoder:
Die Daten sind lediglich eine binäre Codierung des Decoders (oder vielmehr dessen Umkehrung). Jeder
0
startet ein neues Zeichen und das1
s und2
s sind die0
- und1
-bits.Beachten Sie, dass dies
0
ein Standard-Yup-Befehl ist, der eine Null drückt, während1
und2
an dieser Stelle nicht definiert sind. Wir weisen dem Befehl jedoch den gesamten Datenteil zu,%
so dass das1
und2
undefiniert bleiben kann, bis%
es tatsächlich verwendet wird.Als nächstes definieren wir einige weitere Befehle:
<
dekrementiert den oberen Bereich des Stapels und>
inkrementiert ihn.1
(etwas unintuitiv) verdoppelt die Oberseite des Stapels.2
verdoppelt es und erhöht es dann. Dank dieser Definitionen belässt so etwas0221111
tatsächlich eine 48 (110000 in binär) auf dem Stapel.Die verbleibenden 32 Bytes führen die eigentliche Dekodierung in zwei Teilen durch. Zuerst müssen wir den Datenstring rekonstruieren.
Zum Schluss geben wir die Daten erneut aus und geben jeden Wert als Zeichen aus:
Zum späteren Nachschlagen finden Sie hier ein CJam-Skript zum Codieren der Daten.
quelle
Fueue , 423 Bytes
Fueue ist ein Warteschlangen-esolang in dem das laufende Programm ist die Warteschlange.
Probieren Sie es online!
Wie es funktioniert
Diese Erklärung
mag aus demRudergelaufen sein oder auch nicht. Andererseits weiß ich nicht, wie ich es viel kürzer erklären soll, so wie ich hoffe, dass die Leute dem folgen können.Fueue Spickzettel
Siehe esolang Wiki - Artikel für Details, einschließlich der wenigen Funktionen , die nicht in diesem Programm verwendet.
Das Anfangsprogramm ist der Anfangszustand der Warteschlange, der die folgenden Elemente enthalten kann:
+*/-%
: ganzzahlige Arithmetik (-
ist unär,%
logische Negation). Inert, wenn keine Zahlenargumente angegeben wurden.()<
: Element in Klammern setzen, Klammern vom Block entfernen, letztes Element zum Block hinzufügen. Die beiden letzteren sind inert, sofern kein Block folgt.~:
: tauschen, duplizieren.$
: copy (nimmt Nummer + Element). Inert vor Nichtzahl.H
: Programm anhalten.Beachten Sie, dass dies beim
[]
Verschachteln()
nicht der Fall ist - letztere sind einfach separate Funktionen.Ausführungsablaufverfolgungssyntax
Whitespace ist in Fueue optional, außer zwischen Ziffern. In den folgenden Ausführungs-Traces wird insbesondere die Programmstruktur vorgeschlagen:
Geschweifte Klammern
{}
(in Fueue nicht verwendet) werden in den Traces verwendet, um das ganzzahlige Ergebnis mathematischer Ausdrücke darzustellen. Dies schließt negative Zahlen ein, da Fueue nur nicht negative Literale hat --
ist die Negationsfunktion.Verschiedene metavariable Namen und
...
werden zur Bezeichnung von Werten und Abkürzungen verwendet.Verzögerungstaktik
Intuitiv durchläuft die Ausführung die Warteschlange und ändert teilweise, was sie durchläuft. Die Ergebnisse einer Funktion können erst im nächsten Zyklus erneut bearbeitet werden. Verschiedene Teile des Programms entwickeln sich effektiv parallel, solange sie nicht interagieren.
Infolgedessen ist ein Großteil des Codes der Synchronisation gewidmet, insbesondere der Verzögerung der Ausführung von Teilen des Programms bis zum richtigen Zeitpunkt. Es gibt viele Möglichkeiten, um Golf zu spielen, was dazu führt, dass Teile zu unlesbaren Blobs werden, die nur durch zyklisches Nachverfolgen ihrer Ausführung verstanden werden können.
Diese Taktiken werden im Folgenden nicht immer einzeln erwähnt:
)[A]
VerzögerungenA
für einen Zyklus. (Wahrscheinlich die einfachste und am besten lesbare Methode.)~ef
tauscht die Elemente ause
undf
verzögert damit auch deren Ausführung. (Wahrscheinlich die am wenigsten lesbare, bei geringfügigen Verzögerungen jedoch häufig die kürzeste.)$1e
verzögert ein einzelnes Elemente
.-
und%
sind nützlich zum Verzögern von Zahlen (letztere für0
und1
.):
oder$
sie aus einem einzigen erstellen möchten.(n
Umwicklungenn
in Klammern, die später nach Belieben entfernt werden können. Dies ist besonders wichtig für numerische Berechnungen, da Zahlen zu instabil sind, um überhaupt kopiert zu werden, ohne sie zuerst in einen Block zu setzen.Gesamtstruktur
Der Rest der Erklärung ist in sieben Teile unterteilt, die sich jeweils auf einen Abschnitt des laufenden Programms beziehen. Die größeren Zyklen, nach denen sich die meisten von ihnen wiederholen, werden als "Iterationen" bezeichnet, um sie von den "Zyklen" einzelner Durchläufe durch die gesamte Warteschlange zu unterscheiden.
So teilt sich das ursprüngliche Programm auf:
Die große Zahl am Ende des Programms codiert den Rest in umgekehrter Reihenfolge, zwei Ziffern pro Zeichen, wobei 30 von jedem ASCII-Wert abgezogen werden (also z . B.
10
a(
.).Auf einer höheren Ebene können Sie sich die Daten in diesem Programm (beginnend mit dem Bignum) als von rechts nach links fließend vorstellen, die Steuerung jedoch als von links nach rechts fließend. Auf einer niedrigeren Ebene verwirrt Fueue jedoch ständig die Unterscheidung zwischen Code und Daten.
0
als Ganzzahl48
), wobei die niedrigstwertigen Ziffern zuerst abgespalten werden. Alle 15 Zyklen wird eine Ziffer ausgegeben.[x[y]]
und auch die codierten Zeichen jedes Paares gedruckt.[x[y]]
Blöcken so aufgebaut wird, dass alle Ziffern gedruckt und anschließend das gesamte Programm angehalten werden können.Abschnitt a
Abschnitt A behandelt die Planung des Programmendes. Es dauert 4258 Zyklen, um sich auf eine einzige Swap-Funktion zu reduzieren
~
, die dann eine Anpassung an Abschnitt B vornimmt, der seine Hauptschleife stoppt und stattdessen Abschnitt D ausführt.$
Funktion erstellt 4255 Kopien der folgenden Elemente,%
während(
die~
in eckigen Klammern eingeschlossen sind.%
verwendet, um die folgende Zahl zwischen0
und umzuschalten1
.%
s aufgebraucht sind,$1
wird 1 Kopie der[~]
(effektiv eine NOP) erstellt, und beim nächsten Zyklus werden)
die Klammern entfernt.Abschnitt b
In Abschnitt B wird sowohl die Selbstregenerierung als auch eine neue Iteration von Abschnitt C alle 30 Zyklen durchgeführt.
:
dupliziert den folgenden großen Block (eine Kopie wird als abgekürzt[BkB]
) und)
entfernt dann die Klammern von der ersten Kopie.$$24%%0
legt einen Countdown an, der dem in Abschnitt A ähnelt.:<
wird es zu<<
einem und~
tauscht zwei der Blöcke aus, wobei der Code für einen neuen Abschnitt C zuletzt platziert wird.<
Funktionen packen die beiden letzten Blöcke in den ersten - dies ist in normalen Iterationen überflüssig, ermöglicht jedoch, dass der~
Ab-Abschnitt A am Ende seine Arbeit erledigt.)
die äußeren Klammern entfernt. Next~:)
wird zu):
und~)
tauscht a)
an den Anfang des Abschnitts C-Codes.)
gerade dabei ist, die Klammern zu entfernen, um eine neue Iteration von Abschnitt C auszuführen.In der letzten Iteration erscheint
~
ab Abschnitt A unter Punkt (1) oben:Die
~
vertauscht den)
Block in Abschnitt C, wodurch verhindert wird, dass Abschnitt B erneut ausgeführt wird.Abschnitt C
In Abschnitt C werden neue Ziffernpaare in den Block von Abschnitt D eingefügt und neue Iterationen von Abschnitt E erstellt.
Das Folgende zeigt eine typische Iteration mit
x
und diey
Darstellung der ASCII-Codes der Ziffern. In der allerersten Iteration sind die eingehenden "D" - und "E" -Elemente die ersten[H]
und-
stattdessen, da kein vorheriger Abschnitt E ausgeführt wurde, um Ziffernzeichenpaare zu erzeugen.~
in einer Reihe haben, wird die Reihe in jedem Zyklus auf ungefähr 2/3 verkleinert (da einer~
zwei aufeinanderfolgende tauscht), aber gelegentlich mit einem Rest von~
s, dasVerwüstungen anrichtet,manipuliert sorgfältig das Folgende.$11~
erzeugt eine solche Reihe. Der nächste~
tauscht a<
über den folgenden Block. Ein anderer<
fügt am Ende einen neuen Ziffernpaarblock (Ziffern x und y als ASCII-Codes) in den Abschnitt D-Block ein.~
Zeile einen~~
Rest, der a~
über Folgendes vertauscht)
. Der andere<
fügt Abschnitt D an einen[)))~]
Block an.~
tauscht der Swap selbst den folgenden Block mit neuem Abschnitt-E-Code über den Abschnitt-D-Block. Dann~
tauscht ein neuer Rest ein)
Kreuz aus, und schließlich tauscht der letzte~~
in der~
Reihe eines von ihnen in Abschnitt E aus, gerade als der)
seine Klammern entfernt hat.In der letzten Iteration haben die Abschnitte A die Abschnitte B und C
~
vertauscht.)
Abschnitt C ist jedoch so kurzlebig, dass er bereits verschwunden ist und)
am Anfang von Abschnitt D endet.Abschnitt D
In Abschnitt D wird die letzte große Zahl gedruckt und das Programm angehalten. Während des größten Teils des Programmablaufs handelt es sich um einen inerten Block, in dem die Abschnitte B – G beim Bauen zusammenarbeiten.
(
die HaltefunktionH
in eckige Klammern gesetzt. A-
folgt, es wird als Dummy-Element für die erste Iteration anstelle eines Ziffernpaares verwendet.[49[49]]
, entspricht dem Finale11
in der Ziffer.[49[48]]
(entsprechend dem10
am Anfang der Nummer) nicht tatsächlich in den Block eingearbeitet, aber dies macht keinen Unterschied , wie)[A[B]]
und)[A][B]
äquivalent ist, in beiden DrehA[B]
.Nach der letzten Iteration kommt der
)
von Abschnitt B nach rechts getauschte Block an und der Block von Abschnitt D wird entsperrt. Am)))~
Anfang jedes Unterblocks wird sichergestellt, dass alle Teile in der richtigen Reihenfolge ausgeführt werden. Schließlich enthält der innerste Block einH
Anhalten des Programms.Abschnitt E
Abschnitt E behandelt das Kombinieren von ASCII-Ziffernpaaren, die von Abschnitt G erzeugt wurden, und beide drucken das entsprechende codierte Zeichen und senden einen Block mit dem kombinierten Paar nach links an die Abschnitte C und D.
Wiederum zeigt das Folgende eine typische Iteration mit
x
undy
Darstellung der ASCII-Codes der Ziffern.10*x+y-498
den ASCII-Wert des codierten Zeichens zu berechnen .498 = 10*48+48-30
, Die48
rückgängig gemacht werden s die ASCII - Kodierungx
undy
während der30
Verschiebungen der Codierung von00–99
zu30–129
, die alle druckbaren ASCII enthält.Abschnitt F
Abschnitt F besteht aus inerten Blöcken, die ASCII-Zifferncodes enthalten. Für den größten Teil des Programmablaufs gibt es hier höchstens zwei, da Abschnitt E sie mit derselben Geschwindigkeit verbraucht, mit der G sie erzeugt. In der letzten Druckphase
0
sammeln sich hier jedoch einige redundante Ziffern.Abschnitt G
Abschnitt G behandelt das Aufteilen der großen Zahl am Ende des Programms, wobei die niedrigstwertigen Ziffern zuerst angezeigt werden, und das Senden von Blöcken mit ihren ASCII-Codes nach links an die anderen Abschnitte.
Da es keine Unterbrechungsprüfung gibt, werden tatsächlich weiterhin
0
Ziffern erzeugt, wenn die Zahl auf 0 gesunken ist, bis Abschnitt D das gesamte Programm mit derH
Funktion anhält .[BkG]
Kürzt eine Kopie des großen Startcode-Blocks ab, der zur Selbstreplikation verwendet wird, um neue Iterationen zu starten.Initialisierung in den ersten Zyklen:
Typische Iteration,
N
bezeichnet die zu teilende Zahl:+:5
statt--10
eine Verzögerung10
zwei Zyklen. Leider wurde nur einer der10
s im Programm dadurch geholfen.[N]
und[BkG]
werden dupliziert, dann wird eine Kopie vonN
durch geteilt10
.[{N/10}]
dupliziert wird, werden mehr arithmetische Funktionen verwendet, um den ASCII-Code der letzten Ziffer vonN
as zu berechnen48+((-10)*(N/10)+N)
. Der Block mit diesem ASCII-Code bleibt für Abschnitt F übrig.[{N/10}]
wird zwischen den[BkG]
Blöcken ausgetauscht , um den Start einer neuen Iteration einzurichten.Bonus Quine (540 Bytes)
Probieren Sie es online!
Da ich mir nicht sicher war, welche Methode am kürzesten ist, habe ich zuerst versucht, Zeichen als zweistellige Zahlen zu codieren, die durch
(
s getrennt sind . Der Kerncode ist etwas kürzer, aber die 50% größere Datendarstellung macht das wieder wett. Nicht so golfen wie der andere, da ich aufhörte, als mir klar wurde, dass es nicht besser werden würde. Es hat einen Vorteil: Es erfordert keine Implementierung mit Bignum-Unterstützung.Die Gesamtstruktur ist der Hauptstruktur etwas ähnlich. Abschnitt G fehlt, da die Datendarstellung Abschnitt F direkt ausfüllt. Abschnitt E muss jedoch eine ähnliche Divmod-Berechnung durchführen, um die Ziffern der zweistelligen Zahlen zu rekonstruieren.
quelle
)$n[)](
ist ein Byte kürzer für den Verzögerungszähler.Gelee, 3 Bytes
Probieren Sie es online!
Nachprüfung
Wie es funktioniert
quelle
LANG=en_US
gelingt genau das. tio.run/nexus/bash#@@/…