这个使用不可打印的unicode字符的混淆hello world程序如何工作

时间:2015-12-24 16:22:35

标签: ruby

cartoonthis hello world program作为Ruby代码的示例。

代码看起来像这样;但有一些不可打印的unicode字符,我无法进入Stack Overflow代码编辑器。

      = 1
      =  + 
      =   *  + 
      =    *  
      = 
      [      *(   +  )+  , 
             =     *    + , 
             =     *    +    -  , 
            , 
            =        +    ,
        *  +    +  , 
        *    -  *    +   +  , 
           , 
           + +  , 
            , 
        *    ,     + +  , 
        ]
puts      .map(&:chr).join

我想知道它是如何工作的,但是当我最初尝试在几个在线IDE中运行它时,它们都报告了语法错误,因为GitHub没有将unicode字符放在Web版本中。任何人试图从这里或GitHub页面复制代码而不是下载zip版本(以获取特殊字符)将有同样的问题。找到了让它运行的问题,它是如何工作的?

1 个答案:

答案 0 :(得分:14)

在压缩文件中,使用类似下划线的字符。用下划线替换这些字符不会改变程序的行为,所以我会在这里这样做:

_     = 1
__    = _+_
___   = __*__+_
____  = ___*__
_____ = 
      [____  *(___+__)+__, 
    _______  = ____*____+_, 
    ________ = ____*____+____-__, 
    ________, 
    _______ = _______+____,
    ____*__+____+__, 
    ____*____-__*____+___+__, 
    _______, 
    _______+_+__, 
    ________, 
    ____*____, ____+_+__, 
    ____]
puts _____.map(&:chr).join

请注意,一到八个(不包括六个)_的序列被用作不同的变量,因此我们将其替换为ab,... { {1}}(不包括h),以便于阅读:

f

通常的格式化后,您会得到:

a     = 1
b    = a+a
c   = b*b+a
d  = c*b
e = 
      [d  *(c+b)+b, 
    g  = d*d+a, 
    h = d*d+d-b, 
    h, 
    g = g+d,
    d*b+d+b, 
    d*d-b*d+c+b, 
    g, 
    g+a+b, 
    h, 
    d*d, d+a+b, 
    d]
puts e.map(&:chr).join

一切都以a = 1 b = a + a c = b * b + a d = c * b e = [ d * (c + b) + b, g = d * d + a, h = d * d + d - b, h, g = g + d, d * b + d + b, d * d - b * d + c + b, g, g + a + b, h, d * d, d + a + b, d ] puts e.map(&:chr).join 开头,最终定义数组a = 1,即:

e

它的每个元素都是e # => [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 13, 10] 中的ASCII字符代码。通过将"Hello World\r\n"应用于该号码,您可以获得:

chr

当你["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d", "\r", "\n"] 他们和join时,你会得到输出:

puts