Herausforderung
Erstellen Sie zwei Programme, A und B, die beide Katzenprogramme in derselben Sprache sind. In der Verkettung sollte AB (auch in derselben Sprache) ein Quine sein.
Angenommen, hello
und world
sind beide Katzen Programme in Sprache XYZ. Obhelloworld
eine Quine in dieser Sprache ist, dann ist Ihre Lösung gültig.
Für diejenigen unter Ihnen, die mit Katzen und Quines nicht vertraut sind, gibt ein Cat-Programm genau das aus, was ihm über stdin gegeben wurde, und ein Quine-Programm gibt seinen eigenen Quellcode aus.
Wertung und Regeln
- Die Gesamtbytezahl des verketteten AB-Programms ist Ihre Punktzahl. Da dies Codegolf ist, gewinnt die niedrigste Punktzahl.
- Standardlücken sind verboten
- Die Eingabe muss von stdin genommen werden und die Ausgabe muss auf stdout gehen.
- Die cat-Programme müssen keine Argumente entgegennehmen. Sie müssen nur stdin nach stdout kopieren.
- Das quine sollte funktionieren, wenn das Programm keine Eingabe erhält, aber für andere Eingaben nicht richtig funktionieren muss (aber möglicherweise).
- Das Quine muss nicht beendet werden, vorausgesetzt, es gibt genau seinen Quellcode einmal aus, nicht mehr.
- Das Quine muss mindestens ein Byte lang sein.
- A und B können dasselbe Programm sein.
- BA muss kein quines oder gar gültiges Programm sein.
AB
dies nicht leer sein darf, da viele Sprachen eine 0-Byte-Katze haben, die eine 0-Byte-Quine zulässt.Antworten:
V , 2 + 2 == 4 Bytes
Probieren Sie das Quine!
Probieren Sie die Katze!
A ist
2i
B ist auch
2i
Wie funktioniert es?
Zunächst einige Erklärungen zur Funktionsweise von V. Eine bemerkenswerte Sache, die diese Antwort ermöglicht, ist, dass in V das leere Programm ist eine Katze Programm. Dies ist kein Sonderfall, sondern hängt mit der Funktionsweise von V zusammen. Beim Start werden alle Eingaben in einen "Puffer" geladen, jeder Befehl ändert den Puffer auf irgendeine Weise, und wenn das Programm abgeschlossen ist, wird der Puffer implizit gedruckt. Dies bedeutet, dass jede Folge von NOPs auch ein Katzenprogramm ist.
Der
i
Befehl bedeutet, dass Sie in den Einfügemodus wechseln . Dies bedeutet, dass jedes Zeichen, das auf eini
folgt, in den Puffer eingefügt wird. Mit einer vorangestellten Zahl wird dieser Text n- mal dupliziert .Dies bedeutet, dass für das cat-Programm nichts zum Puffer hinzugefügt und gedruckt wird, während es gelesen wurde. Mit anderen Worten:
Aber für das Quine gibt es Text nach dem
i
:Freche Nichtantwort
V , 0 Bytes
Probieren Sie es online!
A ist das leere Programm.
B ist auch das leere Programm.
: P
quelle
Ruby, 71 Bytes
Kann wie folgt in Katzen aufgeteilt werden:
und
Die beiden Katzen sind identisch, mit Ausnahme der führenden 2, die in allen drei Programmen ein No-Op ist. Das
<<2
ist ein Herestring, was bedeutet, dass alles, was in der nächsten Zeile beginnt, bis zu einer abschließenden 2 in einer eigenen Zeile, eine Zeichenfolge ist, die wir mit sich selbst verketten (*2
) und eine abschließende 2 anfügen. Bei den Katzen ist der Herestring gut geformt, aber leer.$<.read
Daher stimmt der reguläre Ausdruck nicht mit ihm überein, und wir gehen zum Ausdruck über und geben STDOUT aus. Sobald wir die Katzen ansprechen, endet die Zeichenfolge jedoch erst in der dritten Zeile. Der reguläre Ausdruck stimmt also überein, und wir schließen die Quine kurz und geben sie aus.quelle
Pyth,
29 Bytes (5 + 24)27 Bytes (5 + 22)Das hat Spaß gemacht.
Versuchen Sie das Quine hier
Versuchen Sie die erste Katze hier
Versuchen Sie die zweite Katze hier
Erklärungen
quelle
C # (Visual C # -Compiler) , 551 Byte
A: 95 Bytes
Probieren Sie es online!
B: 438 + 18 Bytes
Probieren Sie es online!
A + B: 533 + 18 Bytes
Probieren Sie es online!
A und B nehmen Eingaben als Befehlszeilenargument entgegen. A + B ignoriert alle Eingaben. 18 Bytes auf B und A + B werden für die hinzugefügt
/p:StartupObject=B
an MSBuild gesendete Option werden . Es ist nur für A + B unbedingt erforderlich, aber es schien zu schummeln, es nicht auch in B zu haben. Auf diese Weise sind die Compiler-Flags für A + B die Compiler-Flags für A (keine) plus die Compiler-Flags für B.Erläuterung
Programm A ist unkompliziert. Klasse A enthält eine (nicht verwendete) statische Variable, die mit
i
initialisiert wurde2
, und gibt ihr erstes Argument aus, wenn sie ausgeführt wird. Das//
am Ende ist wichtig für den A + B-Code, tut aber nichts in A selbst.Programm B ist für sich genommen seltsam, aber im Wesentlichen dasselbe. Es erstellt eine Klasse A, die eine statische Variable enthält, die mit
i
initialisiert wurde0
, und führt dann die Main-Methode der Klasse B aus, die dasselbe wie Program A because ausführtA.i
kleiner als 1 ist, und vor den seltsamen Elementen zurückgibt. Die Zeilenumbrüche sind hier nicht notwendig, aber wichtig für A + B.In Kombination
//
kommentiert das von Programm A die Klasse-A-Deklaration von Programm B aus, aber wegen des Zeilenumbruchs ist Klasse B in Ordnung, sodass stattdessenA.i
auf den2
Wert von Programm A verwiesen werden kann. Das Compiler-Flag veranlasst das Programm, B.Main () auszuführen, da A.Main () ebenfalls vorhanden ist. Das Ergebnis ist, dass Programm A + B sein Argument nicht ausgibt, sondern stattdessen zum folgenden Segment von B.Main () geht, das im Grunde nur das Standard-C # -Quine ist .quelle
Haskell , 116 + 20 =
187175174136 BytesEin paar Bytes wurden gespeichert, seit Ørjan Johansen es mir gezeigt hat
interact
Katze 1
Probieren Sie es online!
Katze 2
Probieren Sie es online!
Quine
Probieren Sie es online!
Das Grundprinzip bei der Arbeit besteht darin, dass wir den Namen der Funktion, mit der wir interagieren, von
a
nach ändern, wenn wir die zweite Katze zur ersten hinzufügenidmain
. Dainteract id
es sich um eine Katze handelt, möchten wiridmain
mir eine Funktion geben, die eine Quine zurückgibt. Die naheliegende Lösung wäre jedoch zu verwendenconst
, da wir davon ausgehen können, dass die Eingabe auch leer ist(++)
. Von hier aus finden wir den Quellcode auf ziemlich standardmäßige Weise, wir haben eine Variableg
, die den Quellcode codiert, und wir verwenden einen speziellen Wrapper, um ihn in String- und Code-Form zu drucken. Es gibt eine kleine Ausnahme, bei der wir unseren Encoder in den Vordergrund stellen müssen, da wir bereits mit enden müsseninteract id
. Dies bedeutet ein Extrag=
wird nicht verschlüsselt und muss manuell gehandhabt werden. Unsere nächste Katze ist ein ziemlicher Standard, außer dass wir einen gültigen Code erstellen müssen, wenn sie am Ende der anderen Katze angeheftet wird, sodass wir beide Katzen als Musterwächter benötigen.Alternative Strategie, 43 + 105 =
186148Katze 1
Probieren Sie es online!
Katze 2
Probieren Sie es online!
Quine
Probieren Sie es online!
quelle
getContents
+putStr
mitinteract id
. Probieren Sie es online! (Die Quine funktioniert nicht mehr mit nicht-leeren Eingaben, wodurch die Verwendung eines(++ ...)
Abschnitts für dieidmain
.)interact
, ich denke, das liegt daran, dass ich selten IO-Sachen mit Haskell mache. Ich habe den Beitrag bearbeitet.Python 3, 286 Bytes
Mein erster Python Golf und mein erster Quine! Nicht sehr elegant, aber es funktioniert.
Programm A (238 Byte)
(kein abschließender Zeilenumbruch)
Programm B (48 Bytes)
(kein abschließender Zeilenumbruch)
Probieren Sie es online
Danksagung
quelle
end=open...
und verwenden,%r
anstatt%s
nicht die Zeilenumbrüche und Zitate zu tun%r
. Ich bin mir nicht sicher, was du mit der Newline meinst.%s
einen Zeilenumbruch zu formatieren, können Sie auch nur das Literal verwenden\n
. Sie können auch;
zum Teilen von Anweisungen anstelle von verwenden\n
(außer, dass die Anweisungenif
in einer eigenen Zeile stehen müssen).%
kann dadurch in der Zeichenkette maskiert werden%%
. Das einzige Argument, das zum Formatieren der Zeichenfolge benötigt wird, ist die Zeichenfolge selbst. Alles andere kann gestreift werdenlocals()
2 Bytes speichern.C ++ (clang) , 313 + 102 = 415 Bytes
Programm A (endet in einer neuen Zeile):
Programm B (endet nicht in Newline):
Nicht besonders hinterhältig, und C ++ eignet sich wie üblich nicht so gut zum Quinten. Es wird mich nicht wundern, wenn es Möglichkeiten gibt, Bytes hier und da von der gleichen Idee abzuheben. Der einzige kleine Haken ist, das Verhalten von etwas zu ändern, nachdem es definiert wurde, und ein dynamischer Variableninitialisierer mit Nebeneffekt erledigt den Trick. (Kann dies sogar in C ohne Compilererweiterungen durchgeführt werden?)
Probieren Sie es online aus: A , B , AB
(Das einzige Problem bei der Portabilität, das mir bekannt ist, besteht darin, dass das Programm davon ausgeht, dass
<cstdio>
Namen sowohl im globalen Namespace als auch in gesetzt werdenstd
.)quelle
Befunge-98 (FBBI) , 8 + 15 = 23 Bytes
A + B: (funktioniert nur für keine Eingabe)
Probieren Sie es online!
EIN:
Probieren Sie es online!
B:
Probieren Sie es online!
quelle
Python 3 , 100 + 37 = 137 Bytes
Programm A:
Probieren Sie es online!
Programm B:
Probieren Sie es online!
Machen Sie Quine AB
Probieren Sie es online!
Funktioniert nur, wenn die Eingabe leer ist, andernfalls wird die Eingabe der Ausgabe vorangestellt.
quelle
Attache , 15 + 126 = 141 Bytes
EIN:
Probieren Sie es online!
B:
Probieren Sie es online!
A + B:
Probieren Sie es online!
Erläuterung
Jedes der Katzenkodierungen
AllInput[]|Echo
ist ein einfaches Katzenkodierungsprogramm.B ist die Hauptquinphase; Alleine ist es eine vektorisierte Funktion (durch unary@
), die ohne Eingaben aufgerufen wird (als aufgerufen wird|Call
). Somit wird die erste BedingungIf[_,A,B]
ausgeführtB
, was einfach istAllInput[]|Echo
.Wann A + B ausgeführt wird,
@
wird Unary@
aufgrund derEcho
Verschmelzung mit dem Lambda binär :Dies bedeutet nun, dass das Lambda ausgeführt wird, bevor
Echo
es ausgeführt wird. Zurück zur Bedingung, diese Funktion hat jetzt alle STDIN als Argument. Also,If[_,A,B]
führt ausA
, was das Standard-Quine-Framework ist.quelle
Stax , 16 + 12 = 28 Bytes
Katze 1:
Führen Sie es aus und debuggen Sie es
Katze 2:
Führen Sie es aus und debuggen Sie es
Quine:
Führen Sie es aus und debuggen Sie es
quelle
Katze 1:
Lua , 41 Bytes
Probieren Sie es online!
Katze 2:
Lua , 70 Bytes
Probieren Sie es online!
Quine:
Lua , 111 Bytes
Probieren Sie es online!
io.input(arg[0])
In Cat 2 wird die aktuelle Datei als Standardeingabe festgelegt. Infolgedessen druckt die Katze den Quellcodequelle
> <> , 12 +3 = 15 Bytes
Programm A:
Probieren Sie es online!
Und Programm B:
Probieren Sie es online!
Make Program AB:
Probieren Sie es online!
quelle
JavaScript (Node.js) , 199 Byte
Probieren Sie es online!
Kat A, 57 Bytes
Probieren Sie es online!
Kat. B, 142 Bytes
Probieren Sie es online!
quelle