І зокрема другий закон : ентропія ізольованої системи з часом зростає .
Для цього виклику,
- " Ізольованою системою " буде вважатися програма або функція (відтепер скорочено "програма");
- Проходження " часу " відповідатиме ітераційним виконанням результатів програми , що розглядаються як нова програма;
- " Ентропія " буде сприйнята як ентропія Шеннона першого порядку (визначиться нижче), що є мірою того, наскільки різноманітні символи рядка.
Змагання
Ваша програма повинна створити не порожню рядок, яка, виконана як програма на тій же мові, створює рядок з більшою ентропією, ніж попередня. Нескінченно ітерація цього процесу виконання-виведення повинна створювати суворо зростаючу послідовність значень ентропії .
Рядки можуть містити будь-які символи 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 для виправлення у визначенні ентропії.