Und insbesondere das zweite Gesetz : Die Entropie eines isolierten Systems nimmt mit der Zeit zu .
Für diese Herausforderung
- Ein " isoliertes System " ist ein Programm oder eine Funktion (von nun an als "Programm" abgekürzt).
- Das Verstreichen von " Zeit " entspricht iterierten Ausführungen der Programmausgabe , die als neues Programm betrachtet werden.
- " Entropie " wird als Shannons Entropie erster Ordnung (nachstehend definiert) angesehen, die ein Maß für die Verschiedenartigkeit der Zeichen der Zeichenfolge ist.
Die Herausforderung
Ihr Programm sollte eine nicht leere Zeichenfolge erzeugen, die bei Ausführung als Programm in derselben Sprache eine Zeichenfolge mit mehr Entropie erzeugt als die vorherige. Wenn Sie diesen Execute-the-Output-Prozess unendlich oft wiederholen, müssen Sie eine streng ansteigende Folge von Entropiewerten erzeugen .
Die Zeichenfolgen können beliebige Unicode 9.0- Zeichen enthalten. Die Reihenfolge der Zeichenfolgen muss deterministisch sein (im Gegensatz zu zufällig).
Die Entropie für eine bestimmte Zeichenfolge wird wie folgt definiert. Identifizieren Sie die eindeutigen Zeichen und die Anzahl der Vorkommen in der Zeichenfolge. Die Häufigkeit p i des i- ten eindeutigen Zeichens ist die Anzahl der Vorkommen dieses Zeichens geteilt durch die Länge der Zeichenfolge. Die Entropie ist dann
Dabei steht die Summe über allen eindeutigen Zeichen der Zeichenfolge. Technisch entspricht dies der Entropie einer diskreten Zufallsvariablen mit einer Verteilung, die durch die in der Zeichenfolge beobachteten Häufigkeiten gegeben ist.
Sei H k die Entropie des vom k- ten Programm erzeugten Strings und sei H 0 die Entropie des ursprünglichen Programmcodes. Außerdem sei L 0 die Länge des Anfangsprogramms in Zeichen. Die Sequenz { H k } ist gemäß den Herausforderungsanforderungen monoton und begrenzt (da die Anzahl der vorhandenen Zeichen endlich ist). Daher hat es eine Grenze, H ∞ .
Das Ergebnis einer Einreichung ist ( H ∞ - H 0 ) / L 0 :
- Der Zähler H ∞ - H 0 gibt an, inwieweit Ihr Code dem Gesetz der Entropieerhöhung über einen unendlichen Zeitraum "gehorcht".
- Der Denonimator L 0 ist die Länge des Anfangscodes in Zeichen (nicht in Bytes).
Der Code mit der höchsten Punktzahl gewinnt . Krawatten werden zu Gunsten der frühesten Einreichung / Bearbeitung aufgelöst.
Um die Entropie eines Strings zu berechnen, können Sie das JavaScript-Snippet (mit freundlicher Genehmigung von @flawr und mit Korrekturen von @Dennis und @ETHproductions ) am Ende dieses Beitrags verwenden.
Wenn es in Ihrem speziellen Fall schwierig ist , die Grenze H ∞ zu erhalten , können Sie eine beliebige Untergrenze, z. B. H 20 , verwenden, um die Punktzahl zu berechnen (also würden Sie ( H 20 - H 0 ) / L 0 verwenden ). In jedem Fall muss die unendliche Folge von Entropien jedoch streng zunehmen.
Bitte legen Sie eine Erklärung oder einen kurzen Beweis bei, dass die Reihenfolge der Entropien zunimmt, falls dies nicht offensichtlich ist.
Beispiel
Betrachten Sie in einer fiktiven Sprache den Code aabcab
, der beim Ausführen den String erzeugt cdefgh
, der beim Ausführen cdefghi
...
Die einzigartigen Zeichen des ursprünglichen Codes sind a
, b
und c
mit entsprechenden Frequenzen 3/6, 2/6 und 1/6. Seine Entropie beträgt 1,4591. Dies ist H 0 .
Die Zeichenfolge cdefgh
hat mehr Entropie als aabcab
. Wir können dies wissen, ohne es zu berechnen, da für eine gegebene Anzahl von Zeichen die Entropie maximiert wird, wenn alle Frequenzen gleich sind. In der Tat beträgt die Entropie H 1 2,5850.
Die Zeichenfolge hat cdefghi
wieder mehr Entropie als die vorherige. Wir können jetzt ohne rechnen, weil das Hinzufügen eines nicht existierenden Zeichens immer die Entropie erhöht. In der Tat ist H 2 2,8074.
Wenn der nächste String 42
wäre, wäre die Kette ungültig, weil H 3 1 wäre, kleiner als 2,8074.
Wenn andererseits die Sequenz weiterhin Ketten mit zunehmender Entropie mit der Grenze H ∞ = 3 erzeugen würde, wäre die Punktzahl (3 - 1,4597) / 6 = 0,2567.
Danksagung
Dank an
@xnor für seine Hilfe bei der Verbesserung der Herausforderung und insbesondere für die Überzeugung, dass unendliche Ketten zunehmender Entropie durch iterierte Ausführung tatsächlich möglich sind;
@flawr für verschiedene Vorschläge, einschließlich der Änderung der Score-Funktion und zum Schreiben des sehr nützlichen Snippets;
@Angs, um auf einen wesentlichen Nachteil in einer früheren Definition der Bewertungsfunktion hinzuweisen;
@Dennis für eine Korrektur im JavaScript-Snippet;
@ETHproductions für eine weitere Korrektur im Snippet;
@PeterTaylor für eine Korrektur in der Definition von Entropie.
Snippet zur Berechnung der Entropie
quelle
Antworten:
Jelly, 0,68220949
H 90 = 19,779597644909596802, H 0 = 4,088779347361360882, L 0 = 23
Ich habe lange Doubles verwendet, um H 90 zu berechnen . Schwimmer mit doppelter Genauigkeit haben fälschlicherweise gemeldet, dass H 47 <H 46 ist
Das erste Programm wird gedruckt
wo
…
dient als Platzhalter für alle Unicode - Zeichen mit Codepunkten zwischen 100.000 und 1.000.000 . Die tatsächliche Länge beträgt 900.031 Zeichen.Das Sekundenprogramm wird gedruckt
was wiederum druckt
etc.
Keines dieser Programme funktioniert im Online-Interpreter, der eine Ausgabegrenze von 100 KB hat . Wenn wir das Programm jedoch so ändern, dass es
0123456789
anstelle der oben genannten 900.000 Unicode-Zeichen gedruckt wird , können Sie es online testen!quelle
MATLAB,
9.6923e-0050.005950967872272Diese neue Version ist eine verbesserte Version des ersten "Proof of Concept". In dieser Version bekomme ich eine große Punktezunahme von der ersten Iteration. Dies wurde erreicht, indem die Ausgabe des ersten Programms, die von allen nachfolgenden Programmen repliziert wird, "gesprengt" wurde. Dann habe ich auch versucht, das Minimum zu finden,
H0
indem ich so oft wie möglich das häufigste Symbol des Codes angehängt habe. (Dies hatte offensichtlich eine Grenze, da es nicht nur abnimmt,H0
sondern auch gleichzeitig zunimmtL0
. Sie können die Entwicklung der Punktzahl in Abhängigkeit von der Größe des Programms sehen, bei dem die Größe variiert wird, indem Sie sie einfach hinzufügen oder entfernen1
.) Die Iterationen entsprechen immer noch der vorherigen Version unten.Vorherige Version:
Der folgende Code ist vom Matlab Quine inspiriert . Es gibt sich im Grunde einfach nochmal zweimal aus . Der Hinweis ist, dass wir für jede Iteration
n
Codezeilen undn-1
Newline-Symbole haben\n
. Bein
Annäherung an die Unendlichkeit nähert sich das Verhältnis von Codezeilen zu Zeilenumbrüchen 1, und dies garantiert gleichzeitig, dass wir ein streng monoton wachsendes Entropiewachstum haben. Das bedeutet auch, dass wir einfach berechnen können,Hinf
indem wir den Code der nullten Generation mit ebenso vielen Zeilenumbrüchen wie Codezeilen betrachten. (Was man experimentell bestätigen kann, da es ziemlich schnell konvergiert.)quelle
10
durch ersetzt0
(und den Rest des Codes dafür angepasst)? Char0
wird von Matlab