21
Bashで 競技プログラミング ~AtCoder~ 佐伯研 M2 松田

Bashで競技プログラミング #w8lt #w8lt4

Embed Size (px)

Citation preview

Bashで

競技プログラミング ~AtCoder~

佐伯研M2 松田

自己紹介

•  松田 淳平 •  東工大 佐伯研M2 •  JavaとかKotlinとかRubyとかシェル芸とか •  twitter:@fat_daruuuuma, github:jmatsu

Bash •  Bourne-again shell •  シェルスクリプトが実行できる •  各種コマンドを呼び出す

•  オブジェクト指向ではない

競技プログラミング •  制限時間,メモリ制限の中で,問題となってい

るプログラムを実装する競技 •  普通 •  いかに早く実装するか •  Solveした問題数

•  異端(?) •  いかに短く実装するか •  いかに実行速度を早くするか •  いかに実行速度を遅くするか

Bashで競技プログラミング •  いけそうな気がする

BashCoder

https://github.com/jmatsu/BashCoder

BashでAtCoder •  実行言語をBashで,AtCoderの問題を解く •  ツラい •  大抵TLE •  大抵MLE

•  BashCoder •  https://github.com/jmatsu/BashCoder

BashでAtCoderのツラさ •  各種コマンドを呼び出せるだけ

•  しかもコマンドは基本ビルドオプション無し •  awkならでかい整数を扱うにはビルド時に設定が必要

•  オブジェクト指向ではない •  配列がゴミ •  関数や変数の呼び出しのオーバヘッドがでかすぎ •  早い計算は向いてない •  整数と文字列しかない

•  しかも長さに制限がある •  ARCではCから,ABCではDから人生がツラい

BashでAtCoderの楽しさ •  TLEで汎用プログラミング言語の偉大さを体感 •  Javaめっちゃ早い!!Java!!!!!

•  いかにオーバヘッドを失くすかという頭の体操 •  関数呼び出しがオーバヘッド = 下手な再帰は罠

•  BSDとGNUの違いをWAで体感できる •  あとはBSD(Mac)で書いてもREだったり

•  超シェル芸が上達する

BashでAtCoderの楽しさ •  TLEで汎用プログラミング言語の偉大さを体感 •  Javaめっちゃ早い!!Java!!!!!

•  いかにオーバヘッドを失くすかという頭の体操 •  関数呼び出しがオーバヘッド = 下手な再帰は罠

•  BSDとGNUの違いをWAで体感できる •  あとはBSD(Mac)で書いてもREだったり

•  超シェル芸が上達する

•  なんかすごいできた気になる

え、でも、そもそもできんの? •  できます(多分) •  まだ簡単なの50個くらいしか解いてないけど

BashでAtCoderの制限 •  使える計算用コマンドは基本グローバルスコー

プ!!!! •  調子乗ってループ変数をかぶらせるとバグる •  関数内定義もグローバルスコープ •  関数の引数だけが関数内スコープ

•  多次元配列はawkしか使えない!!!! •  しかもawkじゃ間に合わないことがある

•  ビット演算がない!!!!!! •  自分で実装する

•  関数を呼び出し過ぎたら負け!!!! •  自分で末尾再帰最適化しましょう^_^

Bashのための問題もある •  ABC002 B

•  http://abc002.contest.atcoder.jp/tasks/abc002_2 •  与えられた文字列から母音を消す •  解答 tr ‒d [aiueo]

Zshじゃsyntax error

•  ABC004 B •  http://abc004.contest.atcoder.jp/tasks/abc004_2 •  与えられた文字列群を180度回転 •  解答 tac|rev

Macはtacがないのでtail -r

Bashのための問題もある •  ABC002 B

•  http://abc002.contest.atcoder.jp/tasks/abc002_2 •  与えられた文字列から母音を消す •  解答 tr ‒d [aiueo]

•  Zshじゃsyntax error

•  ABC004 B •  http://abc004.contest.atcoder.jp/tasks/abc004_2 •  与えられた文字列群を180度回転 •  解答 tac|rev

•  Macはtacがないのでtail -r

シェル芸のための問題もある •  ABC018 A

•  http://abc018.contest.atcoder.jp/tasks/abc018_1 •  与えられた3つの数字の順位を出す •  解答 rev|grep -n .|rev|sort -rn|grep -n .|rev|sort|rev|cut -c1

•  反転して順序つけて,戻して昇順に並び替え,順序つけて反転して最初の順序に並び替え,反転して2回目につけた順序を取り出す

•  ABC009 B •  http://abc009.contest.atcoder.jp/tasks/abc009_2 •  与えられた数字群から2番目に大きい数を出す •  解答 read N;tail -$N|sort|uniq|sort -rn|head -2|tail -1

•  指定番号だけ読み込み,文字列で並び替えて重複削除,数字昇順で並び替えて2番目取り出し

シェル芸のための問題もある •  ABC018 A

•  http://abc018.contest.atcoder.jp/tasks/abc018_1 •  与えられた3つの数字の順位を出す •  解答 rev|grep -n .|rev|sort -rn|grep -n .|rev|sort|rev|cut -c1

•  反転して順序つけて,戻して昇順に並び替え,順序つけて反転して最初の順序に並び替え,反転して2回目につけた順序を取り出す

•  ABC009 B •  http://abc009.contest.atcoder.jp/tasks/abc009_2 •  与えられた数字群から2番目に大きい数を出す •  解答 read N;tail -$N|sort|uniq|sort -rn|head -2|tail -1

•  指定番号だけ読み込み,文字列で並び替えて重複削除,数字昇順で並び替えて2番目取り出し

勿論Bash殺しもある •  ATC001 B Union find

•  http://atc001.contest.atcoder.jp/tasks/atc001_2 •  Union find.関数いっぱい呼び出す •  解答 ☓ BashでOOはTLE, 関数呼び出し最小化でも

TLE ○ awkかbcで配列使ってunion find

•  ABC003 D •  http://abc003.contest.atcoder.jp/tasks/abc003_4 •  部屋のレイアウト問題

•  dpやcombinationで解ける •  解答 ☓ dpはTLE, combでもawkじゃTLE

○ bcで局所最適なビット演算を実装して combキャッシュを利用して計算

勿論Bash殺しもある •  ATC001 B Union find

•  http://atc001.contest.atcoder.jp/tasks/abc001_2 •  Union find.関数いっぱい呼び出す •  解答 ☓ BashでOOはTLE, 関数呼び出し最小化でも

TLE ○ awkかbcで配列使ってunion find

•  ABC003 D •  http://abc003.contest.atcoder.jp/tasks/abc003_4 •  部屋のレイアウト問題

•  dpやcombinationで解ける •  解答 ☓ dpはTLE, combでもawkじゃTLE

○ bcで局所最適なビット演算を実装して combキャッシュを利用して計算

他にも楽しさ •  ショートコーディングがしやすい •  反転やソートなどがコマンドで存在

•  パイプで繋いでくワンライナー •  超気持ちいい

•  嫌でもコマンドに詳しくなる •  便利.はかどる.研究にも最高

•  シェル芸が合法的に認められる •  最高

謝辞 •  AtCoder社 •  いっぱい提出してマシン働かせてごめんなさ

い・・・ •  (各種コマンドのバージョンとビルドオプション

が知りたいです) •  USP友の会を始め,全国のシェル芸人の皆さん •  ブログや記事に助けられています

•  特に@ryuichiueda さんや@hi_saito さんには深い感謝の意を云々

おまけ •  AtCoder提出コマンドを作りました

•  Gpst •  https://github.com/jmatsu/gpst •  対話的&&コンフィグ利用をすることで,言語選択

や問題選択を間違えてWAとかしない!!!! •  自分の環境に特化すると無駄なのでIssue&PR歓迎

•  Git関係のコマンドを作りました •  フォーク先と簡単に同期

•  https://github.com/jmatsu/syfork •  簡単に外部スクリプトをgit aliasに

•  https://github.com/jmatsu/git-fast-alias