$30 off During Our Annual Pro Sale. View Details »

競技プログラミングへのお誘い~私と競プロ友達になってください / Invitation to Competition Programming

thatblue
December 03, 2022

競技プログラミングへのお誘い~私と競プロ友達になってください / Invitation to Competition Programming

Rails Girls Gathering Japan 2022のLT資料です。
https://gathering.railsgirls.jp/

thatblue

December 03, 2022
Tweet

More Decks by thatblue

Other Decks in Technology

Transcript

  1. #rggjp
    Rails Girls Gathering Japan 2022
    競技プログラミングへの
    お誘い
    私と競プロ友達になってください
    あのぶる (@thatblue_plus)

    View Slide

  2. #rggjp
    Rails Girls Gathering Japan 2022
    自己紹介
    ● だいたい仙台出身、ほぼ仙台(Matz島の手前くらい)在住のソフトウェアエンジニア
    ○ 学生時代を過ごした会津若Matzは第二の故郷
    ○ スマホゲームのバックエンドを作るのがメインのお仕事(のはず)
    ● Rails Girls関係のロール
    ○ Sendai 1st, 2ndのオーガナイザー
    ○ Sendai, More!の運営
    ○ Rails Girls Japan メンバー (2022/03~) New!
    ● Sendai.rbの代表スタッフもしています

    View Slide

  3. #rggjp
    Rails Girls Gathering Japan 2022
    こんな悩みはありませんか
    プログラミングに慣れるために
    もっとたくさんコードを書きたいけど、
    いい課題が見つからない…

    View Slide

  4. #rggjp
    Rails Girls Gathering Japan 2022
    それ、競技プログラミングで
    解決できるかもしれません

    View Slide

  5. #rggjp
    Rails Girls Gathering Japan 2022
    競技プログラミングとは?
    今回はアルゴリズム分野の技能を競うタイプについて扱います

    View Slide

  6. #rggjp
    Rails Girls Gathering Japan 2022
    プログラミングの技術で勝負する競技の一種
    通称「競プロ」
    プログラムを書いて答える問題が出題される 解答となるプログラムを書いて提出する
    →主催者の用意したシステムで採点される
    時間内に一番多く、早く解いた人の勝ち
    5min 5min 10min
    5min 10min 10min
    5min 5min

    View Slide

  7. #rggjp
    Rails Girls Gathering Japan 2022
    例題
    [AtCoder Beginner Contest 186 A - Brickより抜粋]
    トラックが1台あります。このトラックには合計でNキログラム以下の荷物を載せ
    ることができます。
    このトラックに、1個Wキログラムのレンガを最大でいくつ載せることができま
    すか?
    制約
    ● 1 ≤ N,W ≤ 1000
    ● N,W は整数である。

    View Slide

  8. #rggjp
    Rails Girls Gathering Japan 2022
    こんな感じで実行されるイメージ
    $ ruby brick.rb
    1000 20 # NとWの入力
    50 # 答えの出力

    View Slide

  9. #rggjp
    Rails Girls Gathering Japan 2022
    解答例
    n, w = gets.chomp.split.map(&:to_i)
    puts n / w

    View Slide

  10. #rggjp
    Rails Girls Gathering Japan 2022
    でも、難しいんじゃない?

    View Slide

  11. #rggjp
    Rails Girls Gathering Japan 2022
    モノによりますが初心者でも楽しむことが出来ます
    ● AtCoderのAtCoder Beginner Contest(通称: ABC)
    ○ AtCoderはおそらく日本の競技プログラミングコンテストサイトを代表するサービス
    ○ Beginner Contestと言いつつ上級者向けの問題も混じっているので取捨選択が必要
    ■ 問題の選び方は後ほど
    ○ ほぼ毎週コンテストを開催しているので、過去問で慣れた後、実際に参加することもできる
    ○ Rubyは2.7対応
    ● Aizu Online Judgeの問題
    ○ 福島県にある会津大学という大学が運営しているサイト
    ○ 競技プログラミングの入門記事を読んでいると、学習用として頻繁にお勧めされる
    (多分これ、一部の問題は本当に授業の演習課題として使ってたことがあるんじゃないかな…?)
    ○ Rubyは2.4対応
    ● yukicoderの問題
    ○ 模試・勉強会の場を提供する位置づけで運営されているサイト
    ○ 自由に問題の投稿ができる
    ○ 概ね週1回の頻度でコンテストが開催されている
    ○ Rubyは3.1対応

    View Slide

  12. #rggjp
    Rails Girls Gathering Japan 2022
    競技プログラミング問題のいいところ
    ● やることがはっきりしている
    ● 問題がたくさん用意されている
    ● 問題の難易度も色々揃っている
    ● 解けたらサイトに提出すれば正しそうかどうかジャッジしてくれる
    ● 自力で解けなかったら解説もある
    ● どうしても分からなかったら他の人の正解コードを読んで勉強できる
    ● いろんなプログラミング言語で挑戦できる
    ● 過去問をちょっと解いてみるだけでも楽しい
    ● 慣れてきたら実際にコンテストに参加すればそれはそれで楽しい

    View Slide

  13. #rggjp
    Rails Girls Gathering Japan 2022
    実際どんな問題があるのか
    (AtCoder Beginner Contestの例)

    View Slide

  14. #rggjp
    Rails Girls Gathering Japan 2022
    初級編「プログラミングの勉強頑張る!」
    ● A: Hello, World+α、という感じの実装
    ○ これをスムーズに解けるようになるのが第一歩
    ○ たまに+αの部分が妙に癖のある問題があるので、難しく感じてもあまり気にせず
    ● B: ループを含んだ実装
    ○ 問題文の指示の通りにコードを書けば解けるように出来ている
    ○ ここまではアルゴリズムの知識がなくても練習次第で書けるようになる
    ○ Webサービス開発の通常業務で発生する「ちょっとややこしめの実装」が概ねこのあたり
    (個人調べ)
    ○ Rubyで解くと書き味の良さがよく活きる

    View Slide

  15. #rggjp
    Rails Girls Gathering Japan 2022
    中級編「アルゴリズムを学びたい!」
    ● C: 基本的なアルゴリズム知識とそれを使いこなすスキルが求められる問題
    ○ 基本情報や応用情報が射程に入ってくるのであればいい勉強になると思います
    ● D: もう少し突っ込んだアルゴリズム知識が必要になる
    ○ ここまで安定して解けるようになったら一般的な(アルゴリズムを専門領域としない)ソフトウェアエン
    ジニアとしては十分だと思う
    ○ いま私が目指しているのはこのあたり
    ● E: 競技プログラミングで使うアルゴリズムをだいたい理解し、基本的な使い
    こなしが出来ている必要がある(らしい)
    ○ この辺くらいで一般的なソフトウェアエンジニアとしてはアルゴリズムスキルのカンストと
    のこと
    ○ 正直ここからは自力で解けたことがないので各種資料を読んだ理解に基づく説明になります

    View Slide

  16. #rggjp
    Rails Girls Gathering Japan 2022
    上級編「アルゴリズム王に、私はなる!!」
    ● F, G: たぶん、普通の企業であれば出来上がってるサービスを使うような領域
    ○ 逆にそれを作る側の企業でのアルゴリズム開発に興味があるのなら、大変だと思いますが
    ここまで頑張ってみるのもあり
    ● Ex: 世界大会とか目指すような人が解く問題なので、とりあえず気にしなく
    ていいです
    ○ ここまで来ると正直”Beginner”とは…?と思うのですが、当初はD問題までだったところから
    増えての現在なので、相応に経緯があるようです

    View Slide

  17. #rggjp
    Rails Girls Gathering Japan 2022
    実際やってみてどうなった?

    View Slide

  18. #rggjp
    Rails Girls Gathering Japan 2022
    個人の感想です
    Rubyのコードがさくさく
    書けるようになりました!
    (個人比)

    View Slide

  19. #rggjp
    Rails Girls Gathering Japan 2022
    もうちょっと真面目に成長具合を説明すると……
    「A~C問題は概ね解き方が分かる」
    「他の言語の経験はあるがRubyは初心者で、簡単な処理を書くのもるりま頼り」
    という状態から3ヶ月ほど集中的にやってみた
    ● 実際、Rubyのコードはだいぶスムーズに書けるようになったと思う
    ○ 単純に反復練習になっているので、競技プログラミングで頻出の範囲であれば基本的な文法
    がスッと出てこなくてアワアワすることはなくなった
    ● 「何とかコンテスト中に3問解けた…」から「4問解けた!」にたどり着ける
    ようになってきた
    ○ 1問目~3問目の所要時間短縮+4問目の解答に必要なアルゴリズム知識の習得
    ○ 典型問題集があるので、まずはそれをコツコツ解いていくのが良さそう

    View Slide

  20. #rggjp
    Rails Girls Gathering Japan 2022
    最近の悩み
    一人で黙々とやってるの
    ちょっと寂しい……

    View Slide

  21. #rggjp
    Rails Girls Gathering Japan 2022
    最近の悩み
    競プロ友達が欲しい!

    View Slide

  22. #rggjp
    Rails Girls Gathering Japan 2022
    楽しいけど、難しいと思うことがないわけでもない
    ● 問題文が数学の問題みたいに見えて、慣れるまでちょっと難しいと思うかも
    しれない
    ○ 実際、C問題以降は整数の性質・集合・組み合わせあたりの数学知識は必要になってくる
    ● ある程度反復練習が必要
    ○ なんの予行練習もなくいきなりコンテストに出ると実際大変
    ○ C問題以上を解こうと思ったらアルゴリズムやデータ構造の勉強が必要になってくる
    ○ 最初にイメージした通りの結果が出るまでにある程度時間が掛かるので、割り切りポイント
    が分からないと心が折れやすくはある
    ● 初心者から世界大会レベルの人まで一緒くたになってやっているので、上を
    見るとキリがない
    ○ さっきの8問を30分で解くような人たちと比べてしまうと大体の人は病みます

    View Slide

  23. #rggjp
    Rails Girls Gathering Japan 2022
    もちろんプログラマーの中でも
    向き不向きのある分野で、
    気楽に気長にやっていくのがコツ
    それはまさに沼のような深みですので

    View Slide

  24. #rggjp
    Rails Girls Gathering Japan 2022
    なので、一緒にやりませんか?
    Rails Girls 競プロ部とか
    どうでしょう?

    View Slide

  25. #rggjp
    Rails Girls Gathering Japan 2022
    宣伝: 競プロの問題を体験できるイベント、来週開催!
    https://sendairb.connpass.com/event/267039/

    View Slide

  26. #rggjp
    Rails Girls Gathering Japan 2022
    私と競プロ友達になってください!

    View Slide