【ポエム】サッカーもゴルフもできないので競技プログラミングにチャレンジしてみる

AtCoderで茶色を目指す
2020.05.01

普段から外でやるスポーツをやることが多いのですが、このご時世では難しい、何かないかなと考えていたところ、 競技プログラミングという名のスポーツがあるよと教えてもらいました。

Wikipediaには、

競技プログラミングでは、参加者全員に同一の課題が出題され、より早く与えられた要求を満足するプログラムを正確に記述することを競う。コンピュータサイエンスや数学の知識を必要とする問題が多く、新卒学生の採用活動などに使われることもある[7][8]。多くのコンテストでオンラインジャッジが採用されている。また、競技プログラミングに参加する人を「競技プログラマ」または「競プロer」と呼ぶことがある。

なるほど、これなら家でもできますね。 プログラミングはちょこちょこやっているので私にはとっつき易い感じなのでやってみようと思った次第であります。

やりはじめる

競技プログラミングでググって一番上に出てきたAtCoderを使っていきます。 国内最大で、過去問も3000問以上あるとのこと。

基本的な流れは、

コンテストに参加 -> 問題を解く -> 提出する -> 採点される -> 得点によってレーティングされる

こんな感じのようです。

レーティングは色で分かれているようで、1回コンテストに参加すると灰色、次のランクは茶色です。

勉強してコンテストに参加を繰り返し茶色を目指します。

前提

  • AtCoderに登録する
  • 使用言語
    • C
    • C++
    • Java
    • C#
    • PHP
    • D
    • Go
    • Python2
    • Python3
    • Perl
    • Ruby
    • Haskell
    • Pascal
    • JavaScript(Node.js)
    • Scala から選択できる

初心者向け問題集をはじめる

AtCoderは親切で、

「AtCoderに登録したけど何をしていいか分からない・・・!」という人に向けて作られた、初心者向け問題集 というのがあります。

AtCoder Beginners Selection

ここに10問あるので、まずはこれを解いていくことから始めていきます。

コンテストに参加するのはどんどん過去問を解いて慣れてからの方が良さそうです。

プログラミングをやったことない人は、AtCoder Programming Guide for BeginnersC++の勉強を勧められています。

初心者向け問題集の1問目

1問目を見てみました。

入力は標準入力で与えるのが基本のようでした。

実際に提出したコード(Go)

package main

import "fmt"

func main() {
	var a, b, c int
	var s string
	fmt.Scanf("%d", &a)
	fmt.Scanf("%d %d", &b, &c)
	fmt.Scanf("%s", &s)
	var sum int = a + b + c
	fmt.Printf("%d %s", sum, s)
}

AtCoder Beginners Selectionにコードのテストができるところがあるので実際に試したところ、

このように実行結果、実行時間、メモリ、標準出力が表示されます。便利。

実際に提出してみると、

このように結果が表示されます。

今後の流れ

ひとまずは初心者向け問題集を全て解き、その他の過去問もやっていくことになりそうです。 朝昼晩に1問ずつぐらいのペースで。。。

問題を見るとわかるのですが、数学の知識も必要になってきます(数列や公約数や因数分解など)。 その上でアルゴリズムとはなんぞやを理解しないといけないと感じました。

どのアルゴリズムが使えそうか問題を読んで判断できるようになりたい。

その他、読んでおいた方がいい本、勉強法、オススメのツールなどあったら教えていただきたく思います。 がんばるぞい