cartoon有this hello world program作为Ruby代码的示例。
代码看起来像这样;但有一些不可打印的unicode字符,我无法进入Stack Overflow代码编辑器。
= 1
= +
= * +
= *
=
[ *( + )+ ,
= * + ,
= * + - ,
,
= + ,
* + + ,
* - * + + ,
,
+ + ,
,
* , + + ,
]
puts .map(&:chr).join
我想知道它是如何工作的,但是当我最初尝试在几个在线IDE中运行它时,它们都报告了语法错误,因为GitHub没有将unicode字符放在Web版本中。任何人试图从这里或GitHub页面复制代码而不是下载zip版本(以获取特殊字符)将有同样的问题。找到了让它运行的问题,它是如何工作的?
答案 0 :(得分:14)
在压缩文件中,使用类似下划线的字符。用下划线替换这些字符不会改变程序的行为,所以我会在这里这样做:
_ = 1
__ = _+_
___ = __*__+_
____ = ___*__
_____ =
[____ *(___+__)+__,
_______ = ____*____+_,
________ = ____*____+____-__,
________,
_______ = _______+____,
____*__+____+__,
____*____-__*____+___+__,
_______,
_______+_+__,
________,
____*____, ____+_+__,
____]
puts _____.map(&:chr).join
请注意,一到八个(不包括六个)_
的序列被用作不同的变量,因此我们将其替换为a
,b
,... { {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