Schreiben Sie ähnlich wie bei anderen Quine-Puzzles (genauer gesagt bei diesem ) ein Programm, das die Quelle für sich selbst erzeugt.
Hier ist die neue Wendung: Der erzeugte Code sollte NICHT mit der Quelle identisch sein. Stattdessen sollte ein anderes Programm ausgegeben werden, das das erste erstellt.
Die damit verbundene Herausforderung erreichte dies durch das Wechseln zwischen zwei Sprachen. Ich denke, dies würde in nur einer Sprache geschehen , aber die zwei (oder mehr) Versionen der Quelle sollten sich erheblich unterscheiden (siehe Regeln unten). Mit dieser Einschränkung wären Antworten mit einem einzelnen Zeichen nicht zulässig, so dass ein wenig mehr Überlegung für eine endgültige Einreichung erforderlich ist.
REGELN
- Ihr Code muss nur in einer Sprache verfasst sein. (Mehrere Einsendungen, eine für jede Sprache, sind vollkommen akzeptabel.)
- Ihre verschiedenen Codeversionen müssen syntaktisch unterschiedlich sein. Mit anderen Worten, wenn Sie einen abstrakten Syntaxbaum für Ihren Code erstellen, sollte sich mindestens ein Knoten von diesem unterscheiden.
- Die Angabe eines AST ist nicht erforderlich. Wenn Sie jedoch bereit sind, für jedes Ihrer Programme einen AST bereitzustellen, kann dies bei der Beurteilung hilfreich sein.
- Sie können beliebig viele Iterationen erstellen, sofern alle syntaktisch unterschiedlich sind. (Mehr hilft Ihrem Ergebnis, siehe unten.)
WERTUNG
Ihre endgültige Punktzahl ist die durchschnittliche Länge aller Ihrer Programme, dividiert durch die Anzahl der Programme.
Beispiel 1:
A (Quelle für B) = 50 Zeichen
B (Quelle für A) = 75 Zeichen
Endergebnis = 31,25
Beispiel 2:
A (Quelle für B) = 50 Zeichen
B (Quelle für C) = 75 Zeichen
C (Quelle für A) = 100 Zeichen
Endnote = 25
Antworten:
Python, 0 (Grenze von (68 + 3 n ) / (16 n ))
Wenn zwei abstrakte Syntaxbäume unterschiedlich sind, wenn sie unterschiedliche Konstanten haben,
Es gibt 16 n Programme mit einer Länge von höchstens 68 + 3n, was einen asymptotischen Wert von 0 ergibt.
Wenn Sie Programme mit variabler Struktur wünschen, können wir einen binären Addierer mit n Bits implementieren . Hier gibt es 2 n Programme der Länge O ( n 2 ). Geht in einen Zyklus, weil das Übertragsbit gefallen ist.
quelle
pass
nacht=n(t)
und zurück.Perl, Score von 110,25
Ich muss zugeben, dass ich nicht sehr gut mit Quinten umgehen kann. Ich bin mir zu 100% sicher, dass es Verbesserungspotenzial gibt. Die Lösung basiert auf demselben Prinzip wie die nachstehende Elementlösung.
Das erste Programm besteht aus 264 Zeichen.
Das zweite Programm besteht aus 177 Zeichen.
Ich arbeite an der AST für diesen Eintrag (und den Element-Eintrag).
Element , Punktzahl von 47,25
Das erste Programm besteht aus 105 Zeichen.
Das zweite Programm besteht aus 84 Zeichen.
Ich bin sicher, dass es viel Raum für Verbesserungen gibt.
Im ersten Programm gibt es eine Zeichenfolge (in der jedes Zeichen trotz großer Redundanz maskiert wird), gefolgt von den ausführbaren Teilen A und B. Teil A führt verschiedene Aktionen aus: druckt die Zeichenfolge und maskiert jedes Zeichen, druckt die letzte Hälfte der Zeichenfolge (die die Quelle für Teil B ist), und verhindert dann, dass der Teil B, der ihm folgt, etwas tut.
Das zweite Programm ist derselbe String, dem Teil B folgt. Teil B basiert auf einem einfachen Quine. Es wird eine Zeichenfolge ausgegeben, der eine maskierte Version vorangestellt ist. Dies bedeutet, dass die Zeichenfolge und die beiden Teile A und B gedruckt werden.
quelle
[]{}
kann jeder Befehl an einer beliebigen Stelle im gesamten Programm platziert werden, ohne dass ein Syntaxfehler auftritt. Es ist perfekt.VBA: (251 + 216) / 2/2 = 116,75
251
216
Dies wird in MSAccess ausgeführt , um das
Module
Objekt zu verwenden. Das Modul ist"Q"
für das Golfen benannt. Der Unterschied in der Syntax ergibt sich aus demIf ... Then
Fehlen der kürzeren Version.quelle
vbCrLF
zuvbCr
C ++, Score von 0,734194
Der folgende Quellcode gibt eine Meta-Quine in der Größenordnung von 999 auf der Konsole aus (Erläuterung unten):
Die einzige Zeile, die geändert wird, ist die erste Zeile. Der Wert von
X
wird 1000, 999, 998, ..., 3, 2 sein und dann wird es erneut gestartet. Um jedoch jedes Mal unterschiedliche Syntaxbäume zu erhalten,X
wird in Bezug auf die Primfaktorisierung jede Primzahl als Summe von geschrieben1
s geschrieben wird. Die ASTs sind unterschiedlich, da die Primfaktorisierung von ganzen Zahlen für jeden Wert unterschiedlich ist.Das Programm druckt sich selbst, mit der Ausnahme, dass die erste Zeile geändert wird und die darin enthaltenen Backslashes, Zeilenumbrüche und Einrückungen
Q(...)
entfernt werden.Das folgende Programm berechnet die Punktzahl meiner Antwort:
Es druckte 0.734194 auf der Konsole. Offensichtlich kann 1000 durch größere ganze Zahlen ersetzt werden und die Punktzahl nähert sich 0 als Grenzwert. Der mathematische Beweis für Riemanns Zeta-Funktion ist etwas verworren. Ich überlasse es dem Leser als Übung. ;)
quelle
JavaScript,
84,56461Zwei Programme, beide Länge
169128122.Bevor ich Golf gespielt habe, für Ihr Sehvergnügen:
Liefert das neue Programm und gibt den aktuellen Teil aus!
Ich könnte es wahrscheinlich ohne die Funktion Regex kürzer machen, aber ... ich will nicht.quelle
J - (24 + 30) / 2/2 = 13,5 Punkte
Beachten Sie, dass Strings in J sind nicht die Backslash-entkommen, aber Zitat-escaped à la Pascal:
'I can''t breathe!'
.Programm 1 hat AST
noun verb hook noun
und Programm 2 hat ASTnoun
. Programm 2 ist eine zitierte Version von Programm 1, die beim Ausführen nur Programm 1 zurückgibt, sodass diese Methode nicht so einfach auf drei Kopien erweitert werden kann: PProgramm 1 erstellt eine Kopie des Codeabschnitts der Quelle mit einem angehängten Zitat und fügt am Ende fünf dieser Zitate hinzu (
(,5#{.)
). Anschließend werden zyklisch 30 Zeichen aus dieser 16-stelligen Zeichenfolge verwendet, was genau zu Programm 2 führt.quelle