一段非常神奇的 Ruby 代码,不仅可以输出自身,而且可以任意(!)删除一个字符后仍能输出自身

2014-02-22 16:57:03 +08:00
 xell
代码参见 [1],运行很简单:

ruby rquine.rb

即可。官方说明略繁琐,可以自己简单试试,删掉 rquine.rb 中的任意一个字符(有时候甚至两个字符也可以,但不保证),程序还能正常运行并依然输出自身。

当然,能输出自身的程序并不罕见,这类程序叫 quine,得命于大名鼎鼎的奎因 [2],甚至有个网站 [3] 搜集了各类语言的多种实现,有兴趣的朋友可以去瞧瞧。

但能删掉任意一个字符而保持正常,在下才学浅陋,也不熟悉 Ruby,就真的看不出门道了。按一般情况,删掉关键字、变量名或者某个引号等等,几乎肯定会导致语法错误。但这个程序它、它、它竟然不出错,而且还能输出(原本的)自身。我只能感叹神人太多。

Hacker News 上的讨论 [4] 给出了一些线索,有人指出 [5] 第15 和 17 行是关键,但问题就是,你也可以删掉这两行中的某个任意位置的字符啊,程序仍然正确……

希望 v 站大牛予以解惑;或更进一步的,其他语言(GitHub 上另有 Perl 实现)有可能吗?强类型如 Java 有可能吗?

[1] https://github.com/mame/radiation-hardened-quine
[2] http://zh.wikipedia.org/wiki/%E5%A8%81%E6%8B%89%E5%BE%B7%C2%B7%E5%86%AF%C2%B7%E5%A5%A5%E6%9B%BC%C2%B7%E8%92%AF%E5%9B%A0
[3] http://www.nyx.net/~gthompso/quine.htm
[4] https://news.ycombinator.com/item?id=7276976
[5] https://news.ycombinator.com/item?id=7277377
3357 次点击
所在节点    分享发现
1 条回复
arbipher
2014-02-22 23:21:15 +08:00
这个程序的大意如下,

1 eval = 'quine code'
2 eval_copy = 'quine code'
3 eval the longer one of eval and eval_copy
4 rescue mechanism

如果删除的字符在1和2,依靠3可以修复
如果删除的字符在3和4,依靠4可以修复

具体的代码我没有看,但是思路应该是这样。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/101370

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX