Quine
大林一平
KMC/Dept. Math., Kyoto U./JST CREST
April 17th,2014
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17...
自己紹介
大林一平 (ohai)
理学研究科数学教室
特定研究員
力学系
最近は歩行の数理モデルの相空間のグローバルな力学系
構造の解析
Ruby
るりま (http://doc.ruby-lang.org)
Ruby/SDL
大林一平   (...
Quine
実行した出力結果が自分自身と一致するプログラム
ruby q.rb | diff - q.rb
ruby q.rb | ruby - | ruby - | diff - q.rb
プログラマのプログラムによるエンターテイメント
実用...
例
x="x=%c%s%c; puts(sprintf(x,34,x,34))";
puts(sprintf(x,34,x,34))
見やすさのために改行してあるけど 1 行です
大林一平   (KMC/Dept. Math., Kyoto U...
メッセージ
Quine の魔術を解明する
Quine は怖くない
だれでも作れる Quine
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 5 / 20
作ってみよう
puts "puts ???"
??? の所にこの文字列を置きたい
このままだと無理
再帰的
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 6...
x="puts x"; puts x
再帰させるためには名前を付けるとわかりやすい
変数に代入しておこう
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 7 ...
x="x=???; puts x"; puts x
x= の部分がないので追加
??? の部分がやはり文字列自身でないとだめ
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17...
x="x=%s; puts x"; puts x
???の所を%s にしてみる
sprintf を使おう
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 9 ...
x="x=%s; puts(sprintf(x,??))";
puts(sprintf(x,??))
sprintf にしてみた
文字列の対応するところも変更
??には何を置くのだ
大林一平   (KMC/Dept. Math., Kyoto ...
x="x=%s; puts(sprintf(x,x))";
puts(sprintf(x,x))
%s には文字列を埋めこみたかったのだ
つまり ?? には x を置く
完璧!
動かしてみよう (q1.rb)
大林一平   (KMC/Dept....
x="x="%s"; puts(sprintf(x,x))";
puts(sprintf(x,x))
文字列のダブルクオート (") が足りない
そこで文字列に追加
今度こそ
動かしてみよう (q2.rb)
大林一平   (KMC/Dept. ...
x="x="%s"; puts(sprintf(x,x))";
puts(sprintf(x,x))
今度はバックスラッシュが足りない ()
じゃあバックスラッシュを追加…
してもだめ
バックスラッシュ使うのはだめだ
問題は文字列の中に (")...
x="x=%s%s%s; puts(sprintf(x,??,x??))";
puts(sprintf(x,??,x,??))
%s で置きかえ!
sprintf でなんとかしよう
?? には何を置けばよい
""" という文字列
大林一平   ...
x="x=%s%s%s; puts(sprintf(x,""",x,""")
puts(sprintf(x,""",x,"""))
置き換えた
文字列の中も置き換える必要あり
さっきと同じ
つまり""" という文字を使わずに""" という文字
...
x="x=%c%s%c; puts(sprintf(x,34,x,34))";
puts(sprintf(x,34,x,34))
34 と %c を使う
ASCII
今度こそ完成
大林一平   (KMC/Dept. Math., Kyoto U...
まとめ
Quine を作るこつ
変数 x が指す文字列にその文字列を埋め込む
x=”x=%s; ...”; sprintf(x,x)
あとは言語仕様をごまかすための多少の工夫
誰でも Quine は作れます
Quine は怖くない
mame さ...
応用例1
2.times{
x="2.times{ x=%c%s%c; puts(sprintf(x,34,x,34)) }
puts(sprintf(x,34,x,34)) }
細胞分裂 Quine
実行するたびに倍になります
大林一平   ...
応用例2
X
y="puts(%c%s%c)"; x="y=%c%s%c; x=%c%s%c;
puts(sprintf(sprintf(y,39,x,39),
34,y,34,34,x,34))";
puts(sprintf(sprintf(...
Y
puts('y="puts(%c%s%c)";
x="y=%c%s%c; x=%c%s%c;
puts(sprintf(sprintf(y,39,x,39),
34,y,34,34,x,34))";
puts(sprintf(sprintf...
Upcoming SlideShare
Loading in...5
×

Quine

856

Published on

やさしい Quine の作り方

Published in: Software
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
856
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
3
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Quine

  1. 1. Quine 大林一平 KMC/Dept. Math., Kyoto U./JST CREST April 17th,2014 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 1 / 20
  2. 2. 自己紹介 大林一平 (ohai) 理学研究科数学教室 特定研究員 力学系 最近は歩行の数理モデルの相空間のグローバルな力学系 構造の解析 Ruby るりま (http://doc.ruby-lang.org) Ruby/SDL 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 2 / 20
  3. 3. Quine 実行した出力結果が自分自身と一致するプログラム ruby q.rb | diff - q.rb ruby q.rb | ruby - | ruby - | diff - q.rb プログラマのプログラムによるエンターテイメント 実用的な意味はない 理論的には興味深い側面を持つ プログラムの持つ「情報の量」とは何だろう? といっ た問題に関係している 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 3 / 20
  4. 4. 例 x="x=%c%s%c; puts(sprintf(x,34,x,34))"; puts(sprintf(x,34,x,34)) 見やすさのために改行してあるけど 1 行です 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 4 / 20
  5. 5. メッセージ Quine の魔術を解明する Quine は怖くない だれでも作れる Quine 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 5 / 20
  6. 6. 作ってみよう puts "puts ???" ??? の所にこの文字列を置きたい このままだと無理 再帰的 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 6 / 20
  7. 7. x="puts x"; puts x 再帰させるためには名前を付けるとわかりやすい 変数に代入しておこう 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 7 / 20
  8. 8. x="x=???; puts x"; puts x x= の部分がないので追加 ??? の部分がやはり文字列自身でないとだめ 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 8 / 20
  9. 9. x="x=%s; puts x"; puts x ???の所を%s にしてみる sprintf を使おう 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 9 / 20
  10. 10. x="x=%s; puts(sprintf(x,??))"; puts(sprintf(x,??)) sprintf にしてみた 文字列の対応するところも変更 ??には何を置くのだ 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 10 / 20
  11. 11. x="x=%s; puts(sprintf(x,x))"; puts(sprintf(x,x)) %s には文字列を埋めこみたかったのだ つまり ?? には x を置く 完璧! 動かしてみよう (q1.rb) 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 11 / 20
  12. 12. x="x="%s"; puts(sprintf(x,x))"; puts(sprintf(x,x)) 文字列のダブルクオート (") が足りない そこで文字列に追加 今度こそ 動かしてみよう (q2.rb) 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 12 / 20
  13. 13. x="x="%s"; puts(sprintf(x,x))"; puts(sprintf(x,x)) 今度はバックスラッシュが足りない () じゃあバックスラッシュを追加… してもだめ バックスラッシュ使うのはだめだ 問題は文字列の中に (") があること 何か別の表現が必要だ 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 13 / 20
  14. 14. x="x=%s%s%s; puts(sprintf(x,??,x??))"; puts(sprintf(x,??,x,??)) %s で置きかえ! sprintf でなんとかしよう ?? には何を置けばよい """ という文字列 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 14 / 20
  15. 15. x="x=%s%s%s; puts(sprintf(x,""",x,""") puts(sprintf(x,""",x,""")) 置き換えた 文字列の中も置き換える必要あり さっきと同じ つまり""" という文字を使わずに""" という文字 列を表現する方法はないか? 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 15 / 20
  16. 16. x="x=%c%s%c; puts(sprintf(x,34,x,34))"; puts(sprintf(x,34,x,34)) 34 と %c を使う ASCII 今度こそ完成 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 16 / 20
  17. 17. まとめ Quine を作るこつ 変数 x が指す文字列にその文字列を埋め込む x=”x=%s; ...”; sprintf(x,x) あとは言語仕様をごまかすための多少の工夫 誰でも Quine は作れます Quine は怖くない mame さんという super quine artist の作品がおす すめ 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 17 / 20
  18. 18. 応用例1 2.times{ x="2.times{ x=%c%s%c; puts(sprintf(x,34,x,34)) } puts(sprintf(x,34,x,34)) } 細胞分裂 Quine 実行するたびに倍になります 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 18 / 20
  19. 19. 応用例2 X y="puts(%c%s%c)"; x="y=%c%s%c; x=%c%s%c; puts(sprintf(sprintf(y,39,x,39), 34,y,34,34,x,34))"; puts(sprintf(sprintf(y,39,x,39), 34,y,34,34,x,34)) 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 19 / 20
  20. 20. Y puts('y="puts(%c%s%c)"; x="y=%c%s%c; x=%c%s%c; puts(sprintf(sprintf(y,39,x,39), 34,y,34,34,x,34))"; puts(sprintf(sprintf(y,39,x,39), 34,y,34,34,x,34))') X -> Y -> X 大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 20 / 20
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×