特别是第二定律:孤立系统的熵随时间增加。
为了这个挑战,
- “ 隔离的系统 ”将被视为程序或功能(从现在开始缩写为“程序”);
- 的“过一次 ”将对应程序的输出的重复执行,被视为一个新的程序;
- “ 熵 ”将被当作香农的一阶熵(将在下面定义),它是衡量字符串字符多样性的一种度量。
挑战
您的程序应该产生一个非空字符串,当以相同语言作为程序执行该字符串时,它会产生一个比前一个具有更大熵的字符串。无限迭代此执行输出过程必须产生严格增加的熵值序列。
字符串可以包含任何Unicode 9.0字符。字符串的顺序必须是确定性的(与随机相反)。
给定字符串的熵将定义如下。标识其唯一字符及其在字符串中的出现次数。频率p 我的的我个独特特点是字符由字符串的长度划分的出现的次数。熵就是
总和超过字符串的所有唯一字符。从技术上讲,这对应于离散随机变量的熵,其分布由字符串中观察到的频率给出。
令H k表示第k个程序产生的字符串的熵,令H 0表示初始程序代码的熵。另外,令L 0以字符表示初始程序的长度。根据挑战要求,序列{ H k }是单调的,并且是有界的(因为现有字符的数量是有限的)。因此,它有一个限制,^ h ∞。
所述得分提交的将是(ħ ∞ - ħ 0)/ 大号0:
- 分子,^ h ∞ - ^ h 0,反映到什么程度你的代码“服从”在一个无限时间跨度增加熵定律。
- 否定符L 0是初始代码的长度,以字符(而不是字节)为单位。
得分最高的代码将获胜。关系将得到解决,以便尽早提交/编辑。
要计算字符串的熵,可以在本文结尾处使用JavaScript代码段(由@flawr提供,并由@Dennis和@ETHproductions进行更正)。
如果获得极限^ h ∞在特定情况下是很难的,你可以使用任何下界,说^ h 20,计算得分(这样你可以使用(^ h 20 - ^ h 0)/ 大号0)。但是无论如何,熵的无限序列必须严格增加。
如果不是显而易见的话,请附上解释或简短的证明熵序列在增加。
例
在一种虚构的语言中,请考虑代码aabcab
,该代码在运行时会产生字符串cdefgh
,在运行时会产生字符串,cdefghi
...
原代码的独特字符a
,b
并且c
,与各频率3/6,2/6和1/6。其熵为1.4591。这是H 0。
字符串的cdefgh
熵大于aabcab
。我们无需计算就可以知道这一点,因为对于给定数量的字符,当所有频率均相等时,熵将最大化。实际上,熵H 1为2.5850。
字符串cdefghi
再次具有比前一个更大的熵。现在我们无需计算,因为添加不存在的字符总是会增加熵。实际上,H 2是2.8074。
如果下一个字符串是42
链,则该链无效,因为H 3为1,小于2.8074。
如果,在另一方面,在序列上产生增加的熵的字符串与限制去ħ ∞ = 3,分数将是(3-1.4597)/ 6 = 0.2567。
致谢
谢谢
@xnor对他帮助改善挑战,特别是说服我从迭代执行中获取无限熵的无限链的确是可能的;
@flawr提供了一些建议,包括修改得分函数,以及编写非常有用的代码段;
@Angs指出了分数函数先前定义中的一个基本缺点;
@Dennis,用于JavaScript代码段中的更正;
@ETHproductions用于摘要中的另一个更正;
@PeterTaylor修正了熵的定义。