各种各样的 Ruby Quine
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 aprint "EOF\n"print aEOFprint "a=<<'EOF'"print aprint "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,2puts <<2*2,22
非常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( "; xxprint ")\n"; xx)def xx$a.each do |x| if x =~ /xx/print x+"\n" else print x, " " end end end; print "$a=%w( "; xxprint ")\n"; xx 来个对称的
a="a=%p\nb=%p\nc=%p\nputs a%%\nputs c"b="c=%p\nb=%p\na=%p"c="puts b%"puts a%puts cputs b%c="puts b%"b="c=%p\nb=%p\na=%p"a="a=%p\nb=%p\nc=%p\nputs a%%\nputs c"
最后来个比较另类的
require "base64"class Quinedef doSomething(operation) puts "#{Base64.decode64(operation)} encodedBody=\"#{operation}\" Quine.new.doSomething(encodedBody)" endend encodedBody="cmVxdWlyZSAiYmFzZTY0IgoKY2xhc3MgUXVpbmUKICAKICBkZWYgZG9Tb21ldGhpbmcob3BlcmF0aW9uKQogICAgIHB1dHMgIiN7QmFzZTY0LmRlY29kZTY0KG9wZXJhdGlvbil9CiAgICAgZW5jb2RlZEJvZHk9XCIje29wZXJhdGlvbn1cIgogICAgIFF1aW5lLm5ldy5kb1NvbWV0aGluZyhlbmNvZGVkQm9keSkiCiAgICBlbmQKZW5k" Quine.new.doSomething(encodedBody)
添一个最短的
puts File.read(__FILE__)
页:
[1]