На этом сайте мы соблюдаем законы термодинамики!


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. Это Н 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 за исправление в определении энтропии.

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


4
«На этом сайте мы подчиняемся законам термодинамики!» [
Нужная


1
Я надеялся, что вопрос будет о «Горячих» Сетевых Вопросах.
mbomb007

1
Мне было интересно ... возможно ли бесконечно строго увеличивать энтропию? Если я возьму вывод в его двоичном виде без знака, это в основном последовательность целых чисел в диапазоне [0,255]. Если энтропия оптимальна, когда все символы разные (только предположение), не означает ли это, что строка с наибольшей энтропией имеет длину 256 байт? Это далеко не бесконечно. Или мое предположение неверно.
Osable

2
@Osable Прикрепите копию этой строки к себе, и энтропия будет такой же. Затем удалите один символ, и он будет немного меньше. Переверните процесс, и вы увеличите энтропию. Если вам никогда не удастся достичь максимальной энтропии, вы можете продолжать расти вечно
Луис Мендо

Ответы:


4

Желе, 0,68220949

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

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

Я использовал длинные двойники для вычисления H 90 . Поплавки двойной точности неправильно сообщили, что H 47 <H 46

Первая программа печатает

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

где служит заполнителем для всех символов Юникода с кодовыми точками от 100 000 до 1 000 000 . Фактическая длина составляет 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 символов Юникода, вы можете попробовать ее онлайн!


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отображается как пробел Матлабом
Луис Мендо

Спасибо за предложение! Позвольте мне попробовать это, но я думаю, что есть некоторые другие улучшения, которые могли бы увеличить счет намного больше. Это должно быть прежде всего доказательством концепции :)
flawr

Я включил теперь ваше предложение вместе с кучей других улучшений.
Flawr

Мне нравится этот график оптимизации :-)
Луис Мендо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.