各种各样的 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 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__)

 

 

 

 

你可能感兴趣的:(C++,c,C#,Ruby,lisp)