Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Crystalで最長コマンドしりとり

 Crystalで最長コマンドしりとり

2020/01/17(Fri) 社内LT会で発表したスライドです。

参考
- CiNii 論文 -  最長しりとり問題の解法: https://ci.nii.ac.jp/naid/110002768734
- 単語集合から最長しりとりを得るプログラム: https://chiraura.hhiro.net/shiritori/
- 拙作: https://github.com/typewriter/any-shiritori

D833ebe946fb6c3ca990758737855f79?s=128

typewriter / takuya

January 17, 2020
Tweet

Transcript

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

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

  3. Linux コマンドしりとり • しりとりに使える単語は Linux コマンド限定 • Debian系ディストリビューションでの例: apt ->

    tee -> emacs -> service -> env -> vim -> mkdir -> …
  4. 最長 Linux コマンドしりとり • 最長でいくつ繋がるか? ◦ 今回は「Docker imageに入っている」縛り Docker image:tag

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

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

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

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

    1 1 1 1 1 1 ・始点のみ 出る量が1多い ・終点のみ 入る量が1多い ・それ以外は 入る量=出る量 ・連結である (緩和問題) いい感じに解く(論文参照) 1. 整数計画問題として定式化 2. しりとりの条件を一部外して パワーで解く(緩和問題) 3. 条件を足してパワーで解く、 を繰り返して最適解を求める 4. 最適解からしりとり生成
  9. 既にある 以下、 車輪の 再発明 https://chiraura.hhiro.net/shiritori/

  10. Crystal • 触ってみたかっただけ • Rubyによく似た構文 • 静的型付け+型推論 • v0.32.1 (2019/12/18)

    • brew install crystal https://crystal-lang.org/
  11. Crystal: コード(下線部はRubyとの差分)

  12. Crystal: 型がある

  13. 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
  14. • 最長でいくつ繋がったか? 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 最長コマンドしりとり: 結果
  15. 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 => ...
  16. 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 ふーん…(知らないコマンド多すぎ)
  17. おまけ: 日本語対応(47都道府県 → 長さ4) $ ./any_shiritori jp_prefectures.txt Length: 4 Shiritori:

    やまなし => しが => かがわ => わかやま 短い(こなみかん)
  18. Crystalで書いてみて(個人の感想です) • RubyのようでRubyでない、似た構文の別言語 ◦ 概ね書きやすい、型があって安心、速い ◦ 細かな差異やgemが使えない点に苦しむ (Rubyのエコシステムの偉大さも感じる) • 今後に期待したい

    ◦ けどGoが強いからなぁ…
  19. まとめ Crystal で最長コマンドしりとりを解いた Docker image:tag コマンド数 しりとり長 alpine:3.10.3 317 173

    centos:8 573 326 debian:10.2 409 231