W szczególności drugie prawo : entropia izolowanego systemu z czasem wzrasta .
Do tego wyzwania
- „ System izolowany ” będzie traktowany jako program lub funkcja (odtąd zwany „programem”);
- Upływ czasu będzie odpowiadał iterowanemu wykonaniu danych wyjściowych programu , uważanych za nowy program;
- „ Entropia ” będzie traktowana jako entropia pierwszego rzędu Shannona (do zdefiniowania poniżej), która jest miarą tego, jak różnorodne są znaki ciągu.
Wyzwanie
Twój program powinien wygenerować niepusty łańcuch, który po uruchomieniu jako program w tym samym języku tworzy łańcuch o większej entropii niż poprzedni. Nieskończenie iteracyjne wykonywanie tego procesu typu „wyprowadź-wyprowadzenie” musi generować ściśle rosnącą sekwencję wartości entropii .
Ciągi mogą zawierać dowolne znaki Unicode 9.0 . Sekwencja ciągów musi być deterministyczna (w przeciwieństwie do losowej).
Entropia dla danego ciągu znaków zostanie zdefiniowany następująco. Zidentyfikuj jego unikalne znaki i liczbę wystąpień w ciągu. Częstotliwość p I o í -ty wyjątkowy charakter jest liczba wystąpień tego znaku podzieloną przez długość łańcucha. Entropia jest wtedy
gdzie suma obejmuje wszystkie unikalne znaki ciągu. Technicznie odpowiada to entropii dyskretnej zmiennej losowej z rozkładem podanym przez częstotliwości obserwowane w ciągu.
Niech H k oznacza entropię ciągu utworzonego przez k -ty program, a H 0 oznacza entropię kodu programu początkowego. Niech L 0 oznacza długość początkowego programu w znakach. Sekwencja { H k } jest monotoniczna zgodnie z wymaganiami wyzwania i jest ograniczona (ponieważ liczba istniejących znaków jest skończona). Dlatego ma granicę H ∞ .
Wynik z złożenia będzie miał wartość ( H ∞ - H 0 ) / l 0 :
- Licznik, H ∞ - H 0 , odzwierciedla stopień, w jakim twój kod „przestrzega” prawa zwiększania entropii w nieskończonym przedziale czasu.
- Mianownik, L 0 , jest długością początkowego kodu w znakach (nie w bajtach).
Wygrywa kod z najwyższym wynikiem . Więzy zostaną rozstrzygnięte na korzyść najwcześniejszego przesłania / edycji.
Aby obliczyć entropię ciągu, możesz użyć fragmentu kodu JavaScript (dzięki uprzejmości @flawr oraz z poprawkami @Dennis i @ETHproductions ) na końcu tego postu.
Jeśli uzyskanie limitu H ∞ jest trudne w twoim konkretnym przypadku, możesz użyć dowolnej dolnej granicy, powiedzmy H 20 , aby obliczyć wynik (więc użyłbyś ( H 20 - H 0 ) / L 0 ). Ale w każdym razie nieskończona sekwencja entropii musi się ściśle zwiększać.
Dołącz wyjaśnienie lub krótki dowód, że sekwencja entropii rośnie, jeśli nie jest to oczywiste.
Przykład
W fikcyjnym języku rozważ kod aabcab
, który po uruchomieniu tworzy ciąg znaków cdefgh
, który po uruchomieniu tworzy cdefghi
, który ...
Unikalne postacie oryginalnego kodu są a
, b
i c
, z odpowiednimi częstotliwościami 3/6, 2/6 i 1/6. Jego entropia wynosi 1,4591. To jest H 0 .
Ciąg cdefgh
ma więcej entropii niż aabcab
. Możemy to wiedzieć bez obliczania, ponieważ dla danej liczby znaków entropia jest zmaksymalizowana, gdy wszystkie częstotliwości są równe. Rzeczywiście, entropia H 1 wynosi 2,5850.
Ciąg cdefghi
ponownie ma więcej entropii niż poprzedni. Możemy teraz bez obliczeń, ponieważ dodanie nieistniejącej postaci zawsze zwiększa entropię. Rzeczywiście, H 2 wynosi 2,8074.
Gdyby następna struna była 42
łańcuchem, łańcuch byłby nieprawidłowy, ponieważ H 3 byłby 1, mniejszy niż 2,8074.
Z drugiej strony, gdyby sekwencja kontynuowała wytwarzanie ciągów o wzrastającej entropii z granicą H ∞ = 3, wynik wynosiłby (3-1,4597) / 6 = 0,2567.
Podziękowanie
Dzięki
@xnor za pomoc w poprawieniu wyzwania, a w szczególności za przekonanie mnie, że nieskończone łańcuchy rosnącej entropii uzyskane w wyniku iteracyjnego wykonania są rzeczywiście możliwe;
@flawr, aby uzyskać kilka sugestii, w tym modyfikację funkcji score i napisanie bardzo przydatnego fragmentu;
@Angs za wskazanie istotnej wady w poprzedniej definicji funkcji score;
@Dennis za poprawkę we fragmencie kodu JavaScript;
@ETHproductions dla kolejnej poprawki we fragmencie;
@PeterTaylor dla poprawki w definicji entropii.
Snippet do obliczania entropii
źródło
Odpowiedzi:
Galaretka, 0,68220949
H 90 = 19,779597644909596802, H 0 = 4,088779347361360882, L 0 = 23
Użyłem długich podwójnych do obliczenia H 90 . Pływaki podwójnej precyzji nieprawidłowo zgłosiły, że H 47 <H 46
Pierwszy program zostanie wydrukowany
gdzie
…
służy jako symbol zastępczy dla wszystkich znaków Unicode z punktami kodowymi między 100 000 i 1,000,000 . Rzeczywista długość wynosi 900 031 znaków.Program sekund zostanie wydrukowany
który z kolei drukuje
itp.
Żaden z tych programów nie działa w tłumaczu online, który ma limit wyjściowy 100 KB . Jeśli jednak zmodyfikujemy program do drukowania
0123456789
zamiast wyżej wymienionych 900 000 znaków Unicode, możesz wypróbować go online!źródło
MATLAB,
9,6923e-0050,005950967872272Ta nowa wersja jest ulepszoną wersją pierwszego „dowodu koncepcji”. W tej wersji mam świetny wzrost wyniku od pierwszej iteracji. Osiągnięto to poprzez „wysadzenie” wyjścia pierwszego programu, który jest replikowany przez wszystkie kolejne. Potem również próbowałem znaleźć minimum
H0
, dodając jak najczęstszy symbol kodu tak wiele razy, jak to możliwe. (Miało to oczywiście limit, ponieważ nie tylko zmniejsza się,H0
ale także zwiększaL0
w tym samym czasie. Możesz zobaczyć rozwój wyniku wykreślony w stosunku do wielkości programu, w którym rozmiar jest zróżnicowany, po prostu dodając lub usuwając1
.) Kolejne iteracje nadal są równoważne poprzedniej wersji poniżej.Poprzednia wersja:
Poniższy kod jest inspirowany quine Matlaba . Zasadniczo wysyła tylko dwa razy . Chodzi o to, że dla każdej iteracji mamy
n
linie kodu in-1
symbole nowej linii\n
. Tak więc, gdyn
zbliżamy się do nieskończoności, stosunek linii kodu do znaków nowej linii zbliża się do 1, a jednocześnie gwarantuje to, że mamy ściśle monotonowy wzrost entropii. Oznacza to również, że możemy łatwo obliczyćHinf
, biorąc pod uwagę kod zerowej generacji z równie wieloma nowymi liniami jak liniami kodu. (Który można eksperymentalnie potwierdzić, ponieważ zbiega się dość szybko).źródło
10
przez0
(i dostosowanie reszty kodu do tego)? Char0
jest wyświetlany jako spacja przez Matlaba