Na tej stronie przestrzegamy praw termodynamiki!

23

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

wprowadź opis zdjęcia tutaj

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, bi c, z odpowiednimi częstotliwościami 3/6, 2/6 i 1/6. Jego entropia wynosi 1,4591. To jest H 0 .

Ciąg cdefghma 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 cdefghiponownie 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

Luis Mendo
źródło
4
„Na tej stronie przestrzegamy praw termodynamiki!” [Potrzebne źródło]
TuxCrafting
2
Oto źródło :-)
Luis Mendo,
1
Miałem nadzieję, że pytanie dotyczy „gorących” pytań sieciowych.
mbomb007,
1
Zastanawiałem się ... czy rzeczywiście można nieskończenie ściśle zwiększyć entropię? Jeśli wezmę wynik w postaci binarnej bez znaku, jest to w zasadzie ciąg liczb całkowitych z zakresu [0,255]. Jeśli entropia jest optymalna, gdy wszystkie znaki są różne (tylko założenie), czy nie oznacza to, że ciąg o największej entropii ma 256 bajtów? To dalekie od bycia nieskończonym. Albo moje założenie jest błędne.
Osable
2
@Osable Dołącz kopię tego ciągu do siebie, a entropia będzie taka sama. Następnie usuń jeden znak, a będzie on nieco mniejszy. Odwróć proces, a zwiększyłeś entropię. Jeśli nigdy nie uda ci się osiągnąć maksymalnej entropii, możesz ciągle wzrastać
Luis Mendo,

Odpowiedzi:

4

Galaretka, 0,68220949

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

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

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

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

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

który z kolei drukuje

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

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 0123456789zamiast wyżej wymienionych 900 000 znaków Unicode, możesz wypróbować go online!

Dennis
źródło
5

MATLAB, 9,6923e-005 0,005950967872272

H0 =  2.7243140535197345, Hinf = 4.670280547752703, L0 = 327

Ta 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ę, H0ale także zwiększa L0w 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ąc 1.) Kolejne iteracje nadal są równoważne poprzedniej wersji poniżej.

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

Wynik vs długość programu

Poprzednia wersja:

H0 = 4.22764479010266, Hinf = 4.243346286312808, L0 = 162

Poniższy kod jest inspirowany quine Matlaba . Zasadniczo wysyła tylko dwa razy . Chodzi o to, że dla każdej iteracji mamy nlinie kodu i n-1symbole nowej linii \n. Tak więc, gdy nzbliż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).

a=['ns}z2e1kGe1116k6111gE16;:61kGe1116k6111gE16;:6ek7;:61gg3E1g6;:6ek7;:61gg3E1'];
disp(['a=[''',a,'''];',10,'a=[''',a,'''];',10,[a-10,']]);'],10,[a-10,']]);']]);
wada
źródło
Bardzo dobrze! Chcesz zyskać coś zastąpienie 10przez 0(i dostosowanie reszty kodu do tego)? Char 0jest wyświetlany jako spacja przez Matlaba
Luisa Mendo
Dzieki za sugestie! Pozwól mi spróbować, ale myślę, że istnieją inne ulepszenia, które znacznie podniosą wynik. To powinien być przede wszystkim dowód koncepcji :)
flawr
Zawarłem teraz twoją sugestię wraz z kilkoma innymi ulepszeniami.
flawr
Podoba mi się ten wykres optymalizacji :-)
Luis Mendo