思えば遠くへ来たもんだ

怪しい認知科学を紹介しながら、行き着くところへ目指すのを綴る場所

atcoderちょーたのしいよー

競技プログラミング

僕が競技プログラミングというものに触れたのは3年前のことであった。

今まで、プログラムといえば、そこらへんの専門書にある

基本的な内容を満たすコードぐらいしか書いたことが無かった自分にとって

競技性のあるプログラム大会というのは、少し興味をそそられるコンテンツであった。

何が魅力なのか?

問題をプログラムで他の人よりも早く、多く解くという競技性だと僕は思う。

用意されている幾つかの課題に対し、適切なプログラムを書いて行き、

終了時に、何問解けたか

どれぐらい時間がかかったか、解いた問題の難しさはどの程度か(難しい問題の方が

高得点)、それらを集約した総合性で他の参加者と対戦する。

そのため、必ずしもすべての課題が "ベスト"なプログラムを用意する必要はなく

飽くまで "その問題に用意されているテストケースを通せば良い" ので

どこまで「手を抜くか」という方略も考える必要がある。

最終的に、他の人より点数が取れていればいいので、人によっては一番簡単な

問題を後回しにするやり方もある。

ただし、最後の方の問題をを解ける人達は、大会によって数十人とかザラにある。

なので殆どの人は簡単な方から難しい方へ、という戦略を取って、少しでも点数稼ぎ

をする。(時々、難しい方からやってみたりするのだが・・・、お察し)

 

参加していくことでどうなるの?

一番有名な大会といえば、ICPCである。

これは、日本だと予選が日本であり、そのあとアジア大会、その後世界大会(?)と

最も参加数が多い大会なのではないかと思う。

僕は、正直言うとゴミみたいなプログラマなので、予選しか参加したことがない。

まあ、それだけすごい奴らが集まるのである。

上に行けば上に行くほど、正直同じ人間なのかな?と思ってしまう。

大会から数ヶ月?ぐらい経てば、AOJ(AIZU ONLINE JUDGE)と呼ばれる

様々なコンテストの過去問をまとめたサイトに載るのだが、正直見るだけで

お腹いっぱい。そもそも英語だし。読めても何を求められているのか意味不明だった

こともある。

上には上がいるのだなあ、と理解するには適した大会である。

さてこの大会は一年に一回しかない。

だからこそ、それに向けて練習をする必要があるのだが

どうすればいいのか?

そこで今回紹介するのがatcoderと、言われるサイトである。

 

やればやるほど、上がっていく(はず)

AtCoder

とは、日本発の競技プログラミングコンテスト運営会社(株式会社atcoder)が運営する

サイトである。

詳しいことは、恐らく他の人達が散々挙げているので、省くが

ここは、有り難いことに毎週と言っていいほど、コンテストを開催する。(大体土曜日)

ABC(ビギナー用)とARC(後で言うレート1200以上の人たちためのコンテスト)の

2つのコンテストが主である。

時たま、名前の聞いたことある会社(ドワンゴとか)協賛の企業プログラムコンテスト

だったり、一年に一回の競技プログラムコンテストの祭典Code Festivalの予選が

あったりする。企業プログラムコンテストは賞金が出るといったこともあるが

ここでは割愛する。

 

そこで、今日はABC106が開かれ、久しぶりに(数カ月ぶりに)参加したわけです。

いつも4問(A,B,C,Dとアルファベットが割り当てられている)出題され(図1)

それぞれプログラムを書いていき、提出前のサンプルケースを試して(図2)

いざ提出(図3)、後は、向こうが用意しているテストケースが通るの祈る。

通せれば緑色のアイコン、通せなければオレンジ色のアイコンが出てくる。

緑なら、次の問題へ、オレンジなら残念もう一回といったことを(図4)

時間内にやっていくこと必要がある。

 

f:id:anmitsuc:20180819000804j:plain

図1

 

f:id:anmitsuc:20180819000948j:plain

図2

f:id:anmitsuc:20180819000905j:plain

図3 

f:id:anmitsuc:20180819000953j:plain

図4 オレンジ多くない?

言語は、広く対応されていて書ける環境があれば、直ぐに参加できる。
なので、気軽に参加できる。

まさにプログラム初心者にとって、うってつけな環境である。

(問題文も大体日本語だし)

もちろん、初心者がプログラムを学ぶために使うコンテンツとして適切かは

不明だが、モチベーションの維持をする一つになるのではないだろうかと思う。

・・・まあ、僕はモチベ上がったり下がったりしているのですが。

 

因みに、今の自分の実力を知る指標の一つとしてレート制度がある。

コンテストに出るたびに、レートが上下するので、続けていくうちに

自分の実力が向上しているのが分かります。おそらく。

f:id:anmitsuc:20180819002011p:plain


最初はグレーだったのが、段々上がって1000を超えて、今は下がり気味である。

しかし、やる前よりは割りかし実力が上がっているということを、グラフで可視化

してくれる。ちなみにこれぐらいで、ABCのC問題(3問目)をすぐに解けると

いった感じである。

D問題を解こうとすると、ある程度のアルゴリズムを知る必要がある。

そこで僕は・・・。モチベが下がりました。

そして、幾つもの歳月が流れて、今ようやく久しぶりに参加したわけです。

久しぶりにやると、そもそもC++を書くのが久しぶりだったので(最近は

流行りのpythonばっかやってたので)、Cまでたどり着くのに苦戦してましたが(図3)

何とか、C問題まで解くことは出来ました。

D問題は、解けるプログラム自体は出来ましたが、制限があり

もう少し早く解けるプログラムを組む必要がありまして・・・。そこでタイムアップ。

やっぱり少しでも、実力を向上させないとなと、痛感させられました。

 

どうやって、実力向上しようかな

コンテストが終わると、最近は解説のpdfがすぐに上がります。

そこで、解説を見てアルゴリズムを学ぶ、実装の仕方を知ることで

少しでも自分の手段を増やしていく。そうやって実力を伸ばすことが出来ます。

今回も終わった直後に上がっていたので、後で確認して自分で組んでみたいと思います

他にも、終わったコンテストならば、他の人が書いたソースコードを見ることも出来

他の人がどんなふうに書いているのか、参考にすることができます。

後は、過去問を解いてみる。

自分の実力の1個上(僕だったらD問題)を解き続けていければ、いつかコンテストの

問題制覇も夢ではない・・・はず。

 

最後に

色々述べてきたけど、要はプログラムで楽しもうぜって話です。

色んな人のコードを見ることが出来る、というのも魅力の一つです。

そこから、自分の書き方の多様性を広げていける。

自分の知らない知識を楽しんで学べていける。

それを簡単に行える場所、それがatcoderだと僕は思います。

と、あまり参加してない僕が言うのは変ですが、久しぶりに参加したせいか

その熱が下がらず、ここまでブログに記してしまいました。

一人でも増えてくれることを願って、次回のコンテストで一緒に戦えたら

いいなあと。

そう思って、ここで先輩が行った言葉を最後に、閉めさせていただきます。

  ------一つでも多くの問題を解いて、問題に慣れること

           そうすれば、強くなれる----------

以上です。