Slide 1

Slide 1 text

Google Code Jamの話 @Linus_MK 2018年4月14日 第39回 PORTもくもく会

Slide 2

Slide 2 text

自己紹介 twitter : @Linus_MK (ライナス) 音声信号処理のソフト開発 主にC/C++ 業務外: 機械学習の勉強はじめました 競技プログラミング(Ruby)←今日はこの話!

Slide 3

Slide 3 text

目次 Google Code Jamとは何か 実際にどんな問題が出てくるのか?

Slide 4

Slide 4 text

Google Code Jamとは何か 競技プログラミングの大会。Google主催、年1回 アルゴリズム系の問題が出題されて、時間内に解く (解くためのソースコードを書いて、システム上に提出する) システム上で正しいか判定して、正答ならば得点が入る 得点で順位をつける(同点なら提出が速い人が上位) →速く正確にコードを書く必要がある

Slide 5

Slide 5 text

各ラウンドとスケジュール 予選ラウンド 4月7日(土)08:00 – 4月8日(日)11:00 ラウンド1-A 4月14日(土) 10:00 – 12:30【今日でした】 ラウンド1-B 4月30日(月) 01:00 – 03:30 ラウンド1-C 5月5日(土) 18:00 – 20:30 ラウンド2 ラウンド3 決勝 8月 トロント(カナダ) 25 / 100点取れればOK  (14000人が進出した) どれかの回で上位1500位以内 (4500人) 1000位以内 25位以内 ここまではネット上で開催される

Slide 6

Slide 6 text

今日の結果 ラウンド1-A 4月14日(土) 10:00 – 12:30 の俺 ラウンド1-C 5月5日(土) 18:00 – 20:30 でがんばります…… 全然分からん (3問中1問も解けず)

Slide 7

Slide 7 text

どんな問題が出るの? 予選ラウンド(全4問)の最初の問題を紹介します (適宜省略したので正確なとこは原文を参照)

Slide 8

Slide 8 text

問題内容 宇宙からロボットが攻めてきた 以下のプログラムで攻撃してくる SとCからなる文字列 S(shoot):攻撃してダメージを与える C(charge):与えるダメージを2倍にする(最初は1) 例:S   C   C   S   S ダメージ4 ダメージ4 攻撃 ダメージ1 ダメージ 1→2 ダメージ 2→4 合計ダメージ 9

Slide 9

Slide 9 text

問題内容 防御シールドでDまでのダメージは耐えられる 攻撃プログラムを書き換えてダメージをD以下にしたい 操作:隣りあう文字を入れ替える (SCCSS → SCSCS) 入力:耐えられるダメージD、攻撃プログラム文字列P 出力:ダメージをD以下にするための最小操作回数 S   C   C   S   S ダメージ4 ダメージ4 ダメージ1 1→2 2→4 合計ダメージ 9 S   C   S   C   S ダメージ2 ダメージ4 ダメージ1 1→2 2→4 合計ダメージ 7

Slide 10

Slide 10 text

(だいぶアバウトな)解法 Sを最初(左)の方に、Cを最後(右)の方に移動したい 解法: 文字列の一番右側の「CS」を見つけて、「SC」に入れ替える ダメージを再計算 D以下ならOK、結果を出力して終了 Dより大きいならまだダメ、操作回数++ 最初に戻る 正確な方針はGoogleのAnalysisを参照 S   C   S   C   S ダメージ2 ダメージ4 ダメージ1 1→2 2→4 合計ダメージ 7 この「CS」を入れ替え るとダメージ2→1 この「CS」を入れ替え るとダメージ4→2

Slide 11

Slide 11 text

まとめ 競技プログラミングは楽しいよ (Google Code Jam以外にも色々あります。調べてみてね)