SlideShare une entreprise Scribd logo
1  sur  20
Télécharger pour lire hors ligne
Quine
大林一平
KMC/Dept. Math., Kyoto U./JST CREST
April 17th,2014
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 1 / 20
自己紹介
大林一平 (ohai)
理学研究科数学教室
特定研究員
力学系
最近は歩行の数理モデルの相空間のグローバルな力学系
構造の解析
Ruby
るりま (http://doc.ruby-lang.org)
Ruby/SDL
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 2 / 20
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
例
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
メッセージ
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 / 20
x="puts x"; puts x
再帰させるためには名前を付けるとわかりやすい
変数に代入しておこう
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 7 / 20
x="x=???; puts x"; puts x
x= の部分がないので追加
??? の部分がやはり文字列自身でないとだめ
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 8 / 20
x="x=%s; puts x"; puts x
???の所を%s にしてみる
sprintf を使おう
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 9 / 20
x="x=%s; puts(sprintf(x,??))";
puts(sprintf(x,??))
sprintf にしてみた
文字列の対応するところも変更
??には何を置くのだ
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 10 / 20
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
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
x="x="%s"; puts(sprintf(x,x))";
puts(sprintf(x,x))
今度はバックスラッシュが足りない ()
じゃあバックスラッシュを追加…
してもだめ
バックスラッシュ使うのはだめだ
問題は文字列の中に (") があること
何か別の表現が必要だ
大林一平   (KMC/Dept. Math., Kyoto U./JST CREST) Quine April 17th,2014 13 / 20
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
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
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
まとめ
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
応用例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
応用例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
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

Contenu connexe

Tendances

2020年度秋学期 画像情報処理 第11回 Radon変換と投影定理 (2020. 12. 4)
2020年度秋学期 画像情報処理 第11回 Radon変換と投影定理 (2020. 12. 4)2020年度秋学期 画像情報処理 第11回 Radon変換と投影定理 (2020. 12. 4)
2020年度秋学期 画像情報処理 第11回 Radon変換と投影定理 (2020. 12. 4)Akira Asano
 
PRML 2.3.9-2.4.1
PRML 2.3.9-2.4.1PRML 2.3.9-2.4.1
PRML 2.3.9-2.4.1marugari
 
Robot frontier lesson2
Robot frontier lesson2Robot frontier lesson2
Robot frontier lesson2Ryuichi Ueda
 
2020年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2020. 11. 27)
2020年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2020. 11. 27)2020年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2020. 11. 27)
2020年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2020. 11. 27)Akira Asano
 
2018年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2018. 12. 14)
2018年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2018. 12. 14)2018年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2018. 12. 14)
2018年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2018. 12. 14)Akira Asano
 
最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編)
最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編)最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編)
最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編)Study Group by SciencePark Corp.
 
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)Shuyo Nakatani
 
Lt8 JavaScriptで配列をコピーする
Lt8 JavaScriptで配列をコピーするLt8 JavaScriptで配列をコピーする
Lt8 JavaScriptで配列をコピーするShingo Inoue
 
kagamicomput201806
kagamicomput201806kagamicomput201806
kagamicomput201806swkagami
 
Robot frontier lesson1
Robot frontier lesson1Robot frontier lesson1
Robot frontier lesson1Ryuichi Ueda
 
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)洋史 東平
 
CuPyでAx=bを解きたかった話
CuPyでAx=bを解きたかった話CuPyでAx=bを解きたかった話
CuPyでAx=bを解きたかった話kiyoshiiriemon
 
2019年度秋学期 画像情報処理 第12回 逆投影法による再構成 (2019. 12. 20)
2019年度秋学期 画像情報処理 第12回 逆投影法による再構成 (2019. 12. 20)2019年度秋学期 画像情報処理 第12回 逆投影法による再構成 (2019. 12. 20)
2019年度秋学期 画像情報処理 第12回 逆投影法による再構成 (2019. 12. 20)Akira Asano
 
Robot frontier lesson3
Robot frontier lesson3Robot frontier lesson3
Robot frontier lesson3Ryuichi Ueda
 
Tokyo.R 白熱教室「これからのRcppの話をしよう」
Tokyo.R 白熱教室「これからのRcppの話をしよう」Tokyo.R 白熱教室「これからのRcppの話をしよう」
Tokyo.R 白熱教室「これからのRcppの話をしよう」Nagi Teramo
 
2019年度秋学期 画像情報処理 第11回 radon変換と投影定理 (2019. 12. 13)
2019年度秋学期 画像情報処理 第11回 radon変換と投影定理 (2019. 12. 13)2019年度秋学期 画像情報処理 第11回 radon変換と投影定理 (2019. 12. 13)
2019年度秋学期 画像情報処理 第11回 radon変換と投影定理 (2019. 12. 13)Akira Asano
 

Tendances (17)

2020年度秋学期 画像情報処理 第11回 Radon変換と投影定理 (2020. 12. 4)
2020年度秋学期 画像情報処理 第11回 Radon変換と投影定理 (2020. 12. 4)2020年度秋学期 画像情報処理 第11回 Radon変換と投影定理 (2020. 12. 4)
2020年度秋学期 画像情報処理 第11回 Radon変換と投影定理 (2020. 12. 4)
 
PRML 2.3.9-2.4.1
PRML 2.3.9-2.4.1PRML 2.3.9-2.4.1
PRML 2.3.9-2.4.1
 
Robot frontier lesson2
Robot frontier lesson2Robot frontier lesson2
Robot frontier lesson2
 
2020年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2020. 11. 27)
2020年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2020. 11. 27)2020年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2020. 11. 27)
2020年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2020. 11. 27)
 
2018年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2018. 12. 14)
2018年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2018. 12. 14)2018年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2018. 12. 14)
2018年度秋学期 画像情報処理 第10回 Radon変換と投影定理 (2018. 12. 14)
 
最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編)
最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編)最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編)
最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編)
 
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
 
Lt8 JavaScriptで配列をコピーする
Lt8 JavaScriptで配列をコピーするLt8 JavaScriptで配列をコピーする
Lt8 JavaScriptで配列をコピーする
 
kagamicomput201806
kagamicomput201806kagamicomput201806
kagamicomput201806
 
Robot frontier lesson1
Robot frontier lesson1Robot frontier lesson1
Robot frontier lesson1
 
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
 
CuPyでAx=bを解きたかった話
CuPyでAx=bを解きたかった話CuPyでAx=bを解きたかった話
CuPyでAx=bを解きたかった話
 
2019年度秋学期 画像情報処理 第12回 逆投影法による再構成 (2019. 12. 20)
2019年度秋学期 画像情報処理 第12回 逆投影法による再構成 (2019. 12. 20)2019年度秋学期 画像情報処理 第12回 逆投影法による再構成 (2019. 12. 20)
2019年度秋学期 画像情報処理 第12回 逆投影法による再構成 (2019. 12. 20)
 
Robot frontier lesson3
Robot frontier lesson3Robot frontier lesson3
Robot frontier lesson3
 
Tokyo.R 白熱教室「これからのRcppの話をしよう」
Tokyo.R 白熱教室「これからのRcppの話をしよう」Tokyo.R 白熱教室「これからのRcppの話をしよう」
Tokyo.R 白熱教室「これからのRcppの話をしよう」
 
中級正規表現
中級正規表現中級正規表現
中級正規表現
 
2019年度秋学期 画像情報処理 第11回 radon変換と投影定理 (2019. 12. 13)
2019年度秋学期 画像情報処理 第11回 radon変換と投影定理 (2019. 12. 13)2019年度秋学期 画像情報処理 第11回 radon変換と投影定理 (2019. 12. 13)
2019年度秋学期 画像情報処理 第11回 radon変換と投影定理 (2019. 12. 13)
 

Plus de 京大 マイコンクラブ

かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話京大 マイコンクラブ
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換京大 マイコンクラブ
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?京大 マイコンクラブ
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜京大 マイコンクラブ
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会京大 マイコンクラブ
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」京大 マイコンクラブ
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編京大 マイコンクラブ
 

Plus de 京大 マイコンクラブ (20)

テキストファイルを読む💪 第1回
テキストファイルを読む💪  第1回テキストファイルを読む💪  第1回
テキストファイルを読む💪 第1回
 
かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話
 
Common Lisp入門
Common Lisp入門Common Lisp入門
Common Lisp入門
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
Geometry with Unity
Geometry with UnityGeometry with Unity
Geometry with Unity
 
セミコロンレスc++
セミコロンレスc++セミコロンレスc++
セミコロンレスc++
 
エンジニアと健康
エンジニアと健康エンジニアと健康
エンジニアと健康
 
女の子になれなかった人のために
女の子になれなかった人のために女の子になれなかった人のために
女の子になれなかった人のために
 
Pietで競プロしよう
Pietで競プロしようPietで競プロしよう
Pietで競プロしよう
 
もし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったらもし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったら
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会
 
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」
 
hideya流 テストプレイ観察術
hideya流 テストプレイ観察術hideya流 テストプレイ観察術
hideya流 テストプレイ観察術
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
 
Altseed
AltseedAltseed
Altseed
 
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回
 

Quine