И, в частности, второй закон : энтропия изолированной системы увеличивается со временем .
Для этого вызова,
- « Изолированная система » будет считаться программой или функцией (далее сокращенно «программа»);
- Прохождение « времени » будет соответствовать повторному выполнению вывода программы , рассматриваемой как новая программа;
- « Энтропия » будет принята как энтропия Шеннона первого порядка (будет определено ниже), которая является мерой того, насколько разнообразны символы строки.
Соревнование
Ваша программа должна генерировать непустую строку, которая при выполнении в качестве программы на том же языке производит строку с большей энтропией, чем предыдущая. Бесконечная итерация этого процесса выполнения-вывода должна приводить к строго возрастающей последовательности значений энтропии .
Строки могут содержать любые символы 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 за исправление в определении энтропии.