Auf dieser Seite halten wir uns an die Gesetze der Thermodynamik!

23

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

Bildbeschreibung hier eingeben

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, bund cmit entsprechenden Frequenzen 3/6, 2/6 und 1/6. Seine Entropie beträgt 1,4591. Dies ist H 0 .

Die Zeichenfolge cdefghhat 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 cdefghiwieder 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 42wä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

Luis Mendo
quelle
4
„Auf dieser Seite stellen wir die Gesetze der Thermodynamik gehorchen!“ [Zitat benötigte]
TuxCrafting
2
Hier ist die Quelle :-)
Luis Mendo
1
Ich hatte gehofft, die Frage würde sich auf "heiße" Netzwerkfragen beziehen.
mbomb007
1
Ich habe mich gefragt ... ist es tatsächlich möglich, die Entropie unendlich streng zu erhöhen? Wenn ich die Ausgabe in ihrer vorzeichenlosen Binärform nehme, handelt es sich im Grunde genommen um eine Folge von ganzen Zahlen im Bereich [0,255]. Wenn die Entropie optimal ist, wenn alle Zeichen unterschiedlich sind (nur eine Annahme), würde dies nicht bedeuten, dass die Zeichenfolge mit der größten Entropie 256 Byte lang ist? Es ist weit davon entfernt, unendlich zu sein. Oder meine Annahme ist falsch.
Osable
2
@Osable Hänge eine Kopie dieses Strings an sich selbst an und die Entropie ist dieselbe. Entfernen Sie dann ein Zeichen und es wird etwas kleiner. Kehren Sie den Prozess um und Sie haben die Entropie erhöht. Wenn du es schaffst, niemals die maximale Entropie zu erreichen, kannst du für immer weiter zunehmen
Luis Mendo

Antworten:

4

Jelly, 0,68220949

“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”©v⁵

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

“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”©v1010

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

“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”
“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”©v101010

was wiederum druckt

“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”
“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”
“…”
“ȷ6ȷ5rỌ,®Ṿ€ṁṾY⁾©v⁸⁵”©v10101010

etc.

Keines dieser Programme funktioniert im Online-Interpreter, der eine Ausgabegrenze von 100 KB hat . Wenn wir das Programm jedoch so ändern, dass es 0123456789anstelle der oben genannten 900.000 Unicode-Zeichen gedruckt wird , können Sie es online testen!

Dennis
quelle
5

MATLAB, 9.6923e-005 0.005950967872272

H0 =  2.7243140535197345, Hinf = 4.670280547752703, L0 = 327

Diese 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, H0indem 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, H0sondern auch gleichzeitig zunimmt L0. 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 entfernen 1.) Die Iterationen entsprechen immer noch der vorherigen Version unten.

a=['ns}z2e1e1116k5;6111gE16:61kGe1116k6111gE16:6ek7;:61gg3E1g6:6ek7;:61gg3E1'];11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111;;disp(['[''',a+1,'''];',0,'a=[''',a,'''];',0,[a-10,']]);'],0,[a-10,']]);']]);

Ergebnis vs Programmlänge

Vorherige Version:

H0 = 4.22764479010266, Hinf = 4.243346286312808, L0 = 162

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 nCodezeilen und n-1Newline-Symbole haben \n. Bei nAnnä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, Hinfindem 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.)

a=['ns}z2e1kGe1116k6111gE16;:61kGe1116k6111gE16;:6ek7;:61gg3E1g6;:6ek7;:61gg3E1'];
disp(['a=[''',a,'''];',10,'a=[''',a,'''];',10,[a-10,']]);'],10,[a-10,']]);']]);
Fehler
quelle
Sehr schön! Würden Sie etwas bekommen, das 10durch ersetzt 0(und den Rest des Codes dafür angepasst)? Char 0wird von Matlab
Luis Mendo
Danke für den Vorschlag! Lassen Sie es mich versuchen, aber ich denke, es gibt einige andere Verbesserungen, die die Punktzahl viel mehr erhöhen würden. Dies sollte in erster
Linie
Ich habe jetzt Ihren Vorschlag zusammen mit einer Reihe anderer Verbesserungen aufgenommen.
Fehler
Ich mag dieses Optimierungsdiagramm :-)
Luis Mendo