V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xell
V2EX  ›  分享发现

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

  •  
  •   xell · 2014-02-22 16:57:03 +08:00 · 3353 次点击
    这是一个创建于 3927 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码参见 [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
    1 条回复    1970-01-01 08:00:00 +08:00
    arbipher
        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可以修复

    具体的代码我没有看,但是思路应该是这样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   964 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:10 · PVG 05:10 · LAX 13:10 · JFK 16:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.