На цьому сайті ми підкоряємося законам термодинаміки!


23

І зокрема другий закон : ентропія ізольованої системи з часом зростає .

Для цього виклику,

  • " Ізольованою системою " буде вважатися програма або функція (відтепер скорочено "програма");
  • Проходження " часу " відповідатиме ітераційним виконанням результатів програми , що розглядаються як нова програма;
  • " Ентропія " буде сприйнята як ентропія Шеннона першого порядку (визначиться нижче), що є мірою того, наскільки різноманітні символи рядка.

Змагання

Ваша програма повинна створити не порожню рядок, яка, виконана як програма на тій же мові, створює рядок з більшою ентропією, ніж попередня. Нескінченно ітерація цього процесу виконання-виведення повинна створювати суворо зростаючу послідовність значень ентропії .

Рядки можуть містити будь-які символи Unicode 9.0 . Послідовність рядків повинна бути детермінованою (на відміну від випадкової).

Ентропії для цього рядка буде визначатися таким чином . Визначте його унікальні символи та їх кількість виникнення у рядку. Частота р я з я -й унікального характеру є числом входжень цього символу , поділеного на довжині рядка. Ентропія тоді

введіть тут опис зображення

де сума перевищує всі унікальні символи рядка. Технічно це відповідає ентропії дискретної випадкової величини з розподілом, заданим частотами, що спостерігаються в рядку.

Нехай H k позначає ентропію рядка, виробленого k -й програмою, а H 0 позначає ентропію початкового коду програми. Нехай L 0 позначає довжину початкової програми в символах. Послідовність { H k } є монотонною відповідно до вимог виклику і є обмеженою (оскільки кількість існуючих символів є кінцевою). Тому вона має межу, H .

Оцінка з уявлення буде ( Н - Н 0 ) / L 0 :

  • Чисельник H - H 0 відображає, наскільки ваш код "підкоряється" закону збільшення ентропії протягом нескінченного періоду часу.
  • Деноніматор L 0 - це довжина початкового коду в символах (а не в байтах).

Виграє код з найвищим балом . Зв'язки будуть вирішені на користь якнайшвидшого подання / редагування.

Для обчислення ентропії рядка, ви можете використовувати фрагмент JavaScript (люб’язно надано @flawr та з виправленнями @Dennis та @ETHproductions ) наприкінці цієї публікації.

Якщо отримати обмеження H у Вашому конкретному випадку важко, ви можете використовувати будь-яку нижню межу, скажімо, H 20 , щоб обчислити бал (так що ви б використовували ( H 20 - H 0 ) / L 0 ). Але в будь-якому випадку нескінченна послідовність ентропій повинна суворо зростати.

Будь ласка, додайте пояснення або короткий доказ того, що послідовність ентропій збільшується, якщо це не очевидно.

Приклад

У вигаданій мові розглянемо код aabcab, який під час запуску створює рядок cdefgh, який при запуску виробляє cdefghi, який ...

Унікальними символами оригінального коду є a, bі cз відповідними частотами 3/6, 2/6 та 1/6. Його ентропія становить 1,4591. Це H 0 .

Рядок cdefghмає більше ентропії, ніж aabcab. Ми можемо це знати, не обчислюючи це, оскільки для заданої кількості символів ентропія максимальна, коли всі частоти рівні. Дійсно, ентропія H 1 становить 2,55850.

Рядок cdefghiзнову має більше ентропії, ніж попередній. Тепер ми можемо без обчислень, оскільки додавання неіснуючого символу завжди збільшує ентропію. Дійсно, H 2 - 2.8074.

Якби наступний рядок був 42ланцюжком, був би недійсним, оскільки H 3 було б 1, меншим за 2,8074.

Якщо, з іншого боку, послідовність продовжувала б створювати рядки зростаючої ентропії з обмеженням H = 3, оцінка буде (3−1,4597) / 6 = 0,2567.

Подяка

Завдяки

  • @xnor за його допомогу в покращенні виклику, і, зокрема, за те, що переконав мене, що безмежні ланцюги зростаючої ентропії, отримані в результаті повторного виконання, дійсно можливі;

  • @flawr для декількох пропозицій, включаючи зміну функції оцінки та написання дуже корисного фрагмента;

  • @Angs для вказівки істотного недоліку в попередньому визначенні функції оцінки;

  • @Dennis для виправлення у фрагменті JavaScript;

  • @ETHproductions для іншої корекції фрагменту;

  • @PeterTaylor для виправлення у визначенні ентропії.

Фрагмент для обчислення ентропії


4
"На цьому сайті ми підкоряємося законам термодинаміки!" [Потрібна цитата]
TuxCrafting


1
Я сподівався, що питання стосуватиметься "гарячих" мережевих запитань.
mbomb007

1
Мені було цікаво ... чи можна насправді нескінченно суворо збільшити ентропію? Якщо я прийму вихід у його неподписаному бінарному вигляді, це в основному послідовність цілих чисел у діапазоні [0,255]. Якщо ентропія є оптимальною, коли всі символи різні (лише припущення), чи не означає це, що рядок з найбільшою ентропією має довжину 256 байт? Це далеко не нескінченність. Або моє припущення неправильне.
Доступний

2
@Osable Приєднайте копію цього рядка до себе, і ентропія буде такою ж. Потім вийміть одну оболонку, і вона буде трохи меншою. Інвертуйте процес, і ви збільшили ентропію. Якщо вам не вдасться досягти максимальної ентропії, ви можете продовжувати збільшуватися назавжди
Луїс Мендо

Відповіді:


4

Желе, 0,68220949

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

Н 90 = 19,779597644909596802, Н 0 = 4,088779347361360882, L 0 = 23

Я використовував довгі парні для обчислення H 90 . Поплавці подвійної точності неправильно повідомили, що H 47 <H 46

Друкується перша програма

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

де служить в якості заповнювача для всіх символів Unicode з кодовою між 100000 і 1000000 . Дійсна довжина - 900,031 символів.

Програма друкує секунди

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

який, у свою чергу, друкує

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

тощо.

Жодна з цих програм не працює в Інтернетному інтерпретаторі, який має обмеження на 100 КБ . Однак якщо ми змінимо програму для друку 0123456789замість вищезгаданих 900 000 символів Unicode, ви можете спробувати її в Інтернеті!


5

MATLAB, 9.6923e-005 0,005950967872272

H0 =  2.7243140535197345, Hinf = 4.670280547752703, L0 = 327

Ця нова версія є вдосконаленою версією першого "доказу концепції". У цій версії я отримую велике збільшення балів від першої ітерації. Це було досягнуто "підірванням" виходу першої програми, що реплікується усіма наступними. Тоді я також спробував знайти мінімум H0, просто додавши найпоширеніший символ коду якомога більше разів. (Це, очевидно, було межею, оскільки воно не тільки зменшується, H0але й збільшується L0в той же час. Ви можете бачити розвиток балів, нанесених на розмір програми, де розмір змінюється просто додаванням або видаленням 1.) Наступні ітерації все ще еквівалентні попередній версії нижче.

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

Оцінка проти тривалості програми

Попередня версія:

H0 = 4.22764479010266, Hinf = 4.243346286312808, L0 = 162

Наступний код натхненний matlab quine . Це в основному виводить тільки себе знову два рази . Підказка полягає в тому, що для будь-якої ітерації у нас є nрядки коду та n-1символи нового рядка \n. Отже, як nпідходи до нескінченності, відношення рядків коду до нових рядків наближається до 1, і в той же час це гарантує, що ми маємо суто монотонне зростання ентропії. Це також означає, що ми можемо легко обчислити Hinf, розглядаючи код нульового покоління з однаковою кількістю нових рядків, як рядки коду. (Що можна експериментально підтвердити, оскільки воно досить швидко сходиться.)

a=['ns}z2e1kGe1116k6111gE16;:61kGe1116k6111gE16;:6ek7;:61gg3E1g6;:6ek7;:61gg3E1'];
disp(['a=[''',a,'''];',10,'a=[''',a,'''];',10,[a-10,']]);'],10,[a-10,']]);']]);

Дуже хороша! Ви хотіли б щось замінити 10на 0(і коригуючи для цього решту коду)? Шар 0відображається як простір Матлаба
Луїс Мендо

Дякую за пропозицію! Дозвольте спробувати, але, думаю, є деякі інші вдосконалення, які б значно збільшили бал. Перш за все, це має бути доказом концепції :)
недолік

Я включив зараз вашу пропозицію разом з низкою інших вдосконалень.
недолік

Мені подобається такий графік оптимізації :-)
Луїс Мендо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.