リベンジのつもりで挑戦したドワンゴからの挑戦状でボコられた話

つらみ。途中からWAが並ぶ辛さといったら。
でもさらに競技プログラミングに火がついたのは確か。

[ドワンゴからの挑戦状](http://dwango.co.jp/saiyo/dwacon2017/)は「競技プログラミング」というジャンルでした。

#競技プログラミングとは？
競技プログラミングでは、参加者全員に同一の課題が出題され、より早く、与えられた要求を満足するプログラムを正確に記述することを競う。コンピュータサイエンスや数学の知識を必要とする問題が多い。新卒学生の採用活動などに使われることもある。多くのコンテストでオンラインジャッジが採用されている。(引用:[Wikipedia](https://ja.wikipedia.org/wiki/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0))

つまり単純な問題を、好きな言語で自分のアルゴリズムでいかに早く正確に解くか、ということを競うものです。
ソースコードを書いたら問題のページに提出。自動採点なので待ちます。
サイトに用意されてる20〜40件のテストパターン(入力例)を全部クリアすればその問題は正解。問題に応じて得点が与えられます。

たくさんの企業で○○なレートまで行った人は優遇されるなどもありますし。

##初心者殺しである

私が競技プログラミングを初めてやって見たのは某大手のインターン選考を受けた時でした。
URLをクリックして出てくる問題。

「ほー、あれとあれをこうすれば解けそう、簡単じゃん〜」
そう思ってました。コードを書くまでは。

しかし、いざ入力しようとするといきなり問題が目の前に現れるのです。

###「入力は以下の形式で標準入力から与えられる」

競技プログラミングは自動採点なのでソースコードは、標準入力を受け付ける形式で書かなければいけません。しかも形式は様々なので、それに応じて変えなければならない。

- スペース区切り
- エンターの連続
- 複数種類の型入力
- EOFを受け付けるまで

などです。

#はじめての競技プログラミングの結果
最初の競技プログラミングはこの標準入力で早速つまづき、凄惨な結果に･･･。

そう、**0/4問正解**でした。
まず環境構築に時間がかかりました。
エディタと実行テスト用のターミナル、ググる用のブラウザウィンドウ。経験者はちゃんと用意してあるんだろうな･･･と思いながら。

問1のアルゴリズムを理解したものの標準入力で悩み、何度もコンパイルエラー。
「ローカル環境では動くのに、実際に提出するとエラーになるのなんでや！」
という始末でした。

終わり際に何とか最初のいくつかのテストパターンで正解したものの後半は答えが違う･･･

ほとんどの問題では全てのパターンをクリアしないと得点が与えられないので結果全問0点でした。

##・初心者殺しじゃないか！！

これにはめっちゃショックを受けました。
「選考にまたこんな形式のテストがあったら大変なことになる･･･！」と。
ここで1回目の競技プログラミングへの熱が高まりました。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">Swiftである程度書けるようになったから、Playgroundで書けるからという理由で、プログラミングテストの回答をSwiftで書いていたら、標準入力で思いっきり詰んだおかげで全問回答できなかった･･･！つっら</p>&mdash; にーさん (@ni_san2000) <a href="https://twitter.com/ni_san2000/status/799208951946440704">November 17, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">新しいコンテンツ「競技プログラミング」に目覚めてしまったかもしれない <a href="https://t.co/Sdkl1wsgOV">pic.twitter.com/Sdkl1wsgOV</a></p>&mdash; にーさん (@ni_san2000) <a href="https://twitter.com/ni_san2000/status/799428243367411712">November 18, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

##・そもそもバージョンの違いが露骨に出るSwiftで書いたのが間違えだったんだ！

まず使う言語を考えました。
使い慣れてて書く量が少なくて、尚且つバージョン互換があり、データの取り扱いが楽な言語･･･
Python、君に決めた！！標準ライブラリで便利な関数たくさん用意されてるし！

##・標準入力のパターンも配列の処理方法も覚えなきゃ！
Pythonのありとあらゆる標準入力パターン、配列処理の方法をメモっていきました。
最初にググってた時間も省けるし標準入力もバッチリだし！これでいける！

#いざ、ドワンゴからの挑戦状！
そう思ってドワンゴからの挑戦状に参加しました。
30分前から準備、Pythonのテスト環境もバッチリ整えて。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">頑張りまっせーー <a href="https://twitter.com/hashtag/dwacon?src=hash">#dwacon</a> <a href="https://t.co/Mhv2G7JjFD">pic.twitter.com/Mhv2G7JjFD</a></p>&mdash; にーさん (@ni_san2000) <a href="https://twitter.com/ni_san2000/status/810075975010525185">December 17, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

##その結果ーー途中からWAの山
問１は簡単でした。単純なベン図で計算するだけ。
問２から考え方が複雑になりだすので頭の中でこういう流れにすればいいんじゃないかという考えは沸くものの時間がかかりました。
さらにコードに起こしてコードテスト、よし問題文にあるテストケース全部クリアしたぞ！と思っても、実際に得点を得られるのは２０〜４０件のテストケースに全問正解した場合のみ。部分点はない･･･。自分の結果は無慈悲でした。

![dwagon01.png](https://qiita-image-store.s3.amazonaws.com/0/80100/69fdfd51-746f-ce14-2ad3-cb7934ec973a.png)
↑これが問２、後半のテストケースから不正解している。テストケースの標準入力は見られないからなぁ･･･

![dwagon02.png](https://qiita-image-store.s3.amazonaws.com/0/80100/240cb7c2-a7af-0771-3a57-ccc9b6e3b08d.png)
↑これが問3、全体的にWAが混じっていて限定的な解法だった事が分かる。

##というわけで完全にボコられました
<img width="1186" alt="スクリーンショット 2017-01-10 12.05.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/80100/87999835-5203-9651-b42d-6e141ce207fb.png">
４１８位でした
<img width="1171" alt="スクリーンショット 2017-01-10 12.05.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/80100/7b8e4aff-a121-22e0-b3f4-d53f972f15cc.png">

感じたことは、競プロの知識だけでなく様々な状況のアルゴリズムを覚えておくこと。
標準入力はもちろん円滑に作ることができましたがそれ以降の考え方や書き方で時間が取られてしまいました。

それとこういう問題ではこういう解法がベストアンサー、という知識をたくさん身につけておくこと。
できるだけ多くの問題を解いて経験を積まねば･･･と感じました。

それと他人の回答がものすごく参考になりました。
様々な人が様々な書き方で解いていることにもびっくり。実行時間が短かったり、コード量が少なかったり。人の回答を見てもっと楽に書く方法を見つけるのも大事だな･･･と。

#競技プログラミングに対する興味は止まらない
ボコられたとしても競プロは新しい刺激を与えてくれました。
これまでプログラミングは何かを製作して利益を与えるものだと思っていましたが、競プロで扱う問題、課題はそれとは違う。
特に利益は生み出さないものの、いかに早く、的確に答えを導くかというジャンルはまるで数学のよう･･･！久しぶりに頭をフル回転させたなぁ。

AtCoderには過去問もありますし２週間に１度ほど一般的はAtCoderコンテストもあるので積極的に参加して行こうと思いました。
長くなったんで一言で表すと、**ボコられて刺激を受けて、競プロにどハマりしました！**ということです。

駄文でしたが読んでいただきありがとうございました！