2020/01/17(Fri) 社内LT会で発表したスライドです。
参考 - CiNii 論文 - 最長しりとり問題の解法: https://ci.nii.ac.jp/naid/110002768734 - 単語集合から最長しりとりを得るプログラム: https://chiraura.hhiro.net/shiritori/ - 拙作: https://github.com/typewriter/any-shiritori
Crystalで最長コマンドしりとり2020/01/17Takuya Yamaguchi@no_clock / たいぷらいたー
View Slide
すき京都、百合、C#/Ruby/Vim←京都・嵐山で限界オタクと化している様子圓光寺 (京都市左京区一乗寺, 2016/11/14撮影)
Linux コマンドしりとり● しりとりに使える単語は Linux コマンド限定● Debian系ディストリビューションでの例:apt -> tee -> emacs -> service ->env -> vim -> mkdir -> …
最長 Linux コマンドしりとり● 最長でいくつ繋がるか?○ 今回は「Docker imageに入っている」縛りDocker image:tag コマンド数 しりとり長alpine:3.10.3 317 ?centos:8 573 ?debian:10.2 409 ?
最長しりとり問題の解法(乾・品野・鴻池・小谷、2005)有向グラフの有向辺の数が最大となる準オイラー部分グラフ(一筆書き)を見つける(NP困難)https://ci.nii.ac.jp/naid/110002768734
最長しりとり問題の解法(乾・品野・鴻池・小谷、2005)単語数を有向辺の容量とし、しりとりの条件を満たしつつ各有向辺を流れるフロー量の総和を最大化する問題https://ci.nii.ac.jp/naid/110002768734
最長しりとり問題の解法(乾・品野・鴻池・小谷、2005)単語数を有向辺の容量とし、しりとりの条件を満たしつつ各有向辺を流れるフロー量の総和を最大化する問題https://ci.nii.ac.jp/naid/110002768734221 11111・始点のみ 出る量が1多い・終点のみ 入る量が1多い・それ以外は 入る量=出る量・連結である
最長しりとり問題の解法(乾・品野・鴻池・小谷、2005)単語数を有向辺の容量とし、しりとりの条件を満たしつつ各有向辺を流れるフロー量の総和を最大化する問題https://ci.nii.ac.jp/naid/110002768734221 11111・始点のみ 出る量が1多い・終点のみ 入る量が1多い・それ以外は 入る量=出る量・連結である (緩和問題)いい感じに解く(論文参照)1. 整数計画問題として定式化2. しりとりの条件を一部外してパワーで解く(緩和問題)3. 条件を足してパワーで解く、を繰り返して最適解を求める4. 最適解からしりとり生成
既にある以下、車輪の再発明https://chiraura.hhiro.net/shiritori/
Crystal● 触ってみたかっただけ● Rubyによく似た構文● 静的型付け+型推論● v0.32.1 (2019/12/18)● brew installcrystalhttps://crystal-lang.org/
Crystal: コード(下線部はRubyとの差分)
Crystal: 型がある
Crystalでコマンドしりとり● https://github.com/typewriter/any-shiritori○ 整数計画問題のソルバにGLPKを使用$ wc -l src/*26 src/any_shiritori.cr257 src/branch_and_bound_solver.cr$ time ./any_shiritori debian-10.2.txtreal 0.14
● 最長でいくつ繋がったか?Docker image:tag コマンド数 しりとり長alpine:3.10.3 317 ?centos:8 573 ?debian:10.2 409 ?Docker image:tag コマンド数 しりとり長alpine:3.10.3 317 173centos:8 573 326debian:10.2 409 231最長コマンドしりとり: 結果
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 => ...
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ふーん…(知らないコマンド多すぎ)
おまけ: 日本語対応(47都道府県 → 長さ4)$ ./any_shiritori jp_prefectures.txtLength: 4Shiritori: やまなし => しが => かがわ =>わかやま短い(こなみかん)
Crystalで書いてみて(個人の感想です)● RubyのようでRubyでない、似た構文の別言語○ 概ね書きやすい、型があって安心、速い○ 細かな差異やgemが使えない点に苦しむ(Rubyのエコシステムの偉大さも感じる)● 今後に期待したい○ けどGoが強いからなぁ…
まとめCrystal で最長コマンドしりとりを解いたDocker image:tag コマンド数 しりとり長alpine:3.10.3 317 173centos:8 573 326debian:10.2 409 231