はじめに
- 最近、競技プログラミングという言葉を知り、それに参加することが自分のプログラミング能力を向上させるのに役立つらしいことを知る。
- 日本においてはAtCoderが最もメジャーらしいので、チャレンジしてみた。
準備
- とりあえず、HPに来たものの、何をどうすればいいのかわからない。とにかく、新規登録は必須だろうからしておく。
- さて、新規登録後、HPを見てみると、レーティングに応じた求人も行っている模様。要求ランクがD,C,E以上などと書かれている。このランクをどうやって得ればいいんだろう?
- 上の画像の右上にAtCoderInfoとあるので、そこを開いてみると、一番下にこのようリンクがあった。
- 当然、AtCoderとは?を開いてみる。
- そこでは、「AtCoderには、 Algorithm Contest , Heuristic Contest の2種類のコンテストがあります。」とかかれており、それぞれ、下記の説明がされている。
- Algorithm Contest は与えられた問題を解決するプログラムを、早く正確に提出し、その正解数と順位を競うコンテストです。
- Heuristic Contest はAtCoderで2021年からレーティングを付け始めた、新しいタイプのプログラミングコンテストです。Algorithmコンテストでは、解けた/解けないを競っていましたが、Heuristicのコンテストでは、どれだけ改善できたかを競います。
- ふむ?コンテストに参加して、レーティングを得るという流れの模様。将棋やチェスのイロレーティングみたいな相対評価なのかな?
- 先程のリンクの中から、レーティングの仕組みを開いてみると、下図の説明があった。
- なるほど、公式コンテストに参加することがレーティングを得る手段であり、参加者の上位半分に入るまでは、『灰色』の人生が待っている、と。
- また、Algorithm系コンテストについて言えば、新しいコンテストの結果の方がレーティングへの影響が大きく、参加回数が少ないうちはマイナス補正がかけられる、と。
- jobの所に書いてあったランクはこれだね
やってみる
- 概ね理解したから、コンテストに参加してみよう。
- 一番最初の画面に戻ってから、コンテストをクリックすると次の画面が出る。ふむふむ、常設のコンストがあるのね。最初はここから選べば良さそうだ。頭にⒶと書かれているのが Algorithm Contest だね。
- とりあえず、Beginners Selectionを選び、「参加登録」ボタンを押してみたけど、ボタンが消えて、「参加登録しました。」と表示されただけで、画面に大きな変化はない。よく見ると、Rated対象が「ー」だから、このBeginners Selectionは、解けても解けなくてもレーティングには影響しないのかな?
- タブ「コードテスト」を開くとこんな感じ。言語を選べるみたいね。ここにコードを書いて動作確認してから、コードをコピペして回答するのかな?
- タブ「提出」を開くとこんな感じ。このタブで、問題を指定して答えを提出するのね。
- タブ「問題」を開くとこんな感じ。各問の右側の「提出」を押したら、タブ「提出」に移動する。
- いよいよ、問題を解いてみる。問題「PracticeA - Welcome to AtCoder」について、タブ「提出」に解答コードを書き込んで「提出」ボタンを押すと、画面が切り替わりこんな感じになり、詳細リンクを押すと、詳細が分かる。
- 問題文の説明は割愛するけど、このケースでは、swiftで書くのはきついと感じたね。「標準入力」という概念のあるc言語とかじゃないと、アホみたいに簡単なロジックでも、input文を書くのが面倒そう。
おわりに
- うーむ、swiftで書いてやろうと思ってたけど、出鼻をくじかれた感じ。
- 次は、過去問を読んでみて、どの言語がやりやすいのか確認してからやりこんでみたい。
- レーティング対象のコンテストは、土日にやってるみたいだね。初心者なら、ABC(AtCoder Beginner Contest)からやるのが普通なのかな?開始時間が決まっていて、制限時間もあるから、非レーティングコンテストで慣れてからやった方がいいね。
- そう言えば、重要なことを伝えるのを忘れてた!AtCoderでは、他人の解答も見れる!だから、コード量が少ない書き方や、実行時間の少ない書き方が分かる!これが、一番、勉強の役に立つんじゃないかなぁ。
AtCoderは、他人の解答を見る事が出来るから、とても勉強になる!!
おまけ
swiftの標準入力関数は、func readLine(strippingNewline: Bool = true) -> String?
- swiftでの標準入力の読み込ませ方は、こんな感じ
- 空白で区切られた、複数の整数を読み込ませる場合(配列として入力される)
let values = readLine()!.split(separator: " ").map{Int($0)!}
- 連続した1桁数値を読み込ませる場合
let values = Array(readLine()!.map{Int(String($0))!}
- 空白で区切られた、複数の整数を読み込ませる場合(配列として入力される)
- swiftでの標準出力はprint関数とのこと。初めて知ったよ。まあ、コンソール画面に出力するために使ってたから、たしかに標準出力なのかな?
- 無謀にもいきなりレーティングコンテストに挑んだ『はじめてのぎょくさい』も見て、笑ってくれると嬉しい。すごいレーティング結果になったよ。