Upload
junpei-matsuda
View
2.333
Download
0
Embed Size (px)
Citation preview
競技プログラミング • 制限時間,メモリ制限の中で,問題となってい
るプログラムを実装する競技 • 普通 • いかに早く実装するか • Solveした問題数
• 異端(?) • いかに短く実装するか • いかに実行速度を早くするか • いかに実行速度を遅くするか
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だったり
• 超シェル芸が上達する
• なんかすごいできた気になる
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 さんには深い感謝の意を云々