И, в частности, второй закон : энтропия изолированной системы увеличивается со временем .
Для этого вызова,
- « Изолированная система » будет считаться программой или функцией (далее сокращенно «программа»);
- Прохождение « времени » будет соответствовать повторному выполнению вывода программы , рассматриваемой как новая программа;
- « Энтропия » будет принята как энтропия Шеннона первого порядка (будет определено ниже), которая является мерой того, насколько разнообразны символы строки.
Соревнование
Ваша программа должна генерировать непустую строку, которая при выполнении в качестве программы на том же языке производит строку с большей энтропией, чем предыдущая. Бесконечная итерация этого процесса выполнения-вывода должна приводить к строго возрастающей последовательности значений энтропии .
Строки могут содержать любые символы 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. Это Н 0 .
Строка cdefgh
имеет больше энтропии, чем aabcab
. Мы можем знать это, не вычисляя это, потому что для данного числа символов энтропия максимизируется, когда все частоты равны. Действительно, энтропия H 1 составляет 2,5850.
Строка 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 за исправление в определении энтропии.
Фрагмент для расчета энтропии
источник
Ответы:
Желе, 0,68220949
H 90 = 19,779597644909596802, H 0 = 4,088779347361360882, L 0 = 23
Я использовал длинные двойники для вычисления H 90 . Поплавки двойной точности неправильно сообщили, что H 47 <H 46
Первая программа печатает
где
…
служит заполнителем для всех символов Юникода с кодовыми точками от 100 000 до 1 000 000 . Фактическая длина составляет 900 031 символ.Программа секунд печатает
который, в свою очередь, печатает
и т.п.
Ни одна из этих программ не работает в онлайн-переводчике, который имеет ограничение вывода 100 КБ . Однако, если мы изменим программу для печати
0123456789
вместо вышеупомянутых 900 000 символов Юникода, вы можете попробовать ее онлайн!источник
MATLAB,
9.6923e-0050.005950967872272Эта новая версия является улучшенной версией первого «доказательства концепции». В этой версии я получаю отличный прирост с первой итерации. Это было достигнуто путем «взрыва» вывода первой программы, которая копируется всеми последующими. Затем я также попытался найти минимальное значение
H0
, просто добавив наиболее распространенный символ кода столько раз, сколько возможно. (Это, очевидно, имело предел, так как оно не только уменьшается,H0
но и увеличиваетсяL0
одновременно. Вы можете увидеть развитие показателя в зависимости от размера программы, где размер изменяется, просто добавляя или удаляя1
.) Последующее итерации по-прежнему эквивалентны предыдущей версии ниже.Предыдущая версия:
Следующий код вдохновлен Matlab Quine . Это в основном выводит только себя снова дважды . Подсказка в том, что для любой итерации у нас есть
n
строки кода иn-1
символы новой строки\n
. Так что по мереn
приближения к бесконечности отношение строк кода к новым строкам приближается к 1, и в то же время это гарантирует, что мы имеем строго монотонный рост энтропии. Это также означает, что мы можем легко вычислитьHinf
, просто рассматривая код нулевого поколения с таким же количеством новых строк как строки кода. (Что можно экспериментально подтвердить, так как оно сходится довольно быстро.)источник
10
на0
(и корректировки остальной код для этого)? Чар0
отображается как пробел Матлабом