Slide 1

Slide 1 text

Crystalで 最長コマンドしりとり 2020/01/17 Takuya Yamaguchi @no_clock / たいぷらいたー

Slide 2

Slide 2 text

すき 京都、百合、 C#/Ruby/Vim ← 京都・嵐山で 限界オタクと 化している様子 圓光寺 (京都市左京区一乗寺, 2016/11/14撮影)

Slide 3

Slide 3 text

Linux コマンドしりとり ● しりとりに使える単語は Linux コマンド限定 ● Debian系ディストリビューションでの例: apt -> tee -> emacs -> service -> env -> vim -> mkdir -> …

Slide 4

Slide 4 text

最長 Linux コマンドしりとり ● 最長でいくつ繋がるか? ○ 今回は「Docker imageに入っている」縛り Docker image:tag コマンド数 しりとり長 alpine:3.10.3 317 ? centos:8 573 ? debian:10.2 409 ?

Slide 5

Slide 5 text

最長しりとり問題の解法 (乾・品野・鴻池・小谷、2005) 有向グラフの有向辺 の数が最大となる準 オイラー部分グラフ (一筆書き)を見つ ける(NP困難) https://ci.nii.ac.jp/naid/110002768734

Slide 6

Slide 6 text

最長しりとり問題の解法 (乾・品野・鴻池・小谷、2005) 単語数を有向辺の容量 とし、しりとりの条件 を満たしつつ各有向辺 を流れるフロー量の総 和を最大化する問題 https://ci.nii.ac.jp/naid/110002768734

Slide 7

Slide 7 text

最長しりとり問題の解法 (乾・品野・鴻池・小谷、2005) 単語数を有向辺の容量 とし、しりとりの条件 を満たしつつ各有向辺 を流れるフロー量の総 和を最大化する問題 https://ci.nii.ac.jp/naid/110002768734 2 2 1 1 1 1 1 1 ・始点のみ 出る量が1多い ・終点のみ 入る量が1多い ・それ以外は 入る量=出る量 ・連結である

Slide 8

Slide 8 text

最長しりとり問題の解法 (乾・品野・鴻池・小谷、2005) 単語数を有向辺の容量 とし、しりとりの条件 を満たしつつ各有向辺 を流れるフロー量の総 和を最大化する問題 https://ci.nii.ac.jp/naid/110002768734 2 2 1 1 1 1 1 1 ・始点のみ 出る量が1多い ・終点のみ 入る量が1多い ・それ以外は 入る量=出る量 ・連結である (緩和問題) いい感じに解く(論文参照) 1. 整数計画問題として定式化 2. しりとりの条件を一部外して パワーで解く(緩和問題) 3. 条件を足してパワーで解く、 を繰り返して最適解を求める 4. 最適解からしりとり生成

Slide 9

Slide 9 text

既にある 以下、 車輪の 再発明 https://chiraura.hhiro.net/shiritori/

Slide 10

Slide 10 text

Crystal ● 触ってみたかっただけ ● Rubyによく似た構文 ● 静的型付け+型推論 ● v0.32.1 (2019/12/18) ● brew install crystal https://crystal-lang.org/

Slide 11

Slide 11 text

Crystal: コード(下線部はRubyとの差分)

Slide 12

Slide 12 text

Crystal: 型がある

Slide 13

Slide 13 text

Crystalでコマンドしりとり ● https://github.com/typewriter/any-shiritori ○ 整数計画問題のソルバにGLPKを使用 $ wc -l src/* 26 src/any_shiritori.cr 257 src/branch_and_bound_solver.cr $ time ./any_shiritori debian-10.2.txt real 0.14

Slide 14

Slide 14 text

● 最長でいくつ繋がったか? Docker image:tag コマンド数 しりとり長 alpine:3.10.3 317 ? centos:8 573 ? debian:10.2 409 ? Docker image:tag コマンド数 しりとり長 alpine:3.10.3 317 173 centos:8 573 326 debian:10.2 409 231 最長コマンドしりとり: 結果

Slide 15

Slide 15 text

Debian GNU/Linux 10.2のコマンドしりとり znew => wc => ctrlaltdel => ldconfig => groupmod => dd => diff => fgrep => paste => e2image => expr => runuser => rmt-tar => rmdir => rm => md5sum => mkfs.cramfs => ss => swapon => nologin => newusers => switch_root => tzselect => tsort => tset => tput => timeout => test => taskset => tarcat => tune2fs => stat => tabs => su => users => split => tty => yes => sum => mkfs.bfs => sha512sum => mkfs => sha384sum => mke2fs => sha256sum => md5sum.textutils => sha224sum => mkhomedir_helper => runcon => nsenter => ...

Slide 16

Slide 16 text

Debian GNU/Linux 10.2のコマンドしりとり ... => mount => tic => choom => mktemp => prlimit => tc => chmem => mkswap => pivot_root => tac => cppw => wdctl => lsmem => mv => vipw => wipefs => sync => chcpu => useradd => debconf-show => wall => ls => sdiff => fdformat => tee => e2freefrag => getcap => pwunconv => vdir => raw => whoami => install => lastb => badblocks => start-stop-daemon => numfmt => touch => hwclock => killall5 ふーん…(知らないコマンド多すぎ)

Slide 17

Slide 17 text

おまけ: 日本語対応(47都道府県 → 長さ4) $ ./any_shiritori jp_prefectures.txt Length: 4 Shiritori: やまなし => しが => かがわ => わかやま 短い(こなみかん)

Slide 18

Slide 18 text

Crystalで書いてみて(個人の感想です) ● RubyのようでRubyでない、似た構文の別言語 ○ 概ね書きやすい、型があって安心、速い ○ 細かな差異やgemが使えない点に苦しむ (Rubyのエコシステムの偉大さも感じる) ● 今後に期待したい ○ けどGoが強いからなぁ…

Slide 19

Slide 19 text

まとめ Crystal で最長コマンドしりとりを解いた Docker image:tag コマンド数 しりとり長 alpine:3.10.3 317 173 centos:8 573 326 debian:10.2 409 231