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.