競技プログラミング
競技プログラミングは
言語の入門書を読み終わったあとに挑戦すべきものの一つ。
技術者としてトップレベルまで近づきたいと目標を持っている人等はオススメです。
現在の競技プログラミングは数学的知識がかなり必要になっています、中学、高校の数学が怪しい人はそちらの知識を固めておく必要があります。
競技プログラミングとは、数学オリンピック等の「競技数学」をプログラムで書ける問題を解くという意味のほうが近いです。
数学の問題を解くのが第一で、プログラムを書く能力はその次です。プログラムはソースコードを書く能力以外に、設計やセキュリティ、テスト等の力が必要ですが、競技プログラミングではその能力はほぼ問われません。
(※競技プログラミングは、最初プログラムを書く能力が最重要であり、数学の能力はオプションとして必要になるぐらいかな?と勘違いしていました。実態はその真逆で、主に数学の問題を解く力が上位にいくほど必要になってきます。もちろんアルゴリズムなどプログラミング能力も同時に向上させる必要があります。)
競技の主流はプログラムx数学ですが、その他にもいろいろな種類があります、プログラムで解くことを主にしたもの、就職面接対策を主にしたもの、セキュリティ専門のもの等があります。
競技プログラミングを入門書の次に学ぶことは数学とプログラムとの掛け算なので非常に相性が良く、プログラムの実装能力が上がっていくことを実感しやすいでしょう。(言語だけ学習すると英語学習のように能力が上がっているかどうか実感しにくいのです。)また競技プログラミングサイトではレートや級を表示するサービスがあり数値として視覚化しています、その数値をグラフで見ることで自身の成長も把握しやすいのです。
競技プログラミングが合わない人。
ある一定以上のレベルの競技プログラミングは高度なプログラミング技術を使うのでとても複雑なものになり、かなり勉強をした人でないと読み解くことが出来ません。チームで開発するプログラムは誰もが読めるプログラムを書かなくてはなりません。
自分以外も読みやすく保守・運営しやすいプログラムを書く必要があります。
(グローバル変数を多用したり、gotoを使ったり、1関数、1クラスが1万行などもってのほかです。)
参加するかどうかこの人のブログを読んでみてください。
今後のプログラミングコンテストへの参加について - tozangezan's diary
http://tozangezan.hatenablog.com/entry/2019/12/31/154409
競技プログラミングに参加するにあたってどのレベルまで頑張るかを自分も最初に決めておくべきだと思います、上は果てがありません。
算数の教養がほぼ0のプログラマが1年間AtCoderをやった結果の振り返り|きりみんちゃんノート|note
https://note.com/kirimin_chan/n/n889ec80b6fbc
AtCoderは基礎的なプログラムを組むような問題は出題されますが(100点~200点)、基礎的なアルゴリズムを問うような問題は少ない印象です、シンプルなバブルソートや二分探索を書きなさいというような問題は見当たらず、数学的な要素を絡めて解く事を求める問題が多いと思います。
※ 優れたプログラマーであるということは、どれだけ記憶するかではなく、問題を解決できるかどうかです。
競技プログラミングで問題解決のテクニックを覚えるためだけに問題を解くようになったら黄色信号です。
アルゴリズムの根っこを理解することが大切です。
AIの台頭 1
最近(2023年後半)まではAIでも競技プログラミングの世界ではまだ実力を発揮できていませんでした。
しかし、最近ではAIが競技プログラミングの世界でも活躍出来そうな勢いです。
AlphaCode 2
人間の競技者85%よりも高い水準に至ったと述べられています。
AlphaCode 1 は、競技プログラミングで中間レベル(参加者の約50%を上回る)でした。
↑twitterポストの全文
Googleが数時間前に発表した新しいAIモデル『Gemini』の高い推論能力が活用され、過去最高のプログラミングAI『AlphaCode 2』も同時に生み出されたとのことです。
人間の競技者85%よりも高い水準に至ったと述べられています。
- "AlphaCode 2 Technical Report"
競技プログラミングの世界では人間がまだまだ優勢が続いてきました。
これまでの最高の競技プログラミングAIであるAlphaCode 1でも、参加者の中間レベルです。
しかし今回のGoogleの報告によると、あらゆるタスクで最先端のパフォーマンスを見せる『Gemini』の力を転用し、AlphaCodeも大幅に進化しました。
■『AlphaCode 2』のポイント
① 競技プログラミングで85%の参加者より優れている
② より複雑な数学や理論的なコンピュータサイエンスの問題も解決
③ Gemini AIモデルをベースに進化し、より高度なコード生成
④ これまでのAlphaCode(AlphaCode 1)に対して、ほぼ2倍の問題を解決するようになったとのこと
■これまでのAlphaCode(AlphaCode 1)
① 競技プログラミングで中間レベル(参加者の約50%を上回る)
② 基本的な問題を解決可能
③ プロトタイプとしての位置付け、限定的な機能
■AlphaCode 2のフレームワーク
① 強力な言語モデル(Gemini)を利用して、コードサンプルを生成
② 生成されたコードサンプルをフィルタリングし、最適な候補を選出
■用途/機能
① 多様なコードサンプルを生成
② 不適切または誤ったサンプルを除外
③ 類似のコードサンプルをグループ化
④ 最良のサンプルを選択
ただし注意点もあり、まだ完璧ではないため、複雑かつ新規の問題に対するパフォーマンスは限定的になる可能性もあり、また専門知識がないと使いこなすのは難しいかもしれないとのことです。
なお、AlphaCodeシリーズの能力評価には「Codeforces」というプラットフォームが使用されています。
※台頭(たいとう)
頭を持ち上げること。勢力を得てくること。
AIの台頭 2
AIが数学オリンピックの難問証明 ひらめき獲得 数学者「ついに」:朝日新聞デジタル
2024年1月21日
30問中25問を正解、金メダルレベル(記事の一部を引用)
研究チームが開発したAIの名は「アルファ幾何学」。中高生らが参加する国際数学オリンピックで出題された、2000~20年の問題を解かせたところ、30問中25問を証明。従来のAIが解けた10問を大幅に上回り、数学オリンピックで金メダルをとれるレベルに到達した。
一方、生成AIのChat(チャット)GPT(GPT-4)は、一問も正解を導けなかった。
AIの台頭 3
OpenAIが新型人工知能「Strawberry」プロジェクトを密かに推進、以前「Q*」とリークで呼ばれていた数学が解けるAI - GIGAZINE
AIの台頭 4
競技プログラミングCodeforcesで,人類に混じって OpenAI o3 が全世界175位となりました。
OpenAI o3は ARC-AGIというベンチマークで75.7%を記録しました。
Codeforcesは、競技プログラミングコンテストサイトです。
OpenAI o3は,人間とは全く異質の汎用知能である危険性【東大解説】|神楽坂やちま(やっちん)
強くなるための一番の近道
問題を沢山解く
(※数学の天才を除く、聞いた話によると問題を見た瞬間コードが頭に浮かんて逆にコード入力する時間のほうが長いという人もいるそうです。詰将棋を見た瞬間に解けるみたいな感じですかね、まぁ問題にもよると思いますが。)
競技プログラミングのコードと会社で必要なプログラミング能力の違い。
AtCoder高橋社長がLINEのコーディング試験を見て驚いた理由―。「競プロとこんなに違うとは……」
※高橋社長はレッドコーダー(最高ランク)の実力者です。
競技プログラミングの能力
一点突破型
自分一人で問題を解くことが主ですが、チーム戦もあります。
技術力(プログラミング言語やアルゴリズムの理解)、問題解決能力、正確さとスピードなどが求められます。
周囲の人々は同程度の能力を持っており、互いに競い合います。
チームで戦う場合でも、周囲が同程度の能力を持っているため、阿吽の呼吸で戦うことが可能です。そのため、コミュニケーション能力がそれほど大きな問題にはなりません。
とにかくたくさんの問題を解くことが重要なので、コードの読みやすさや、メンテナンスはほぼ不要です。
会社でのプログラミング能力
チームワーク型
チームで解決する(会社に開発者が一人の場合もありえます)
技術力(言語やアルゴリズム)、コミュニケーション能力、問題解決能力、読みやすいコード、長期間のメンテナンスに耐えられる設計等
まわりの人たちは新人からベテランまで能力の範囲がバラバラです。
特に、営業の人やお客様は素人なのでコードを読めるかどうかも怪しい人と一緒に仕事をします。
なのでそれらのコードを説明する能力、つまり コミュニケーション能力が重要視 されます。
製品として使っている間はずっと同じプログラムなのでメンテナンスは年単位で行います。
ここでのコミュニケーション能力とは人付き合いのしかたという意味ではなく、自分の考えを正確に伝え理解してもらう能力になります。反対に、相手の考えや発言を正確に理解し、正しく解釈する能力になります。
日本では専門卒でなくても、未経験でも職につくことが出来ます。これが日本の会社においてコミュニケーション能力が特に重要視必される理由です、海外では専門卒の人が職につくので周りの人も同程度の能力を持っていると思います。
ある調査によると、日本のIT職でのコミュニケーション能力が最も重要であるというアンケート結果が出ています。
本当に必要なコミュニケーション能力
コミュニケーション能力を評価してはいけない理由 - An Epicurean
多くの人は同質な人に共感できるだけでコミュニケーション能力に問題がないと思っているし、それがコミュニケーション能力だと思っている
その解像度で新人にコミュニケーション能力を求めると、組織の同質性が高まるリスクがある
ビジネスの世界ではそれ以外のコミュニケーションが大事であり、単に「コミュニケーション能力」と一言で言えるほど単純なものではない
コミュニケーション能力を伸ばすために
中学受験とは何だったのか - nomolkのブログ
↓リライト記事
小学生に教えるために編集者歴17年の父親が本気で考えた…「きちんと伝わる文章」を書く10のコツ 「説明ができる」とは「生きる力がある」ということ | PRESIDENT Online(プレジデントオンライン)
個人でするWeb開発でのプログラミング能力
広範囲型
こちらは会社でのプログラミング能力に近いですが、会社はそれぞれ役割分担できるのに比べ、個人で開発する分にはすべての知識が網羅的に必要です。
一点突破型の競技プログラミングとは違い、浅く広く勉強していくイメージです。
それに、シンプルなWeb開発は、高度なアルゴリズムをまず使いません。
Web開発で必要な幅広い技術、ブラウザで表示する技術、サーバーでブラウザとDBをつなぐ技術、データを加工する技術、DBにアクセスする技術、デザインする能力、設計書を書く能力、運用する能力、分析する能力、作ったものを広める能力、マネタイズ、テスト駆動開発で開発する技術等が必要です。
セキュリティも重要ですが個人で開発する場合は認証など専門の認証ライブラリを使うことが推奨されていますし、クロスサイトスクリプティング、SQLインジェクション等などはもうすでに対策が施されたフレームワークなどを使ったりします。
このように、競技プログラミングとは違い、まったく別の技術力や能力が幅広く求められます。
コードを書くだけなら競技プログラミングだけの能力でいえば、灰色(100点~200点)の問題を解く能力があれば十分です。
もし、高度なアルゴリズムを使う場合は、まず既存のライブラリを探します。そして、そのライブラリを利用できるための技術力はそれほど高くありません。
※ただ現在のWeb開発は、個人では取得しきれないほどの幅広い知識 が必要なってきました。
これからはチームを組んで開発をしたほうが良いと思います。
この傾向は収まることはなくより広い技術を取得することが必要になって来ると思います、これはAIによって開発速度が上がりより広い技術が開発されていき、使用可能になったからです。高度な技術者達もAIを活用しているので開発スピードは上昇していくばかりです。
なので自分たちもAIなど便利なツールはどんどん使いましょう。
それぞれのプログラミング能力をどのように身につけるか?
このように必要なプログラミング能力は幅が広く、初級レベルの技術でも活躍できる場があります。
理想的には、全ての能力を最高値まで高められれば良いのですが、全技術を取得するための時間は、人生をすべて捧げても足りないでしょう。
これが俗に言う一生涯勉強というやつで、技術者を目指す以上は避けては通れない道です。
AIや機械学習など高度な技術力を目指す人から、より幅広い技術力が必要なWeb開発を目指す人まで、自分がどのような技術者になるのか自分なりのロードマップを作ると良いと思います。
レッドコーダーまで上り詰めた人
現役高校生が、AtCoderでレッドコーダーになるまでにやってきたこと。プログラミング上達の秘訣を全て教えます
この方は国際情報オリンピックで3度金メダルを取っています。
※ レッドコーダーとは、競技プログラミングではその人の個人の実力を独自の数式で数値化しており、その数字のレーティングを色でグループ分けをしています、そのグループ最上位の色が赤色でありその赤色にまで到達した人たちを指します。
言語
C++
これ一択 競技プログラミングAtCoder終了後の解説動画がほぼC++で説明されるため。(C++はOSなどを開発する人が使う言語なので深く入り込まない方がいいらしい。アルゴリズムとデータ構造を一通り取得するぐらいまでC++で学習する。水色や緑色までくらい?)
Python3
次点でPython3。(Python3では動作が遅いのでテストに通らない時がある。PyPyを使うといいらしい)
Ruby
Rubyもプログラミングの楽しさ、組みやすさ、便利さで候補に。(主観)C系統(c言語、C++、C++11、C++14、C#)と比べるとめちゃくちゃ便利、感動。
C♯
少数派のC# (ABC解説動画で解説の人がおすすめしていた。2019年7月27日放送分)なんでもデバック途中で配列の中身とかを簡単に見ることができるとか。(テストのPowerAssertを視覚確認するみたいなものか?)
AtCoder Beginner Contest 135 解説放送 - YouTube
動画の23分30秒頃
Rust
最先端の言語の一つ
これからの時代の言語
エディタ
VSCode
公開されたのは2015年
Visual Studio Code - Code Editing. Redefined
https://code.visualstudio.com/
業界標準と呼ばれるくらいに沢山の人に利用されているエディタです。
Cursor カーソル
公開されたのは2023年
ChatGPTが組み込まれたVSCodeのフォーク版
VSCodeはOSS(オープンソースです。)
VSCodeの拡張機能がほぼそのまま使えます。
AIに課金をすることでこのエディタの本領が発揮されます。
AI(GPT-4、GPT-3.5)とのAIペアプログラミングが可能です。
無料(AI使用制限有り)、約3000円/月、約6000円/月の3種類のプランがあります。
AI使用に特化した機能が盛りだくさん、そしてそれらが本当に便利です。
Cursor - The AI-first Code Editor
https://cursor.sh/
現在(2023年11月)最強のエディタの一つ。
※読み方はネイティブ発音だとカーサー、でも日本では同じ単語を使っているマウスカーソルがカーソルと根付いているのでカーソルと呼ばれることになると思います。
便利ツール
競技プログラミングで問題に集中するためのtools Windows10 WSL用 「code-runner」「atcoder-tools」 - Qiita
https://qiita.com/masakinihirota/items/30a45cd250c0c99f8626
Linux,Mac,Win10のWSLで利用可能
これは自動的に色々してくれる。
単純な入力コードの自動生成
問題の全サンプルを自動取得
期待される出力と、自分の出力を同時表示(疑似テスト駆動開発)
コマンドラインからの提出
その他ツール等
git
github
gist
競技プログラミングには関係ないが入門書が終わっているレベルなら慣れるために触っておくべき必修ツール。
githubにアップロードしておくことで、自分がどのくらい触っているか視覚化できる。就職にも便利らしい、githubを見るようにしていると言っていた。
競技プログラミングコンテストサイト
AtCoder
https://atcoder.jp/
コンテスト名はいろいろ変わるが、
毎週土曜日9時から100分間のコンテストに参加する。
初心者は
レーティング変化: ARC は ~ 2799、ABC は ~ 1199にレートが付きます。
の数字を見て参加をするかどうか判断する。
※2019/5/19 AtCoder Beginner Contest 126からレーティング更新対象は0-1999になります。
出題数も4問から6問に変更されます。
主にAtCoder Beginner Contest 1**
通称ABC
(※数字は開催回数)
時々企業がABCの代わりにコンテストを開催している。
コンテスト終了の10-20分後頃に実況解説が配信される。
コンテストに参加すると自身のレートが見れる。
(5回以上参加することで適正な数値が反映されるらしい)
AtCoder Programming Guide for beginners (APG4b) - AtCoder
https://atcoder.jp/contests/apg4b
これはAtCoderコンテストタイプのプログラミング学習
atcoderの参加者数とレート分布人数を見ることが出来るサイト。
atcoder.jp - Resource - CLIST
https://clist.by/resource/atcoder.jp/
競技プログラミング学習サイト
AIZU ONLINE JUDGE: Programming Challenge
http://judge.u-aizu.ac.jp/onlinejudge/
AtCoder:競技プログラミングコンテストを開催する国内最大のサイト
https://atcoder.jp/
※この2つは初心者の主戦場
英語と日本語の問題。
(問題文比較で英語の勉強にも TOEIC300点以上の人)
毎週の初心者用コンテスト開催
コンテスト終了後の実況解説
豊富な過去問
便利なオンラインジャッジシステム
自分の成長速度の視覚化
基本的な言語入門
など便利なものがたくさん。
AtCoder Beginners Selection - AtCoder
https://atcoder.jp/contests/abs
このコンテストは、「AtCoderに登録したけど何をしていいか分からない・・・!」という人に向けて作られた、初心者向け問題集です。
Courses | Aizu Online Judge
https://onlinejudge.u-aizu.ac.jp/courses/list
このコースは下記の参考書と連動している。
※便利
PROBLEM > Course > Introduction to Programming I
PROBLEM > Course > Introduction to Algorithms and Data Structures
PROBLEM > Course > Introduction to Programming II
COURSE > Lesson > Introduction to Programming I
COURSE > Lesson > Introduction to Algorithms and Data Structures
COURSE > Lesson > Introduction to Programming II
(※上記と同じもの)
AtCoder Problems
AtCoder Problems
https://kenkoooo.com/atcoder/#/table/
AtCoderの過去問ならココ。
使い方、自分のIDを入力する。
そうするとそれぞれのページに自分のデータが反映される。
Table 過去問
List 自分のステータス、レート指定した問題のリスト。
User Page 自分が過去に解いた問題の割合。
提出済みになると問題タイトルの背景色が緑色になる。
問題の難易度は50%以上の人が解けるとそのレートの色になる。
問題名の文字色が
茶色なら、レーティング茶色の人たち50%以上が解けた。
水色なら、レーティング水色の人たち50%以上が解けた。
オレンジ色なら、レーティングオレンジの人たち50%以上が解けた。
アルゴ式
アルゴ式は
- プログラミングや情報科学をコツコツ学べる「教科書」
- 学んだ内容をゲーム感覚で大量に実践できる「練習問題」
の2つで構成される、Web上で完結した学習コンテンツです。
問題集
[2023年1月版]競技プログラミングを始めたばかりの人にオススメの問題集 - Qiita
https://qiita.com/ktateish/items/afe1494a5cccb1ef13c7
codewars
英語サイト
https://www.codewars.com/
良いところ
易しい英語で問題が書かれているので英語力もアップ。
テスト駆動開発でのプログラミング。
豊富な問題選択方法。
悪いところ
自分がパスするまで他人のソースが見られない。
ブラウザ上なのでエディタ等の支援がない。
詳細は↓
【CodinGame】ブラウザでコーディングの基礎からトレーニングできるサイト (疑似ゲーム開発環境を使って学べます。解答は25種類のプログラミング言語から選択して記述可能!) - Qiita
https://qiita.com/javacommons/items/86efba2d0ce6b2a21fb9
※目標1日5題以上。VSCodeでプログラムを書いてから提出すると楽。
※英語は同じURLの画面を2面用意して、片方はgoogle翻訳にかけておく。
デュアルディスプレイで見ていくと捗る。
LeetCode
英語サイト
LeetCode - The World's Leading Online Programming Learning Platform
https://leetcode.com/
GAFAプログラム就職面接用に特化した競技プログラミングサイト
GAFA等におけるプログラム就職面接での過去問集とも言えます。
Problems - LeetCode
https://leetcode.com/problemset/all/
Easy,Medium,Hardとレベルも絞り込みできるので、英語ができるなら初心者でも挑戦できます。
プロジェクトオイラー
英語サイト
Project Euler
https://projecteuler.net/
※上記のcodewarsもここから問題を拝借している。
参考書
問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本 | 米田 優峻
オンラインジャッジではじめるC/C++プログラミング入門
プログラミングコンテスト攻略のためのアルゴリズムとデータ構造
この順番で読む、この2冊は
AIZU ONLINE JUDGE: Programming Challenge
http://judge.u-aizu.ac.jp/onlinejudge/
と連動している。
この2冊終了後は蟻本を読むといいらしい。
合計3冊で競技プログラミングはすべてまかなえるらしい。
↓本の内容とほとんど同じ
Courses | Aizu Online Judge
https://onlinejudge.u-aizu.ac.jp/courses/list
学習の仕方
↓ネットで拾ったもの
下記のリンクを開いて画像の表を見てください。
競技プログラミングレベル別早見表
白のゾーンに取り組むのがおすすめ。
オレンジは解けなかったら要復習(強い人のコードを見るのは良い)
赤は練習する意味なし。
青ゾーンはチャレンジゾーン。
黒はまだやらない。
AtCoderの
100点問題は100点以上を10問練習すればだいたい安定する
200点問題は200点以上を20問練習すればだいたい安定する
300点問題は300点以上を40問練習すればだいたい安定する
400点問題は400点以上を80問くらい練習すればー
※あくまでも数学をやってきた人たちが対象であり、文系であったり数学の土台がゆるかったりすると、この3-5倍の努力が必要です。
[Tutorial] A Way to Practice Competitive Programming : From rating 1000 to 2000 - Codeforces
https://codeforces.com/blog/entry/53341
1000から1250の間で評価を得るためには、
CodeforcesのDiv.2コンテストで
少なくとも1つの問題を解決する必要があります。
AtCoderでは、300ポイントの問題は評価のレベル1100-1250です。
出題形式などの傾向が固まったのがABC042からだそうです。
それまでは問題の難易度と点数の変動が激しかったとかなんとか・・・
AtCoder コンテストについての tips - Qiita
https://qiita.com/drken/items/8a6f139158cde8a61dce
レーティング 色 AtCoderJobs ランク レベル感
3000- ターゲット(レーティングが3000に達した人 世界上位0.2%)
2800- 赤 SSS 世界レベルのトップ選手です。現在日本に20人前後しかいません。(世界上位3%)
2400-2800 橙 SS 各大学で数年に 1 人レベルのトップ選手です。
2000-2400 黄 S 各大学のエース級選手です。
世間的にはアルゴリズム特化のリサーチャーなど、
エキスパートとして活躍できる実力です。
1600-2000 青 A 世間的にはアルゴリズムスペシャリストとして活躍できる実力です。
1200-1600 水 B 世間的にはソフトウェアエンジニアとして
トップレベルの実力です。
Paiza の S ランクと同等とされています。
800-1200 緑 C ソフトウェアエンジニアとして申し分ない実力です。
400-800 茶 D 各大学の情報系学部でしっかりとプログラミングを勉強して上位 3 割の成績を収めている学生さんの実力です。
1-400 灰 E 初心者ですが伸びしろがたくさんある状態です。
参考
勉強か?趣味か?人生か?―プログラミングコンテストとは
https://www.slideshare.net/iwiwi/wakate-web-14323842
p59
コンテストのレベル
コンテストの略語
AT=AtCoder
CF=CodeForce
TC=TopCoder
target(ターゲット)
red coder(レッドコーダー)
red line--------------
AT2800=CF2400=TC2200
nomal line--------------
AT2000=CF1900=TC1500
AGCはレッドコーダーまでが対象=無制限
ARCはred lineより下のレベルまでが対象
ABCはnomal lineより下のレベルまでが対象。
AtCoderは、
プログラミング入門者はまず茶色、
初級者は緑、そこそこ出来る人は水色を目指しましょう、
というのがオススメで、水色まで行けば十分すごいです。
青コーダーって「東証1部上場のIT系会社の1つの中で競プロ最強」
くらいのポジションに普通になれてしまう可能性のある
くらいのレーティングなので、普通に自信持ってください。
黄色クラスがいる会社って日本に2桁しかないと思います。
平均レーティングは 600〜700 (茶色上位相当)(補正をなくした場合)
出来 パフォ 備考
A の 1 完 -600 ~ 0 まずは 2 完を目指しましょう。
A, B の 2 完 0 ~ 600 C が解けるようになると楽しくなります。
A, B, C の 3 完 600 ~ 1200 スピードによります、幅が広いです。
A, B, C, D の 4 完 1200 ~ 1600 D が解けるなら ABC は卒業です。
100点 標準入出力・条件分岐・論理演算・四則演算ができる。
200点 ループ・配列・複雑な条件分岐ができる。
300点 オーダの計算・DP・しゃくとり法・貪欲法・STLが少し使える。
400点 上のものが理解できる、人に説明が出来る。
2019年10月24日
ABCの難易度について
Cまでを普通の早さで解いても灰色レベルの評価になります。
灰色評価でも実力はピンきりでその中でも実力差はかなりあります。
昔は、全4問出題時にはCという壁(=300点以上になるための)がありましたが
現在では、全6問出題でDが壁(=300点以上になるための)となっています。
Cまでは問題文を素直にプログラムにする能力が求められますが、
Dからは素直にプログラムを書くだけではダメで、アルゴリズムの片鱗の力が必要となってきます。
上記の300点(草刈り、固定、3重ループを2重ループにして書く等)の技術。
コンテスト中の問題の難易度
AtCoderの場合、上位選手の一覧を見る。
最速正解者の時間を見るとどれだけ時間を掛けて解いているのか見ることが出来る。時間がかかっているほど難しい。
CよりもDの方が簡単な場合がある等と見ることが出来る。
RedCoderの実力
[「1000のアルゴリズムを持つ男」vs.「やわらか頭脳」 (1/3) - ITmedia エンタープライズ]
(https://www.itmedia.co.jp/enterprise/articles/0910/10/news003.html)
「小学生までの算数の知識で解ける問題をこなすことができればYellowCoderに、中学生までの数学の知識で解ける問題をこなせればRedCoderになるのはそう難しいことではありません。」
レッドコーダー
世界最強のレッドコーダーへのインタビュー
質問:トップ選手はどのように育つ?
答え:修行あるのみ!!問題をときまくる!!
touristさん=>10000問解きました。
(touristさんは高校生(当時)ながら人類最強クラスの戦闘力を持つ選手の一人。)
闇雲に解けば良いという物ではない
丁度いい難易度&質の良い問題
ただ解くだけじゃなく、最大限に知見を得る
参考
https://www.slideshare.net/iwiwi/wakate-web-14323842
p62,p63
https://twitter.com/chokudai/status/1267300867964727297
これ言っておきたいんだけど、touristが「1万問解いた」って言った時期は、今ほど簡単な問題がたくさん転がってる状態じゃなかったと思うし、問題数に注目してる人から見ると、今の2万問とか3万問に該当すると思う。
略語
蟻本 =プログラミングコンテストチャレンジブック [第2版] ~問題解決のアルゴリズム活用力とコーディングテクニックを鍛える~
数年前の本なのでそろそろ第3版が待たれる。
AtCoderのレートが灰色や茶色から卒業してから読むぐらいのレベルの本。先輩たちの言葉から聞くに、完成度がかなり高い。
UF = Union Find, p.81
WF = Warshall Floyd, p.98
CHT = Convex Hull Trick, p.304
TLE
Time Limit Exceeded
時間切れ
数学の勉強
数学1 集合と論理
数学A 場合の数と確率
数学A 整数の性質
数学B 数列
離散数学 集合論 整数論 グラフ理論 組合せ論
コンピューターサイエンス
150 分で学ぶ高校数学の基礎 - Speaker Deck
https://speakerdeck.com/e869120/150-fen-dexue-bugao-xiao-shu-xue-noji-chu
アルゴリズム・AtCoder のための数学【前編:数学的知識編①】 - Qiita
https://qiita.com/e869120/items/b4a0493aac567c6a7240
アルゴリズム・AtCoder のための数学【中編:数学的知識編②】 - Qiita
https://qiita.com/e869120/items/bd7cfd2dbd2706cb8657
アルゴリズム・AtCoder のための数学【後編:数学的考察編】 - Qiita
https://qiita.com/e869120/items/1ccb2bdf16890637e767
CS50 for Japanese: コンピュータサイエンスの入門
https://cs50.jp/
ハーバード大学のコンピュータサイエンス入門講座「CS50」の日本語版翻訳
競プロの勉強
レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編:競プロを始めよう】 - Qiita
https://qiita.com/e869120/items/f1c6f98364d1443148b3
レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】 - Qiita
https://qiita.com/e869120/items/eb50fdaece12be418faa
レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【上級編:目指せレッドコーダー!】 - Qiita
https://qiita.com/e869120/items/acba3dd8649d913102b5
コツ
考えない。
0から考えられる人は数学などをやってきているので最初から出来る。出来ないと感じたらすぐ教科書や他人のソースを見て考え方を学ぶ、それから何度か写経して見ないでも書けるようにする。
車輪の再発明をしない。
出来ないのは知らないから出来ない場合が多い、文法を知らない、関数を知らない、テクニックを知らない、アルゴリズムを知らない等、知らないものを自分で考えるのは時間の無駄になってしまう。
出来るようになったら類似問題で考える力をつける。
Wiki
アルゴリズム - PukiWiki
https://home.wakatabe.com/ryo/wiki/index.php?%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
データ構造の入門書
アルゴリズムとデータ構造は切っても切り離せないもの。アルゴリズムだけではなくデータ構造も学習しよう。
その他
Competitive Programming Contests Calendar
https://competitiveprogramming.info/calendar
競技プログラミングのカレンダーです。
AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ - Qiita
https://qiita.com/drken/items/fd4e5e3630d0f5859067
AtCoder に登録したら解くべき精選過去問 10 問を別解で解いてみた - Qiita
https://qiita.com/259_Momone/items/991d31ccc1f830a1d578
アルゴリズム - PukiWiki
http://home.wakatabe.com/ryo/wiki/index.php?%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
競技プログラミング練習問題集 - はまやんはまやんはまやん
https://www.hamayanhamayan.com/entry/2100/01/01/000000
その他 コンテストサイト 練習サイト
Design & Build High-Quality Software with Crowdsourcing | Topcoder
https://www.topcoder.com/
Codeforces
http://codeforces.com/
yukicoder
https://yukicoder.me/
Welcome To PKU JudgeOnline
http://poj.org/
AtCoder Problems の Virtual Contests
https://kenkoooo.com/atcoder/#/contest/recent
その他 バランスボール
猫背でコードを書いていると腰痛の原因となります。
おすすめ
アンチバースト(これがついてない物だと、破裂したときしこたま腰を打ってしまう。)
表面がざらついているもの
その他 おすすめの漫画
藏丸竜彦 数学ゴールデン(数学オリンピックを目指す物語)
絹田村子 数字であそぼ。(大学での数学とは)
たぶん、今 日本の数学漫画?のTOP2
数学の勉強として、覚える、問題を解く、考えるがあると思います、
高校までの数学は公式などを覚えて問題を解くのが基本で、考えるは大学の数学と比べたらほんのすこしです。
まぁ高校の数学もちょっとはします、でもまだ吸収の段階だからですね、計算の速さや、正確さ等の力を伸ばす時期です。
しかし大学から全くと言っていいほど違います、たしかに最初の方は問題を覚え解く問題もありますが、
まずなによりも、 考えることが最重要 になってきてそれが大部分を占めるようになっていきます。
中学高校時代は「覚えるのが得意」で、公式を使って解くような数学が得意だから、100ます計算やそろばんをやっていて計算するのが早いから大学も数学を勉強しようと思っている人はそれは勘違いですので考えを改めましょう。
その苦悩を描いた漫画が「数字であそぼ。」になります。
考えることが出来る人は数学オリンピックなどを目指しているでしょう、そんな数学の問題を考えることが楽しいという人には、「数学ゴールデン」をオススメします、まさに数学とは考える学問であるということに高校生が数学オリンピックをめざし、問題に正面からぶつかっていく漫画です。
※この2冊の漫画は、競技オリンピックや大学での数学について何も知らないのならばおすすめです。
※競技プログラミングは数学的に考えたことをプログラミングを使って表現する競技です。
追記 2024/01/19
※ ここで紹介していた「数字であそぼ。」が見事第69回小学館漫画賞を受賞されました、絹田村子先生おめでとうございます。
第69回小学館漫画賞に「葬送のフリーレン」「逃げ上手の若君」など4作品 部門は廃止 - コミックナタリー
藏丸竜彦 「数学ゴールデン」も受賞できるぐらいの力を持った作品ですので、こちらもぜひ読んでみてください。
その他 ラバーダックデバッグ
競技中にペアプログラミングやモブプログラミング出来ない時にぬいぐるみをそばに置きます。
「ディスプレイの脇のアヒルちゃんに説明することでバグに気づき、品質を高める」#ラバーダックデバッグ という手法があるけど、絵面だけでも草w - Togetter
https://togetter.com/li/1554459