【发布时间】:2012-08-26 20:24:33
【问题描述】:
编写程序以在 1 行源代码中完成任务是一种常见的程序员爱好。但这有点微不足道:我可以使用 1 000 000 行代码,删除所有换行符,瞧! 1 行!
所以为了让事情变得有趣,我们可以计算 语句。对于 C 风格的语言,计算语句的一种简单方法是计算分号:因此嵌套一百万个 if-else 就可以了。
假设您有一个带有 n 语句的程序 P。它经过一系列状态(变量值)s(其中 s 是一个向量)并产生输出x。我们可以提出两个问题:
- 语句少于 n 个的程序能否产生输出 x?
- 语句少于 n 个的程序能否通过 s 的某个子集?
马上,有些事情就变得显而易见了。采取以下程序:
int sum = a+b;
float mean = sum/2.0;
return mean;
我们可以将它重构(或者我应该说“defactor”)成一个单行:
return (a+b)/2.0;
每个程序都可以分解为一行吗?参加这个程序:
string x = "";
for (int i = 0; i<a; i++) // Should these semicolons count?
{
x = x + ".";
}
return x;
这有点挑战性。
这个问题可以通过使用少于 n 个语句的每个可能的程序来详尽地回答,这是一个有限的数字(理论上你可以有具有无限多个可能值的常数, 但没有真正的语言有无限的内存来存储它们或无限的磁盘空间来容纳源代码。
但是:
A.是否有可能证明一个程序 P 产生 x(也许通过 s ) 与 n 语句,没有 Q 可以在 >m 语句可以找到(以有效的方式)?
B.是否可以(以有效的方式)找到最小值 n?
C.最小 n 是否保证为 1?
你可以假设任何你想要的语言,虽然真正的语言会更有趣。如果您的语言不寻常,请用您的语言提供“陈述”的定义。
我假设使用命令式语言,但欢迎将问题改编为函数式语言。
有一个简单的解决方案:对于任何 P,运行 P 并记录 x。现在编写一个程序 Q,它只打印 x。对于有输入的程序,请用很长的 if-else 将每个输入映射到正确的输出。
这个解决方案不能令人满意,虽然我不完全确定为什么。首先,对于无限可能的输入,这是不可能的(但我已经说过真正的程序是有限的,所以我们可以说真正的输入是有限的)。其次,它在技术上只通过 s 的一个子集:即空集。第三,真是虎头蛇尾。
也感谢任何帮助定义这个小聪明技巧的帮助。
PS:不管我怎么说,这不是功课。我只是对这个问题感到好奇,并试图尽可能清楚地表达出来。当然,我还是会说,如果它是家庭作业,那么...
【问题讨论】:
-
听起来太像家庭作业了...
-
那将是相当奇怪的作业:)。不,我只是好奇。
-
如果要统计语句的数量,逗号运算符呢?在 C/C++ 中,存在初始化问题,每个类型必须至少采用一个不同的语句。但是,在那之后,您可以使用逗号运算符做任何您想做的事情。例如。 (以您的初始示例),您可以写
return (sum=a+b,mean=sum/2.0,mean); -
如果逗号不等于额外的语句(与分号不同),那么它就是。无论您是否使用
{},每个循环都需要至少一个分号(而不是逗号)来终止。但是你可以在没有额外语句的情况下使用逗号来执行伪循环。例如。而不是for (a=0;a<b;a++) c+=a;,你可以说a=0,(++a<b?c+=a:0),(++a<b?c+=a:0),(++a<b?c+=a:0),(++a<b?c+=a:0),它允许伪循环迭代任意恒定次数(在本例中,最多4次)。 -
看en.wikipedia.org/wiki/Kolmogorov_complexity(写函数的最短代码长度)。陈述的数量相当恶劣。
标签: computer-science theory proof