$30 off During Our Annual Pro Sale. View Details »

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

typewriter / takuya

January 17, 2020
Tweet

More Decks by typewriter / takuya

Other Decks in Programming

Transcript

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

    View Slide

  2. すき
    京都、百合、
    C#/Ruby/Vim

    京都・嵐山で
    限界オタクと
    化している様子
    圓光寺 (京都市左京区一乗寺, 2016/11/14撮影)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. Crystal: 型がある

    View Slide

  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

    View Slide

  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
    最長コマンドしりとり: 結果

    View Slide

  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 => ...

    View Slide

  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
    ふーん…(知らないコマンド多すぎ)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide