Ihre Aufgabe ist es, ein Programm zu erstellen, das sich beim Ausführen selbst als Ausgabe ausgibt (dies wird als Quine bezeichnet). Dieses Quine muss jedoch, wenn es n
mal kopiert wird, das Quine zurückgeben, wobei jedoch jedes seiner Zeichen in Ortszeiten dupliziert n
wird, wobei n
es sich um eine positive Ganzzahl handelt.
Wenn Ihr ursprüngliches Programm ist Derp
:
Derp -> Derp (must return itself as output to be a quine)
DerpDerp -> DDeerrpp
(the "Derp" is copied twice, so each character in the output has to be copied twice)
DerpDerpDerp -> DDDeeerrrppp
etc. etc.
Denken Sie daran, dass Sie in Ihrem "Basis" -Programm Leerzeichen verwenden dürfen, diese werden jedoch beim "Verweben" berücksichtigt. Sagen Sie, Ihr Programm ist
Derp
{newline}
(Die neue Zeile steht für eine abschließende neue Zeile und nach der steht ein zusätzliches Leerzeichen Derp
.) Beim duplizieren werden
Derp
Derp
{newline}
Sie müssen ausgeben
DDeerrpp
{newline}
{newline}
Denken Sie daran, dass 2
nach dem ein zusätzliches Leerzeichen eingefügt wird DDeerrpp
.
Regeln und Spezifikationen:
- Ihr Programm muss mindestens zwei verschiedene Zeichen enthalten (dies bedeutet, dass Ihr Code mindestens 2 Byte lang sein muss).
- Es gelten die üblichen Regeln für Quine .
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
quelle
Antworten:
Spaltung , 6 Bytes
Probieren Sie es online! Versuchen Sie es mit zwei Kopien! Versuchen Sie es mit drei!
Erläuterung
Dies ist nur die Fission Standard-Quine . Es funktioniert für diese Herausforderung, weil Fission explizite Einstiegspunkte in das Programm hat. Insbesondere fügen wir durch Duplizieren des Programms ein weiteres hinzu
R
hinzu, das ein weiteres Atom (Anweisungszeiger) hinzufügt. Da der Quellcode toroidal ist, ändert sich der ausgeführte effektive Code nicht anders - für jedes Atom sieht der Code lokal immer noch gleich aus. Die Atome werden jedoch im Lock-Schritt ausgeführt, sodass die von ihnen gedruckten Objekte verschachtelt werden und wir eine zusätzliche Kopie jedes Zeichens in der Ausgabe erhalten.Der Vollständigkeit halber werde ich nur kurz wiederholen, wie das Programm selbst funktioniert. Unabhängig davon, ob wir das Programm wiederholen oder nicht (zB
'!+OR"'!+OR"'!+OR"
), sieht jedes Atom den folgenden Code:Der
"
String-Druckmodus wird'!+OR
umgeschaltet , so dass das Programm mit dem direkten Drucken zu STDOUT beginnt , das bis auf das Anführungszeichen alles Quine ist. Dann'!
setzt die Masse des Atoms mit dem Zeichencode!
,+
Inkrementen es, die gibt"
, undO
es druckt , während gleichzeitig das Atom zu zerstören. Das Programm wird dann beendet, da keine Atome mehr vorhanden sind.quelle
Python 2.7,
377310304194191 Bytes!Dies ist mein erstes Golf, also habe ich nicht erwartet, dass es zu gut wird. Aber ich fand das Konzept in der Lösung, die ich mir ausgedacht habe, etwas witzig, also poste ich es trotzdem.
In der Tat ist dies ein Quin; Sie können es hier versuchen . Es missbraucht das Inspect-Modul ziemlich stark.
Wenn wir versuchen, es mit demselben Quellcode x2 auszuführen, erhalten wir auch die richtige Ausgabe. das kannst du hier probieren . x3, x4 usw. funktionieren alle wie erwartet.
Ungolfed mit Erklärung:
quelle
inspect
? (siehe entsprechenden Metapost ). In PPCG haben wir spezifische Definitionen, was eine Quine gültig macht, und das 'Lesen der Quelle' wird normalerweise als Betrug angesehen.import threading,inspect as i
can beimport threading as T,inspect as i
CJam , 19 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
RProgN , 66 Bytes
Bedeutendes Leerzeichen ist der Tod von mir
Erklärt
Guter Herr, ich bin ein Monster ...
Probieren Sie es online!
quelle
~["[%q]F01+`0=`.{0m}R"]F01+`0=`.{0m}R
im Allgemeinen gut funktioniert, ist es auch keine gültige Lösung, da es keine Möglichkeit gibt, den ZSS-Marker zu replizieren.Perl 5, 107 Bytes
Ungolfed:
Probieren Sie es online!
quelle
Python 3 ,
122121112 BytesProbieren Sie es online aus: eine Kopie | zwei Exemplare | drei Exemplare | vier Exemplare mit automatischer Überprüfung
Wie es funktioniert
Dies verwendet das Standard-Python-Quine: Speichern Sie den Code, den Sie ausführen möchten, in einer Variablen (als Zeichenfolge); Fügen Sie eine Logik in diese Zeichenfolge ein, um sich selbst, alles davor und alles danach zu drucken. Führen Sie dann diese Zeichenfolge aus.
Der Code, der über die Zeichenfolge s ausgeführt wird, ist der folgende.
Die erste Zeile importiert bedingungslos das atexit- Modul , mit dem wir einen Exit-Handler registrieren können. Der Versuch, dasselbe Modul mehrmals zu importieren, hat keinerlei Auswirkungen auf das Skript. Dann wird versucht, die Variable n zu inkrementieren , um zu verfolgen, wie viele Kopien des Quellcodes ausgeführt wurden.
Die zweite Zeile wird nur ausgeführt, wenn die erste einen Fehler enthält. Dies wird in der ersten Iteration der Fall sein, da n immer noch undefiniert ist. In diesem Fall initialisieren wir n als 1 und registrieren ein Lambda, das die eigentliche Magie ausführt.
Der registrierte Exit-Handler
wird kurz vor Programmende aufgerufen. Das Lambda selbst erzeugt die String
"s=%r;exec(s);"%s
-%r
erzeugt eine String - Darstellung des rechten Arguments ( s ), die alles zwischen den einfachen Anführungszeichen und den Anführungszeichen selbst enthält - dann seine Zeichen iteriert. Für jedes Zeichen c drucken wir einfach n Kopien von c . Passingc*n
als benanntes Argumentend
anprint
Mitteln , die kein Zeilenvorschub angehängt wird.quelle
CJam , 14 Bytes
Probieren Sie es online!
Erklärungen
quelle