C Jam, ( 58 56 54 48 46 × 2) × 48% = 44,16
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
welche druckt
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
Die Nicht-Leerzeichen in jeder Zeile bleiben zwischen den beiden Quines gleich.
Aber jetzt der wirklich süße Teil:
{`"_~"+{_,94\m2/S*a_+\*{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~N/23f/Wf%N*}_`'"#)!*}_~
ist eine Quine! :)
Teste es hier.
Wie es funktioniert
Ich empfehle Ihnen, zuerst die Erklärung zu meinem anderen Beitrag zu lesen, da hier die Grundlagen des Quining in CJam im Allgemeinen erläutert werden.
Dieser ist etwas kniffliger. Für das gegenseitige Quine ändere ich wie im anderen Fall die Zeichenfolgendarstellung des Blocks, indem ich vor oder nach jeder Zeile Leerzeichen hinzufüge und eine 0 durch eine 2 tausche, sodass das resultierende Programm die Leerzeichen an das entgegengesetzte Ende setzt.
Beachten Sie, dass sich die Leerzeichen überhaupt nicht auf die Quines auswirken. In der ersten befinden sie sich in einem Block, der nicht wirklich verwendet wird, und in der zweiten befinden sie sich um den gesamten Code.
Um eine regelmäßige Quine zu erhalten, wenn beide kombiniert werden, müssen wir einen Weg finden, um all diese Modifikationen zu vermeiden. Beachten Sie, dass die Struktur von Whitespace und Code bedeutet, dass durch die Kombination von beiden die Gesamtheit eines Quines in das andere eingefügt wird. Wenn wir also den gesamten Änderungscode in einen Block einfügen, können wir diesen Block abhängig von seinem tatsächlichen Inhalt ausführen.
Jetzt habe ich also diesen Block ... für die gegenseitigen Quines enthält er nur den Code, den ich eigentlich ausführen möchte. Für das kombinierte Quine enthält es auch wieder das gesamte Quine in einer zufälligen Position, was keinen Sinn ergibt ... aber da es ein Block ist, wird es nicht automatisch ausgeführt. So können wir anhand des Inhalts dieses Blocks bestimmen, ob der String geändert werden soll. Dafür _`'"#)!
ist es da. Es dupliziert den Block, konvertiert ihn in einen String, sucht nach dem Zeichen "
(das in den Quines nur außerhalb des Blocks vorkommt) - die Suche gibt zurück, -1
wenn das Zeichen nicht gefunden wird, und ansonsten eine positive ganze Zahl - und erhöht das Ergebnis und negiert es logisch. Wenn also a "
gefunden wurde, ergibt dies, 0
andernfalls ergibt es 1
. Jetzt machen wir es einfach*
, der den Block einmal ausführt, wenn das Ergebnis 1 war und ansonsten gar nicht.
Schließlich funktioniert der Änderungscode wie folgt:
_,94\m2/S*a_+\*N/23f/Wf%N*
_, "Duplicate the quine string and get its length.";
94\m "Subtract from 94.";
2/ "Divide by two.";
S* "Create a string with that many spaces. This will be
an empty string for the first mutual quine, and contain
23 spaces for the second mutual quine.";
a_+ "Create an array that contains this string twice.";
\* "Join the two copies together with the quine string.";
N/ "Split into lines.";
23f/ "Split each line into halves (23 bytes each).";
Wf% "Reverse the two halves of each line.";
N* "Join with a newline.";
Inanspruchnahme der Prämie (12 x 10) * 48% = 57,6
Es hat sich herausgestellt, dass dieser Code mit einigen Änderungen sehr einfach auf mehrere Zeilen aufgeteilt werden kann. Wir addieren 2 Zeichen, um 48 in einer Reihe zu erhalten, die wir dann bequem durch 8 teilen können, so dass wir 8 Zeilen mit 6 Codezeichen und 6 Leerzeichen haben. Dazu müssen wir auch einige Zahlen ändern und einen oder zwei Operatoren neu anordnen, damit sie nicht auf beide Zeilen aufgeteilt werden. Das gibt uns eine funktionierende Version mit der Größe 12 x 8 ... einmalig. Also fügen wir einfach zwei Zeilen hinzu, die nichts bewirken (eine 1 drücken, eine 1 drücken, eine 1 drücken, eine 1 drücken ...), und erhalten 12 x 10 :
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
Wie der vorherige erzeugt dies
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
(Randnotiz: In den Zwischenzeilen muss nicht immer links und rechts gewechselt werden, sondern es ist nur die Position der ersten und letzten Zeile wichtig. Links und rechts können für alle anderen Zeilen beliebig gewählt werden.)
Und durch reinen Zufall funktioniert das ganze Quine auch noch:
{`"_~"{`"_~"
+{129X+{129X
$,m2/S$,m2/S
*a_+\**a_+\*
N/6f/1N/6f/1
;1;1;1;1;1;1
;1;1;1;1;1;1
;Wf%N*;Wf%N*
}_`'"#}_`'"#
)!*}_~)!*}_~
(Ich sage Zufall, weil der Teil, der dafür sorgt, dass der innere Code nicht ausgeführt wird, jetzt seltsamerweise mit dem anderen Quine verwechselt wird, aber es funktioniert trotzdem gut.)
Davon abgesehen hätte ich 1;
meiner ursprünglichen Einreichung nur 44 Zeilen hinzufügen können , um die Kopfgeldanforderung zu erfüllen, 12 x 10
sieht aber viel ordentlicher aus. ;)
Edit: Haha, als ich "purer Zufall" sagte, hätte ich nicht besser sein können. Ich habe mir angesehen, wie das letzte Quine jetzt tatsächlich funktioniert, und es ist absolut lächerlich. Es gibt drei verschachtelte Blöcke (4 tatsächlich, aber der innerste ist irrelevant). Der einzig wichtige Teil des innersten dieser 3 Blöcke ist, dass er einen enthält "
(und nicht den, den er in der ursprünglichen Einreichung getan hat, sondern den '"
, der am Ende verwendet wird, um nach demselben Zeichen zu suchen). Die Grundstruktur des Quines ist also:
{`"_~"{`"_~"+{___'"___}_`'"#)!*}_~)!*}_~
Lassen Sie uns das analysieren:
{`"_~" }_~ "The standard CJam quine.";
{`"_~"+ }_~ "Another CJam quine. Provided it doesn't do
anything in the rest of that block, this
will leave this inner block as a string on
the stack.";
) "Slice the last character off the string.";
! "Negate... this yields 0.";
* "Repeat the string zero times.";
Das mag zwar etwas komisch, aber da der innere Block eine einzelne Zeichenfolge auf dem Stapel belässt )!*
, verwandelt sich diese zufällig in eine leere Zeichenfolge. Die einzige Bedingung ist, dass das Zeug im inneren Block danach +
nichts mehr mit dem Stapel zu tun hat, also schauen wir uns das an:
{___'"___} "Push a block which happens to contain
quotes.";
_`'"#)!* "This is from the original code and just
removes the block if it does contain
quotes.";