Schreiben Sie ein Programm, das sich selbst zufällig generieren kann.
Dies muss auf der Grundlage der im Quellcode verwendeten Token erfolgen . Wenn der Quellcode Ihres Programms aus 50 eindeutigen Token besteht und 60 Token lang ist, sollte das Programm 60 Token ausgeben, wobei jedes Token zufällig aus einem der 50 eindeutigen Token ausgewählt wird.
Zum Beispiel hätte dieses Programm eine Chance von eins zu 60, sich selbst zu reproduzieren.
Was ist ein Token? Das kommt auf die Sprache an. Beispielsweise werden Bezeichner ( foo_bar
), Schlüsselwörter ( while
) und Zahlen ( 42
) in den meisten Sprachen als Token gezählt. Leerzeichen würden in den meisten Sprachen nicht zählen.
Zusätzliche Regeln:
- Die Ausgabe darf nur Token enthalten, die sich im Quellcode des Programms befinden und durch das entsprechende Trennzeichen getrennt sind
- Die Ausgabe muss dieselbe Länge haben wie der Quellcode des Programms, gerechnet nach Token
- Es darf nur eine Programmiersprache verwendet werden
- Der Quellcode muss mindestens 3 eindeutige Token enthalten
- Kommentare aus dem Quellcode ausschließen
- Das Programm sollte nur eine einzige Chance haben, sich selbst zu reproduzieren
Wertung: Das Programm, das die beste Chance hat, sich selbst zu reproduzieren, gewinnt.
quelle
Antworten:
Python 2, 3 ^ -3 = 0,037
exec
Missbrauch ist sehr praktisch, um die Anzahl der Token zu verringern. Jetzt aktualisiert, um die Quelldatei nicht zu lesen!Das Extra
''
zwischenexec
und der riesigen dreifach zitierten Zeichenfolge besteht nur darin, die Tokenanzahl auf das erforderliche Minimum von 3 aufzufüllen. Sie wird aufgrund der impliziten String-Literal-Verkettung in die zweite Zeichenfolge eingebunden.Ursprüngliche Version der Quelldatei:
Genau genommen platziert die Python-Grammatik ein ENDMARKER-Token am Ende der Quelldatei, und wir können keine Quelldatei mit zufällig verteilten ENDMARKERs erstellen. Wir geben vor, dass es nicht existiert.
quelle
".]';(?3 3 3){]`".;~({:,],{:,],6#{:)'';(?3 3 3){]`".;~({:,],{:,],6#{:)'''''''
.Javascript, 102 Token, 33 einzigartig, 7,73 × 10 -154
Beachten Sie, dass dies eine echte Quine ist. Es liest die Datei nicht oder verwendet
eval
oderFunction.toString
quelle
Python: P (Erzeugungsprogramm in 1 Versuch) = 3,0317 * 10 ^ -123
34 einzigartige Token, 80 Token insgesamt. Beachten Sie, dass am Ende jeder Zeile ein Leerzeichen steht.
Beispielausgabe:
Vielen Dank an die andere Python-Lösung von user2357112, die mich daran erinnert hat, das letzte Token zu verwerfen und es zu verwenden, von
__file__
dem ich vorher nichts wusste .quelle
J - 1 in 11 17 = 1.978 x 10 -18
J hat eine Menge nützlicher kleiner Werkzeuge, um diese Art von Arbeit zu erledigen.
Zuallererst ist jede durch Leerzeichen getrennte Folge von Zahlen ein Token . Es bedeutet ein eindimensionales Array dieser Zahlen. So funktioniert Js Lexer. Das sind übrigens siebzehn
11
, wenn jemand neugierig ist.(,,,{:,{:)'QUINE'''
ist ein in J gebräuchlicher Quine-Trick, bei dem so wenig Token wie möglich verwendet werden:{:
bedeutet " Tail" , also hängt er die Zeichenfolge an sich selbst an und fügt am Ende zwei Kopien des letzten Zeichens hinzu. Da das letzte Zeichen ein einfaches Anführungszeichen ist (J verwendet Strings im Pascal-Stil), lautet das ErgebnisQUINE'QUINE'''
.;:
ist ein Tokenizer, der eine Eingabezeichenfolge wie J-Code aufteilt und eine Liste von Feldern zurückgibt. Die Länge dieses Ergebnisses beträgt 17.~.
Nimmt alle eindeutigen Elemente dieses Arrays. Die Länge dieses Ergebnisses beträgt 11.?
heißt Roll . Für jede Ganzzahl in ihrem Argument wird eine positive Zufallszahl größer oder gleich Null ausgewählt, die kleiner als diese Zahl ist. Hier generiert J also 17 Zahlen von 0 bis einschließlich 10.{
Verwendet die Zufallsindizes, um Elemente aus unserer Liste der Unique-Token-In-Boxen auszuwählen.;
öffnet alle diese Felder und führt das Ergebnis zusammen aus.Es folgen einige Beispiele. Die eingerückten Zeilen sind die Eingabeaufforderungen, und die linksbündigen Zeilen sind die Ausgabe des Interpreters.
quelle
Nachsatz
Dies war ein Spaß
Es gibt 17 einzigartige Token und insgesamt 54 Token für eine Chance von ca. 1 zu 3.6e-67.
quelle
Whitespace,
3 ^ -2053 ^ -1893 ^ -1813 ^ -132 ~ = 10 ^ -63Dies ist ein Whitespace-Programm, das, wenn es mit zufälligen Zeichen besetzt ist, eine 1: 3 ^ 132-Chance hat, sich selbst zu reproduzieren (3 verschiedene Token, 132-mal wiederholt). Es muss beim Ausführen mit mindestens 132 zufälligen Zeichen gesetzt werden (Whitespace hat keine eingebaute Zufalls- oder Datumsfunktion zum Setzen), z
some_whitespace_interpreter my_quine.ws <some_random_source >quine_output.ws
. Die Punktzahl würde sich verbessern, wenn das Programm nicht mehr golfen könnte, aber dies ist mein erstes "echtes" Whitespace-Programm, also lasse ich es einfach bei meiner mageren Menge an Golf.Einfacher Whitespace-Code, oder sehen Sie , wie er ausgeführt wird : (Klicken Sie zum Ausprobieren auf "Bearbeiten", kopieren Sie das Material in die <pre> -Tags; sollte 132 Zeichen mit Unix-EOL enthalten)
Mit what befehl annotierter Code ist what (technisch gesehen kein Quine, da er die Kommentare nicht reproduziert):
Wenn der Startwert gerade äquivalent ist (die Zeichen werden in Mod 3 umgewandelt, um in die Token umgewandelt zu werden), ist dies erfolgreich:
Es ist ein ziemlich einfaches Programm, das ungefähr diesem Ruby-Programm entspricht:
quelle
Perl, 27 Token, P = 1,4779 × 10 –34
Letzte Änderung: Verwenden Sie diese
@ARGV=$0
Optionopen*ARGV,$0
, um ein Token zu speichern.=
,/
,@
,$
)W
)Ich denke also, dass die Wahrscheinlichkeit (pow (2,2 * 4) * pow (4,4)) / pow (27,27) ungefähr 1,48E-34 beträgt.
Wenn sich der Quellcode in einer Datei mit dem Namen befindet
ARGV
, können Sie diese 26-Token-Lösung mit P = ~ 2.193 x 10 -31 verwenden :quelle
P = (4 * 2! + 4!) / 27!
das ist ungefähr 1.7632684538487448 x 10 ^ -26(Ich weiß, das ist kein Code-Golf, aber ...)
Probieren Sie es online!
Ähnlich wie bei der Python-Antwort, bei der das erste Token ein ausgewertetes Zeichenfolgenliteral ist. Die Token sind
Erläuterung:
quelle