Quine就是输出自身的程序,最早源自Ken Thompson 的一篇论文。
以后各种程序设计语言都会玩这个游戏。
Ruby以灵活著称,Quine能玩出多少花样呢?我收集了不少,研究这些代码一个是好玩,一个也能加深对RUBY理解。
printf(s = 'printf(s = %c%s%c, 39, s, 39)', 39, s, 39)
s="s=%c%s%c; printf s,34,s,34,10%c"; printf s,34,s,34,10
以上这两个是对C语言QUINE的直接改编,相对好理解。
a= <<'EOF' print "a=<<'EOF'" print a print "EOF\n" print a EOF print "a=<<'EOF'" print a print "EOF\n" print a
这个利用了HERE的语法特点,也好理解。
def x(s); puts %Q{#{s} x(%q{#{s}})}; end; x(%q{def x(s); puts %Q{#{s} x(%q{#{s}})}; end;})
这个不好懂,改编自一个LISP QUINE,应该是用到函数式程序的特点吧。
(lambda (x) (list x (list (quote quote) x))) (quote (lambda (x) (list x (list (quote quote) x)))))
一个非常简单的,但却没懂
puts <<2*2,2 puts <<2*2,2 2
非常CUTE,但查了<<用法,没对,分隔参数的处理讲的太清楚。谁理解了给说一下。
_="_=%p;puts _%%_";puts _%_
这个极短,%p用到了str.inspect特性。
x=%q/puts "x=%q\057#{x}\057;#{x}"/;puts "x=%q\057#{x}\057;#{x}"
利用了/ /,#{x}等特性
再来个长的
$a=%w( def xx $a.each do |x| if x =~ /xx/ print x+"\n" else print x, " " end end end; print "$a=%w( "; xx print ")\n"; xx ) def xx $a.each do |x| if x =~ /xx/ print x+"\n" else print x, " " end end end; print "$a=%w( "; xx print ")\n"; xx
来个对称的
a="a=%p\nb=%p\nc=%p\nputs a%%[a,b,c]\nputs c" b="c=%p\nb=%p\na=%p" c="puts b%[c,b,a]" puts a%[a,b,c] puts c puts b%[c,b,a] c="puts b%[c,b,a]" b="c=%p\nb=%p\na=%p" a="a=%p\nb=%p\nc=%p\nputs a%%[a,b,c]\nputs c"
最后来个比较另类的
require "base64" class Quine def doSomething(operation) puts "#{Base64.decode64(operation)} encodedBody=\"#{operation}\" Quine.new.doSomething(encodedBody)" end end encodedBody="cmVxdWlyZSAiYmFzZTY0IgoKY2xhc3MgUXVpbmUKICAKICBkZWYgZG9Tb21l dGhpbmcob3BlcmF0aW9uKQogICAgIHB1dHMgIiN7QmFzZTY0LmRlY29kZTY0 KG9wZXJhdGlvbil9CiAgICAgZW5jb2RlZEJvZHk9XCIje29wZXJhdGlvbn1c IgogICAgIFF1aW5lLm5ldy5kb1NvbWV0aGluZyhlbmNvZGVkQm9keSkiCiAg ICBlbmQKZW5k" Quine.new.doSomething(encodedBody)
添一个最短的
puts File.read(__FILE__)