様々なルビークイーン


Quineは自身のプログラムを出力し、Ken Thompsonの論文から最初に源を発した.
これからはいろいろなプログラミング言語でこのゲームをします.
ルビーは柔軟性で有名ですが、Quineはどのくらいの模様ができますか?私はたくさん集めて、これらのコードを研究して1つは面白くて、1つも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

 
以上の2つはC言語QUINEの直接改編であり、比較的理解しやすい.
a= <<'EOF'
print "a=<<'EOF'"
print a
print "EOF
" print a EOF print "a=<<'EOF'" print a print "EOF
" 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+"
" else print x, " " end end end; print "$a=%w( "; xx print ")
"; xx ) def xx $a.each do |x| if x =~ /xx/ print x+"
" else print x, " " end end end; print "$a=%w( "; xx print ")
"; xx

対称的な
a="a=%p
b=%p
c=%p
puts a%%[a,b,c]
puts c" b="c=%p
b=%p
a=%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
b=%p
a=%p" a="a=%p
b=%p
c=%p
puts a%%[a,b,c]
puts 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__)