強くなるためのプログラミング...

63
つよくなるための プログラミング @cocodrips 1

Upload: cocodrips

Post on 16-Apr-2017

81.867 views

Category:

Engineering


4 download

TRANSCRIPT

Page 1: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

つよくなるための プログラミング

@cocodrips

1

Page 2: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

おまえだれ?2

名前 : くーむ ( o・ω・)ノ Twitter : @cocodrips 職業 : ゲームプログラマ(Lv.1) すきなもの : Python / C++ / js ブログ : ぴよぴよ.py

Page 3: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

プログラミングコンテストとは?3

参加者がそれぞれ問題を解いて、 解くスピード、正確さ、スコアを競いあって

青春するイベント

Page 4: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

様々なジャンルのコンテスト4

長い(数週間)

だれでもできる

2時間

アルゴリズム

セキュリティ

専門知識が必要

開催期間

サーバ インフラ

ゲームAI

データマイニング

1 2

345

Page 5: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

紹介するコンテストについて5

参加資格の制限がないコンテスト

アイディアを競うようなコンテスト

Pythonで参加できるコンテスト

Page 6: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

コンテストに参加する利点6

Page 7: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

コンテストに参加する利点7

1自分と同じ問題を解いた、 他の人の解法を知ることができる

Page 8: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

コンテストに参加する利点8

1自分と同じ問題を解いた、 他の人の解法を知ることができる

2同じコンテストに出ていた、 たくさんのライバルと知り合える

Page 9: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

アルゴリズムの コンテスト紹介

9

Page 10: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

アルゴリズムのコンテスト10

長い(数週間)2時間

アルゴリズム

セキュリティ

開催期間

サーバ インフラ

ゲームAI

データマイニング

だれでもできる

専門知識が必要

Page 11: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

アルゴリズムのコンテスト- 問題例11

有る長方形の3つの辺の長さが与えられる。 残り1つの辺の長さを求めよ。

(Atcoder Beginner Contest 027A)

?

Page 12: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

アルゴリズムのコンテスト- 問題例12

Page 13: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

アルゴリズムのコンテスト- 問題例13

N段の階段があります。あなたは一歩で1段、2段、もしくは3段登ることができます。 考えうる階段の登り方は何通りありますか?答えを1000000007で割った数を出力しなさい。0<N<105 時間制限:2秒, スタック・メモリ制限:256MB

Page 14: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

アルゴリズムのコンテスト- 問題例14

N段の降り方 = 1段降りて、残り(N - 1)段の降り方 + 2段降りて、残り(N - 2)段の降り方 + 3段降りて、残り(N - 3)段の降り方

Page 15: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

アルゴリズムのコンテスト- 問題例15

Page 16: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

アルゴリズムのコンテスト- 問題例16

1 計算時間を見積もってみよう!

2 デフォルトでのPythonの 再帰回数の限界を調べてみよう!maximum recursion depth

Page 17: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

アルゴリズムのコンテストとは17

与えられた問題に対して 解くはやさと正確さを競う

1 外部ライブラリ使用不可

2 速く解くほど点数が高い

3 順位に応じて自分のレーティングが変化する

Page 18: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

アルゴリズムのコンテストのよさ18

1 基本的なデータ構造の使い方を学べる

2 一瞬で計算量を見積もれるようになる

3 標準ライブラリや、言語仕様に詳しくなる

4 1~2時間程度の短時間なコンテスト

Page 19: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

19

TopCoder

SRM (するめ)おてがる かんたんPython適性

Div1

定期 開催型

競技プログラミングといえばTopCoder SRM! SRMのレーティングで競技プログラマとしての格が決まる?! 目指せ Red Coder! !アルゴリズムというよりも、数学よりの問題が多いのが特徴 Div 1 / Div 2 : 3問 / 75分 + 撃墜フェーズ 15分 開催頻度 : 月に4回程度 次回開催 : 10/11(日) 1:00~, 10/15(木) 0:00

Div2

RedCoder

https://www.topcoder.com/

アルゴリズムのコンテスト - 紹介

Page 20: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

20

CodeForcesおてがる かんたんPython適性

Div1Div2

今夜は家で6000人のプログラマと戦おう! 今1番勢いのある競技プログラミングコンテスト!!! !Div 1 / Div 2 : 5問 / 2時間 開催頻度 : 月に4回程度 次回開催 : 10/12(月) 18:00~20:00 毎回夜中の2時頃スタートなのを除けば最高…

定期 開催型

http://codeforces.com/

アルゴリズムのコンテスト - 紹介

Page 21: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

アルゴリズムのコンテスト - 紹介21

AtCoderおてがる かんたんPython適性

アルゴリズムのコンテストならまずはここから! 毎週土曜日に開催される日本語のコンテスト 毎回終了後には解説がニコニコ生放送で見れるのも魅力! !初心者向け(ABC) : 4問 / 2時間 中級者向け(ARC) : 4問 / 1.5時間 開催頻度 : 毎週土曜日にABC/ARCどちらか 次回開催 : ARC 10/10(土) 21:00~22:30 ABC 10/24(土) 21:00~23:00 (予定)

定期 開催型

http://atcoder.jp/

@chokudai

社長

Page 22: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

22

TopCoder Codeforces AtCoder(日本語)

開催頻度 月3回 月4回 毎週土曜日

問題の特徴 数学系 どちらかといえば アルゴリズム アルゴリズム重視

問題数と時間 3 5問/120分 4問/90分

PythonのVersion 2 2, 3 2, 3解ける人数

(%)

Topcoderの何色に相当するか Div2 Div1 Div2 Div1 ABC ARC

100% 11

22

4 21

32

0%

1

2

31

23

1

2

4

5

2

3

54

3 1 4

21

3

1

2

3

4

アルゴリズムのコンテスト - 比較

初心者におすすめ

神の領域

Page 23: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

23

アルゴリズムのコンテスト - 勉強法

1 AtCoderのABCに出てみる

2 ABCの過去問を数回分解く

4 アルゴリズムコンテスト用の本を読む

3 TopCoder / CodeForces に出る

Page 24: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

24

アルゴリズムのコンテスト - 技術書

競技プログラミングを 最近はじめた人におすすめ

もっともっと強く なりたい人におすすめ

Page 25: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

どこでコンテスト探すの?25

TopCoder部のカレンダー

紹介したコンテストがいつ開催されるかわかる Googleカレンダーと連携するのがおすすめ!

Page 26: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

ゲームAIの コンテスト紹介

26

Page 27: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

ゲームAIのコンテスト27

とにかく強いゲームAIを作る

Page 28: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

アルゴリズムのコンテスト28

長い(数週間)2時間

アルゴリズム

セキュリティ

開催期間

サーバ インフラ

ゲームAI

データマイニング

だれでもできる

専門知識が必要

Page 29: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

ゲームAIのコンテスト29

Page 30: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

ゲームAI30

Codingameおてがる かんたんPython適性

気軽にできる対戦型ゲームAIコンテスト コンテスト以外にも様々な練習用ゲームがある !開催期間 : 1日~1週間程度 開催頻度 : 月に1回程度 次回コンテスト : “CODE vs ZOMBIE” 11/29(日) 2:00 ~ 11/30(月) 2:00 (24h)

定期 開催型

Page 31: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

ゲームAI31

CODE VSおてがる かんたんPython適性

プログラマが1番目立てるコンテスト 本選がニコファーレで開催! ニコニコ生放送デビュー!? !開催期間 : 1ヶ月程度 開催頻度 : 年に1回程度 次回コンテスト : 未定

イベント 型

Page 32: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

ゲームAI - CodeVSの様子32

https://youtu.be/D3r-98abnjY?t=58s

Page 33: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

ゲームAIコンテスト - 勉強法33

1 アルゴリズムコンテストで アルゴリズムの基礎を学ぶ

2

3

自己流アルゴリズムで Codingameに出てみる

ゲームAIやMMでよく使う アルゴリズムを学ぶ

Page 34: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

ゲームAIコンテスト - 勉強法34

1 アルゴリズムコンテストで アルゴリズムの基礎を学ぶ

2

3

自己流アルゴリズムで Codingameに出てみる

ゲームAIやMMでよく使う アルゴリズムを学ぶ

1 codingameに出る

2 codingameに出る

3 codingameに出る

Page 35: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

データマイニングの コンテスト

35

Page 36: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

データマイニングのコンテスト36

長い(数週間)2時間

アルゴリズム

セキュリティ

開催期間

サーバ インフラ

ゲームAI

データマイニング

だれでもできる

専門知識が必要

Page 37: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

データマイニングのコンテスト37

Kaggleおてがる かんたんPython適性https://www.kaggle.com/

定期 開催型

データマイニングでひとやま当てよう?! 常時10個程度のコンテストが開催されている 自分にあった分野のコンテストを探そう! !開催期間 : 数ヶ月程度 開催頻度 : 常時開催

Page 38: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

データマイニングのコンテスト - 勉強法38

Page 39: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

データマイニングのコンテスト - 勉強39

Page 40: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

データマイニングのコンテスト - 勉40

Page 41: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

データマイニングのコンテスト ………41

Page 42: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

データマイニングのコンテスト orz42

データマイニング初心者なので、 よい勉強法がわかりません・・・・

(多分ここにはプロがいっぱいいるので迂闊なこと言えない・・・)

Page 43: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

Kaggleのはじめかた43初心者目線での

Page 44: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

Kaggleのはじめかた44初心者目線での

GettingStarted の練習問題に挑戦してみる

Page 45: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

サーバ・インフラの コンテスト

45

Page 46: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

サーバ/インフラのコンテスト46

長い(数週間)2時間

アルゴリズム

セキュリティ

開催期間

サーバ インフラ

ゲームAI

データマイニング

だれでもできる

専門知識が必要

Page 47: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

サーバ/インフラ47

ISUCONおてがる かんたんPython適性

いい感じにスピードアップコンテスト(ISUCON) 日々の業務で培ったWeb総合力が試される!!!! 3人1組なので、チームを作るのが1番難しい… !開催期間 : 7時間程度 開催頻度 : 年に1回 予選 / 本選(オンサイト) 次回コンテスト : 未定(今年は予選が終了済み、10/31に本選)

イベント 型

http://isucon.net/

Page 48: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

48

サーバ/インフラのコンテスト - 勉強法

1 ISUCONの過去問を解く

2 ISUCONの参加記や 解説を読む(公式サイトにリスト有り)

Page 49: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

セキュリティの コンテスト

49

Page 50: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

セキュリティのコンテスト50

長い(数週間)2時間

アルゴリズム

セキュリティ

開催期間

サーバ インフラ

ゲームAI

データマイニング

だれでもできる

専門知識が必要

Page 51: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

セキュリティコンテスト-CTFとは?51

Capture The Flag (旗取り合戦) !

攻防戦方式 : 脆弱性のあるサービスが動いているサーバが与えられ、 敵チームのサーバからFlagを盗み取る !

クイズ方式 : Webサイトの脆弱性をつく / 暗号を解く / バイナリ解析 etc. !

Page 52: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

問題: vzcbeg guvf52

Gur Mra bs Clguba, ol Gvz Crgref Ornhgvshy vf orggre guna htyl. Rkcyvpvg vf orggre guna vzcyvpvg.Fvzcyr vf orggre guna pbzcyrk.Pbzcyrk vf orggre guna pbzcyvpngrq. Syng vf orggre guna arfgrq.Fcnefr vf orggre guna qrafr. Ernqnovyvgl pbhagf. Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.Nygubhtu cenpgvpnyvgl orngf chevgl. Reebef fubhyq arire cnff fvyragyl. Hayrff rkcyvpvgyl fvyraprq.Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg. Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu. Abj vf orggre guna arire.Nygubhtu arire vf bsgra orggre guna *evtug* abj.Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!

Page 53: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

問題: vzcbeg guvf53

Gur Mra bs Clguba, ol Gvz Crgref Ornhgvshy vf orggre guna htyl. Rkcyvpvg vf orggre guna vzcyvpvg.Fvzcyr vf orggre guna pbzcyrk.Pbzcyrk vf orggre guna pbzcyvpngrq. Syng vf orggre guna arfgrq.Fcnefr vf orggre guna qrafr. Ernqnovyvgl pbhagf. Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.Nygubhtu cenpgvpnyvgl orngf chevgl. Reebef fubhyq arire cnff fvyragyl. Hayrff rkcyvpvgyl fvyraprq.Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg. Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu. Abj vf orggre guna arire.Nygubhtu arire vf bsgra orggre guna *evtug* abj.Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!

string.decode(‘rot13’)

Page 54: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

問題: import this54

The Zen of Python, by Tim Peters !Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those!

Page 55: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

セキュリティコンテスト - 紹介55

SECCONおてがる かんたんPython適性

日本でCTFといえばSECCON 本選: 攻防戦方式 予選:クイズ形式 !開催期間 : 12 ~ 48時間程度 開催頻度 : 本選1回 + 予選7回 /年 次回コンテスト : オンライン予選 12/5(土) ~ 12/6(日)

http://2015.seccon.jp/

定期 開催型

Page 56: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

セキュリティコンテスト - 勉強法56

1 ksnctf でCTFの問題に挑戦してみる

2 出たりCTF本を読んだりする

それ以上のことはわからないorz3 とかをチェックする

Page 57: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

セキュリティコンテスト - 技術書57

先週発売された 期待の新星 (売切中)

予約してたのにまだ届かない

Page 58: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

まとめ

58

Page 59: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

様々なジャンルのコンテスト59

長い(数週間)

だれでもできる

2時間

アルゴリズム

セキュリティ

専門知識が必要

開催期間

サーバ インフラ

ゲームAI

データマイニング

Page 60: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

伝えたいこと60

1プログラミングコンテストは 子どもも大人も楽しめる青春イベント!

2自分の解法と他の人の解法を比較して、 より良い解き方や書き方を知ろう

3様々なジャンルのコンテストがある! とにかく一度参加してみよう!

Page 61: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

コンテスト予定!61

10/11(日) 1:00~, 10/15(木) 0:00TopCoder SRMCodeForces

AtCoder

アルゴリズム

ゲームAI

Codingame

セキュリティ

SECCON

10/12(月) 18:00~20:00

ARC 10/10(土) 21:00~22:30 ABC 10/24(土) 21:00~23:00 (予定)

11/29(日) 2:00 ~ 11/30(月) 2:00 (24h)

オンライン予選 12/5(土) ~ 12/6(日)

初心者におすすめ

Page 62: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

参考 - アルゴリズム62

✦ yukicoder 競技プログラミング・アルゴリズムをに練習サイト http://yukicoder.me/

✦ TopCoder部のカレンダーhttps://topcoder.g.hatena.ne.jp/calendar

Page 63: 強くなるためのプログラミング -プログラミングに関する様々なコンテストとそのはじめ方-#pyconjp

参考 - セキュリティ63

✦ CTFはとんでもないものを 盗んでいきました。私の時間です… http://www.slideshare.net/hiromu1996/it-31937461

✦ ksnctfhttp://ksnctf.sweetduet.info/