Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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ならでかい整数を扱うにはビルド時に設定が必要
•  オブジェクト指向ではない
•  配列がゴミ
•  関数や変数の...
BashでAtCoderの楽しさ
•  TLEで汎用プログラミング言語の偉大さを体感
•  Javaめっちゃ早い!!Java!!!!!
•  いかにオーバヘッドを失くすかという頭の体操
•  関数呼び出しがオーバヘッド = 下手な再帰は罠
• ...
BashでAtCoderの楽しさ
•  TLEで汎用プログラミング言語の偉大さを体感
•  Javaめっちゃ早い!!Java!!!!!
•  いかにオーバヘッドを失くすかという頭の体操
•  関数呼び出しがオーバヘッド = 下手な再帰は罠
• ...
え、でも、そもそもできんの?
•  できます(多分)
•  まだ簡単なの50個くらいしか解いてないけど
BashでAtCoderの制限
•  使える計算用コマンドは基本グローバルスコー
プ!!!!
•  調子乗ってループ変数をかぶらせるとバグる
•  関数内定義もグローバルスコープ
•  関数の引数だけが関数内スコープ
•  多次元配列はawkし...
Bashのための問題もある
•  ABC002 B
•  http://abc002.contest.atcoder.jp/tasks/abc002_2
•  与えられた文字列から母音を消す
•  解答 tr ‒d [aiueo]
Zshじゃs...
Bashのための問題もある
•  ABC002 B
•  http://abc002.contest.atcoder.jp/tasks/abc002_2
•  与えられた文字列から母音を消す
•  解答 tr ‒d [aiueo]
•  Zsh...
シェル芸のための問題もある
•  ABC018 A
•  http://abc018.contest.atcoder.jp/tasks/abc018_1
•  与えられた3つの数字の順位を出す
•  解答 rev¦grep -n .¦rev¦s...
シェル芸のための問題もある
•  ABC018 A
•  http://abc018.contest.atcoder.jp/tasks/abc018_1
•  与えられた3つの数字の順位を出す
•  解答 rev¦grep -n .¦rev¦s...
勿論Bash殺しもある
•  ATC001 B Union find
•  http://atc001.contest.atcoder.jp/tasks/atc001_2
•  Union find.関数いっぱい呼び出す
•  解答 ☓ Bashで...
勿論Bash殺しもある
•  ATC001 B Union find
•  http://atc001.contest.atcoder.jp/tasks/abc001_2
•  Union find.関数いっぱい呼び出す
•  解答 ☓ Bashで...
他にも楽しさ
•  ショートコーディングがしやすい
•  反転やソートなどがコマンドで存在
•  パイプで繋いでくワンライナー
•  超気持ちいい
•  嫌でもコマンドに詳しくなる
•  便利.はかどる.研究にも最高
•  シェル芸が合法的に認...
謝辞
•  AtCoder社
•  いっぱい提出してマシン働かせてごめんなさ
い・・・
•  (各種コマンドのバージョンとビルドオプション
が知りたいです)
•  USP友の会を始め,全国のシェル芸人の皆さん
•  ブログや記事に助けられていま...
おまけ
•  AtCoder提出コマンドを作りました
•  Gpst
•  https://github.com/jmatsu/gpst
•  対話的&&コンフィグ利用をすることで,言語選択
や問題選択を間違えてWAとかしない!!!!
•  自...
Upcoming SlideShare
Loading in …5
×

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

5,792 views

Published on

東工大西8号館LT用
Bashで競技プログラミングをやるツラい話

Published in: Technology
  • Sex in your area is here: ♥♥♥ http://bit.ly/2ZDZFYj ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating for everyone is here: ♥♥♥ http://bit.ly/2ZDZFYj ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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

  1. 1. Bashで 競技プログラミング AtCoder 佐伯研M2 松田
  2. 2. 自己紹介 •  松田 淳平 •  東工大 佐伯研M2 •  JavaとかKotlinとかRubyとかシェル芸とか •  twitter:@fat_daruuuuma, github:jmatsu
  3. 3. Bash •  Bourne-again shell •  シェルスクリプトが実行できる •  各種コマンドを呼び出す •  オブジェクト指向ではない
  4. 4. 競技プログラミング •  制限時間,メモリ制限の中で,問題となってい るプログラムを実装する競技 •  普通 •  いかに早く実装するか •  Solveした問題数 •  異端(?) •  いかに短く実装するか •  いかに実行速度を早くするか •  いかに実行速度を遅くするか
  5. 5. Bashで競技プログラミング •  いけそうな気がする
  6. 6. 
 BashCoder
 https://github.com/jmatsu/BashCoder
  7. 7. BashでAtCoder •  実行言語をBashで,AtCoderの問題を解く •  ツラい •  大抵TLE •  大抵MLE •  BashCoder •  https://github.com/jmatsu/BashCoder
  8. 8. BashでAtCoderのツラさ •  各種コマンドを呼び出せるだけ •  しかもコマンドは基本ビルドオプション無し •  awkならでかい整数を扱うにはビルド時に設定が必要 •  オブジェクト指向ではない •  配列がゴミ •  関数や変数の呼び出しのオーバヘッドがでかすぎ •  早い計算は向いてない •  整数と文字列しかない •  しかも長さに制限がある •  ARCではCから,ABCではDから人生がツラい
  9. 9. BashでAtCoderの楽しさ •  TLEで汎用プログラミング言語の偉大さを体感 •  Javaめっちゃ早い!!Java!!!!! •  いかにオーバヘッドを失くすかという頭の体操 •  関数呼び出しがオーバヘッド = 下手な再帰は罠 •  BSDとGNUの違いをWAで体感できる •  あとはBSD(Mac)で書いてもREだったり •  超シェル芸が上達する
  10. 10. BashでAtCoderの楽しさ •  TLEで汎用プログラミング言語の偉大さを体感 •  Javaめっちゃ早い!!Java!!!!! •  いかにオーバヘッドを失くすかという頭の体操 •  関数呼び出しがオーバヘッド = 下手な再帰は罠 •  BSDとGNUの違いをWAで体感できる •  あとはBSD(Mac)で書いてもREだったり •  超シェル芸が上達する •  なんかすごいできた気になる
  11. 11. え、でも、そもそもできんの? •  できます(多分) •  まだ簡単なの50個くらいしか解いてないけど
  12. 12. BashでAtCoderの制限 •  使える計算用コマンドは基本グローバルスコー プ!!!! •  調子乗ってループ変数をかぶらせるとバグる •  関数内定義もグローバルスコープ •  関数の引数だけが関数内スコープ •  多次元配列はawkしか使えない!!!! •  しかもawkじゃ間に合わないことがある •  ビット演算がない!!!!!! •  自分で実装する •  関数を呼び出し過ぎたら負け!!!! •  自分で末尾再帰最適化しましょう^_^
  13. 13. 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
  14. 14. 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
  15. 15. シェル芸のための問題もある •  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番目取り出し
  16. 16. シェル芸のための問題もある •  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番目取り出し
  17. 17. 勿論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キャッシュを利用して計算
  18. 18. 勿論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キャッシュを利用して計算
  19. 19. 他にも楽しさ •  ショートコーディングがしやすい •  反転やソートなどがコマンドで存在 •  パイプで繋いでくワンライナー •  超気持ちいい •  嫌でもコマンドに詳しくなる •  便利.はかどる.研究にも最高 •  シェル芸が合法的に認められる •  最高
  20. 20. 謝辞 •  AtCoder社 •  いっぱい提出してマシン働かせてごめんなさ い・・・ •  (各種コマンドのバージョンとビルドオプション が知りたいです) •  USP友の会を始め,全国のシェル芸人の皆さん •  ブログや記事に助けられています •  特に@ryuichiueda さんや@hi_saito さんには深い感謝 の意を云々
  21. 21. おまけ •  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

×