oder: Bauen Sie eine vertikale Quine
Inspiriert von Stell dich gegen lange Schlangen .
Ihre Aufgabe ist es, eine vertikale Quine mit einer möglichst kurzen Linienlänge zu erstellen.
Wertung
Die kürzeste Linienlänge (ohne Newlines) gewinnt mit Code-Golf- Kriterien als Tie-Breaker.
Die Zeilenlänge wird als die längste Zeile in Ihrem Programm mit Ausnahme des Zeilenumbruchzeichens bestimmt.
Beispielsweise:
$_=
Q.
P
hat eine Zeilenlänge von 3 und eine Byteanzahl von 8, während:
Q
$
_
P
Hat eine Zeilenlänge von 1 und eine Byteanzahl von 7 (vorausgesetzt, keine nachgestellte Zeile).
Regeln
Quines müssen der Community-Definition eines Quines entsprechen .
Standardlücken sind verboten.
code-challenge
quine
source-layout
Dom Hastings
quelle
quelle
Antworten:
Sprache , Zeilenlänge 0, 1,01 × 10 805 Bytes
Der Quellcode besteht aus
Zeilenumbrüche, die das folgende Brainfuck-Programm codieren.
Der Quellcode ist weitgehend identisch zu @ jimmy23013 Strahlungs erweichten Lenguage quine , abzüglich der
.
am Ende mit++++++++++.[-]
ersetzen.
1 Zeilenvorschübe anstelle von null Bytes, und die entsprechenden Änderungen an den Daten Schnitt entlang der Linie zu drucken.quelle
"about 1.75*10**76 yottabytes in ASCII"
]++++++++ ++.-->
JavaScript, Zeilenlänge 1,
960956928 BytesLesbarere Version, die auch eine Quine ist (überflüssige Zeilenumbrüche entfernt):
Erläuterung
Wütend. Machen Sie es sich hier gemütlich, denn das wird eine verräterische Reise ...
Ich habe lange versucht, herauszufinden, wie diese Herausforderung mit Länge 1 gelöst werden kann - ohne eingebaute (direkt), Schlüsselwörter oder sogar Pfeilfunktionen -, bevor mir klar wurde, dass dies mit JSF *** problemlos möglich ist Bewerten Sie jeden JavaScript-Code und vermeiden Sie Multibyte-Token. Aber eine JSF-Lösung wäre leicht Tausende von Bytes lang, wenn nicht Zehntausende oder Hunderttausende. Zum Glück sind wir nicht nur darauf beschränkt - wir
()[]+!
verfügen über alle ASCII-Funktionen!Ich beschloss, zunächst die wesentlichen Bausteine von JSF zu spielen - die Charaktere, die zu Strings zusammengesetzt werden können, um sozusagen "mehr Funktionen freizuschalten". Wir können Zeichenfolgen nicht direkt zum Abrufen von Zeichen verwenden, da dies Zeilen mit der Länge 3 erfordern würde. Stattdessen stehlen wir JSF einen Trick und erhalten ein paar Zeichen aus Literalen, die mit Einzelbyte-Token erstellt werden können:
Von diesen können wir nach außen expandieren, beginnend mit
[].find
, welches ein Funktionsobjekt ist. Umwandlung in einen Stringfunction find() { ...
gibt uns Zugriff aufc
, eino
Raum (_
) und Klammern (y
undz
). Vielleicht noch wichtiger ist, dass wir jetzt Zugriff aufconstructor
dieFunction
Funktion haben, die uns, so ungewöhnlich sie auch klingt, die Möglichkeit gibt, Code auszuführen, indem wir eine Zeichenfolge erstellen, an diese übergebenFunction()
und dann die generierte Funktion aufrufen.Ich sollte wahrscheinlich die vom Programm selbst verwendete Gesamtmethode erwähnen. Seit 2015 hat JavaScript diese wirklich coole Funktion namens " Tagged Templates ", die nicht nur Zeilenumbrüche in Zeichenfolgen zulässt, sondern auch den direkten Aufruf einer Funktion mit einem Zeichenfolgenliteral ermöglicht (in gewisser Weise
myFunc`abc`;
entspricht dies in etwamyFunc(["abc"])
). Wenn wir den Funktionsaufruf als letztes in das Programm aufnehmen, sieht die allgemeine Struktur so aus:Alles
func
, was Sie dann tun müssen, ist die Ausgabe des Arguments, gefolgt von einem Backtick, dann erneutem Argument und einem zweiten Backtick. Angenommen, wir haben das Argument ina
und ein Backtick in gespeichertf
, können wir dies mit dem Code erreichenalert(a+f+a+f)
. Im Moment fehlen uns jedoch+
und das Backtick selbst.+
(gespeichert inP
) ist nicht schwer; Wir stehlen JSF einen weiteren Trick, bauen den String auf1e23
, wandeln ihn in eine Zahl um und geben dann wieder einen String"1e+23"
.Einen Backtick zu bekommen ist etwas komplizierter. Zuerst versuchte ich es
String.fromCharCode
, aber esC
stellte sich heraus, dass es fast genauso schwierig war , eine zu finden. Glücklicherweiseatob
ist es einfach genug zu bekommen (Function("return atob")()
;b
wird generiert aus0+{}
, was gibt[object Object]
) und kann jedes ASCII-Zeichen geben, wenn eine richtige magische Zeichenfolge gefunden wird. Ein kurzes Skript gab mir12A
als eine der Optionen an, die bequem in zu finden sind12Array
(etwas kürzer zu generieren, dank[].constructor[n+a+m+e]
;m
ist in zu finden0 .constructor+0
:)"function Number() { ..."
.Zum Schluss halten wir alles zusammen. Wir weisen den Backtick der Variablen zu
f
, aber da wir ihn nicht direkt in der Funktionszeichenfolge verwenden können, setzen wir die Variable stattdessenq
auf den Buchstabenf
und verwenden sie stattdessen. Dies macht unsere letzte Saitea+l+e+r+t+y+a+P+q+P+a+P+q+z
, oder"alert(a+f+a+f)"
. Wir geben dies dann anFunction()
, geben den fertigen Code an das Ergebnis weiter und voila, wir haben eine JavaScript-Quine mit nicht mehr als einem Zeichen pro Zeile!Mein Kopf fühlt sich im Moment schrecklich an. Bitte erkundigen Sie sich nach Fehlern oder Dingen, die ich in dieser Erklärung übersehen habe, und ich melde mich bei Ihnen, nachdem ich mich etwas ausgeruht habe ...
quelle
f=
Zeile.f
verschlungene Methode , einen einzelnen Backtick festzulegen. Die Zeile selbst ist äquivalent zuf=atob("12Array")[1]
. Der andere Trick ist, dassq
tatsächlich der Buchstabef
in der ersten Zeile festgelegt wird, sodassF(...)
ich ihn in der Zeile verwenden kann, um den Buchstabenf
in die ausgewertete Zeichenfolge einzufügen, da die Variablef
nicht mehr auf diesen Buchstaben festgelegt ist. Dasa+l+e+r+t+y+a+P+q+P+a+P+q+z
ist gleichbedeutend mit"alert(a+f+a+f)"
.0+{}
und0[E]
stringify in Ordnung zu bringenb
undm
.Haskell , Zeilenlänge 6,
400343336 BytesProbieren Sie es online! Mir ist kein Umweg bekannt
putStr
, daher die Zeilenlänge von 6. Die äußeren geschweiften Klammern ermöglichen es, den anderen erforderlichen Einzug nach einer neuen Zeile innerhalb einer einzelnen Deklaration zu entfernen.quelle
> <> , 22 Bytes, Zeilenlänge 1
Probieren Sie es online!
-6 Bytes dank Emigna .
quelle
CJam , Zeilenlänge 1,
1613 BytesProbieren Sie es online!
Es ist ein kleines Wunder, dass das Einfügen von Zeilenumbrüchen in die
Standard-Quine undnoch kürzere Standard-Quine{"_~"}_~
"_p"␊_p
das Richtige bewirkt. (Danke, Martin!) Der abschließende Zeilenumbruch ist notwendig.Erklärung (mit • als Newline)
Beim Beenden wird gedruckt (
•_•p•
), was auf dem Stapel übrig bleibt , was die Gesamtausgabe ergibt"•_•p•"••_•p•
.quelle
Haskell + CPP, Zeilenlänge 2,
705237 BytesProbieren Sie es online! Flagge benutzen
-CPP
, das den C-Pre-Prozessor aktiviert, können Sie einen Backslash am Ende einer Zeile verwenden, um ihn in der nächsten Zeile fortzusetzen.Der eigentliche Code ist
main=putStr$(:"\\\n")=<<s++show s;s="<data>"
.Edit: Ein lässiges -468 Byte dank Ørjan Johansen !
quelle
main=putStr$(:"\\\n")=<<s++show s;s="<data>"
. Probieren Sie es online!Rust, Zeilenlänge: 5, Bytes:
301299Probieren Sie es online aus
Ungeachtet des Aussehens ist dies keine esoterische Programmiersprache, es gibt nur viel Zeilenrauschen im Format.
Vertikale Länge von 5 wurde gewählt, um verwenden zu können
print
. Ich glaube nicht, dass es einen Weg zum Drucken gibt, der eine kürzere vertikale Länge hätte, wenn man C-Funktionen alsextern
Schlüsselwort deklariert,stdout
6 Bytes langwrite
ist, 5 Bytes langno_main
ist, 7 Bytes lang ist (main ist normalerweise eine Funktion;)).quelle
cargo fmt
es hier helfen würde ...05AB1E , Zeilenlänge: 1, Byteanzahl : 43
Probieren Sie es online!
quelle
Japt , Zeilenlänge 1, 20 Bytes
Basierend auf dem Standard Japt Quine von ETHproductions .
Probieren Sie es hier aus!
quelle
JavaScript (ES6), Zeilenlänge 3, 17 Byte
quelle
Rot , Zeilenlänge: 10, 49 Bytes
Probieren Sie es online!
Dies ist in der Tat ein Rebol Quine
Erläuterung: Rot / Rebol
mold
folgt dem Codierungsstil, bei dem 4 Leerzeichen versetzt werden.quelle
RProgN , 3 Bytes, Zeilenlänge 1
Probieren Sie es online!
Eine Kopie von Dennis 'Antwort hier (go upvote er auch)
Dies entspricht unserer aktuellen Definition eines richtigen Quines, da die erste 0 die zweite 0 codiert und umgekehrt.
quelle
RProgN 2 , L = 1, B = 15 Bytes
Dies entspricht dem Programm:
Nervenzusammenbruch
«
Überträgt zuerst eine Funktion, die implizit den Rest des Programms darstellt, auf den Stapel und setzt dann die Ausführung fort.Ø.
Hängt eine leere Zeichenfolge an die Funktion an, wodurch sie stringiert wird. Dies wird sich immer wie das gleichberechtigte Programm verhalten, da die Zeilenumbrüche nicht ausgeführt werden.`\n-
Entfernt alle Zeilenumbrüche aus dem String, die jetzt so aussehen«Ø.`=S`.
.S
konvertiert es dann in einen Stapel einzelner Zeichen und`\n.
fügt den Stapel durch Zeilenumbrüche hinzu, wobei das erwartete Programm zurückgegeben wird.Probieren Sie es online!
quelle
Unterlast , Zeilenlänge 1, 20 Bytes
Probieren Sie es online!
Dies ist nur die Standard-Unterlast-Quine mit angehängten Zeilenumbrüchen. Erfordert eine Implementierung wie die TIO, die unbekannte Befehlszeichen ignoriert.
Das Teil in
()
ist ein String-Literal, das auf den Stapel gelegt,:
dupliziert,a
den obersten Stapeleintrag in Klammern eingeschlossen undS
gedruckt wird.quelle
Perl 5 , 259 Bytes
Probieren Sie es online!
Überprüfung .
quelle
Javascript (ES6 REPL), Vollprogramm, Zeilenlänge: 3, Byteanzahl: 31
Dies ist eine Portierung von @ kamoroso94s Antwort auf ein in sich geschlossenes vollständiges Programm.
Wenn jemand eine Möglichkeit findet, einige Bytes zu entfernen, ohne die Zeilenlänge zu erhöhen, kann er gerne einen Kommentar abgeben :)
quelle
Pip , Zeilenlänge 1, 35 Bytes
Probieren Sie es online!
Basierend auf dem kürzesten bekannten Pip Quine
V Y"`V Y`.RPy"
. Die Hauptschwierigkeit beim Quetschen auf Linienlänge 1 istRP
, dass diese nicht auf zwei Linien aufgeteilt werden kann. Aber in diesem Fall alleRP
(repr) tut, den String in doppelte Anführungszeichen zu setzen, was wir direkt tun können.Hier ist eine Erklärung basierend auf einer horizontalen Version:
quelle
Befunge-98 , 41 Bytes
Probieren Sie es online!
Wirklich nur ein normaler Quine, der seitwärts gedreht wurde, mit ein paar Extras zum Drucken von Zeilenumbrüchen.
quelle