在此站点上,我们遵守热力学定律!


23

特别是第二定律孤立系统的熵随时间增加

为了这个挑战,

  • 隔离的系统 ”将被视为程序或功能(从现在开始缩写为“程序”);
  • 的“过一次 ”将对应程序的输出的重复执行,被视为一个新的程序;
  • ”将被当作香农的一阶熵(将在下面定义),它是衡量字符串字符多样性的一种度量。

挑战

您的程序应该产生一个非空字符串,当以相同语言作为程序执行该字符串时,它会产生一个比前一个具有更大熵的字符串。无限迭代此执行输出过程必须产生严格增加的熵值序列

字符串可以包含任何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...

原代码的独特字符ab并且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修正了熵的定义。

用于计算熵的代码段


4
“在此站点上,我们遵守热力学定律!” [需要引用]
TuxCrafting,2016年

2
这里是 :-)
路易斯Mendo

1
我希望该问题与“热”网络问题有关。
mbomb007 '16

1
我在想...实际上有可能无限严格地增加熵吗?如果我采用无符号二进制形式的输出,则基本上是[0,255]范围内的整数序列。如果在所有字符都不同时(只是一个假设),熵是最佳的,这不意味着熵最大的字符串长256个字节吗?它远非无限。或我的假设是错误的。
2016年

2
@Osable将该字符串的副本附加到其自身,并且熵将相同。然后删除一个字符,它将略小。反转过程,您已经增加了熵。如果您永远无法达到最大熵,则可以永远增加
Luis Mendo

Answers:


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,0001,000,000之间的所有Unicode字符均用作占位符。实际长度为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 KB。但是,如果我们修改程序以打印0123456789而不是前面提到的900,000个 Unicode字符,则可以在线尝试!


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,']]);']]);

非常好!你会有所收获更换100(和调整代码的其余部分为)?0Matlab将Char 显示为空间
Luis Mendo

谢谢你的建议!让我尝试一下,但是我认为还有其他一些改进可以使得分进一步提高。首先,这应该是概念的证明:)
更加模糊的

现在,我包括了您的建议以及许多其他改进。
瑕疵的

我喜欢该优化图:-)
路易斯·门多
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.