名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

競技プログラミングを始めて変わったこと

まえがき

Competitive Programming (その2) Advent Calendar 2015 - Adventar
の記事です.
9日目です.

ってことだったので,ゆるふわプログラマー(仮)ですが,急いで書いてみました.

思ったこと書いていたら,長くなってしまいました.
すみません.




競プロを始める前の私

私は学部一年からプログラミングを本格的に始めましたが,それまでほとんど学部の授業,研究でしかプログラムを書いたことがありません.
さらに言えば,出来がかなり悪く,当時授業で書かされていたC言語については,ロジックがほとんど理解できないため,長期休暇中にポインタとか配列とか一人で復習して,なんとか単位をとっていた人です.

一応,他の言語も勉強したりしてみましたが,ほとんどモノを作るレベルまでは行かず,テキストに乗っているものを理解するので精一杯でした.

競プロとの出会い

これは修士1年の時,新設された非公式サークルの中で,競プロをやっている人がいて,たまたまその話を聞いて始めようと思いました.
今思うと,なぜ始めたのか,なぜ続けようと思ったのか,さっぱりわからないです.私はプログラムを書くことに対して,あまり自信がありませんでした.おそらく,プログラミングコンテストや,オープンデータコンテストで賞金が出るみたい話に少し釣られていたんだと思います.


覚えている限りで最初に出たコンテストは,ARC029です.(2014/09/27),arc029.contest.atcoder.jp


この時,私はA問題しか解けませんでした.しかも嘘解放です.
B問題はさっぱりわかりませんでした.
まあこんなもんかあ,と思いながら順位表を見たんですよね.そしたら,点数ある中でワースト3位でした.(すごく笑ってしまった)
順位表 - AtCoder Regular Contest 029 | AtCoder
ですが,ほんとうに悔しいなあと思ったんです.


そして解説の生放送を聞いた時に,B問題の解法を聞いて感動した覚えがあります.
(実はまだ解き直していないのですが…)


B問題の解法は二分探索を使う方法でした.
私はそれを聞いた時,え,二分探索??? と首をひねりました.
それまで私が知っていた二分探索は,単にソートされたデータが入っている配列から探しているものを見つけるためのアルゴリズムでしかなかったからです.
しかし,二分探索というものは実は,範囲を絞り込んだりするのに非常に有効だということを初めてここで知りました.
その時に,感動してしまったんですね.プログラムってこう使うことができるんだ! っていう単純なものですけど,今まで単に学んできて知識として持っていたものが,初めて使える形になった! と強く感じ,興奮しました.
(ちなみに嘘解放で説いてしまったA問題は,ビット列を使って全探索するという方法で,その方法も知らなかったので,すごいなあこれ…と思いました.私の嘘解放は全部の状態について分岐しまくって,無理やり通すという方法です)


その経験がなければ,今も競技プログラミングを続けていなかったと思います.
本当に面白い問題を準備していただいた,AtCoder社の方,高橋直大さんにはプログラミング,アルゴリズムの面白さを教えていただいて,感謝しきれないです.

その後

その後はいろいろありましたが,私は競プロの問題を意欲的に解くようになりました.プログラミングに対して,意欲的になったのはいつぶり・・・? 下手したら,初めてだったかもしれません.
それまでは,はっきりいってプログラミングっていうものに対して,私は感動したことがなかったのです.ですが,問題を解いているうちに,以前の自分であったら出来なかったであろう問題がAcceptされることに徐々に面白みを感じるようになりました.


その中でも割と顕著だったのが,ARC031(2014/12/13,ほぼ一年前ですね)のB問題,埋め立てでしょうか.arc031.contest.atcoder.jp

これをとてつもないクソコードで通しました.
Submission #299071 - AtCoder Regular Contest 031 | AtCoder


このコード,もっと簡単に書きたかったのですが,後日考えなおしてみると,全く変更ができないくらいのクソコードです.
ですが,この時初めて知識だけ存在していた「幅優先探索」を自分の手で書くことができ,そのことに感動を覚えました.
(確かこの時コンテスト中にはAcceptできず,ずっと考え続けていた覚えがある)


という形で,できなかったことができるようになる,あるいは考えていること,知っていることが具体的にプログラムでかけ,正解できることに少しづつ快感を覚えるようになっていきました.


それと同時に,もっと順位を上げるためにはどうしたらいいのだろうか,ということを考えました.その結果,データ構造体が豊富に用意されており,かつ短くかけるということで,Pyhtonを選びました.当時はバージョンの違いに関する歴史についてよく理解しておらず,3.X系を迷わず選択しました.あとRubyって選択肢もありましたが,回りで書いてる人とかいてありきたりな感じがしたので,私は基地外オーラを出すために,Pythonを選びました(変なところで中二病なんですね)


ところで,Pythonですが,言語自体が割と簡単に設定してあるということも関係しているとは思いますが,これまで教科書とかテキストとかを丸写ししているよりも,競プロでただ使っている,しかもテキストも何も使わず行き当たりばったりでWEBのページだけ見て書いているだけで,自然と書けるようになりました.


ここ最近,その理由がようやくわかってきたのですが,競プロで問題を解くためにコーディングすることによって,プログラムが書けるようになってきています.
自分が書きたいものに対して,手を動かしていかないと,絶対にうまくならないんだなあと実感しております.
私はまだソフトウェアを作ったりはしていませんが,明らかにどう設計すればいいのか,どうデータを処理していけばいいのか,何をすれば早く簡潔に処理できるのか,その辺りの意識が強くなったように感じます.(これは今後に生きてくるといいな)
コーディングもそうなのですが,テストケースの想定もうまくなったような気がします.だって,AtCoderでは落ちたテストの入出力の結果,見れないですからね.どういうケースなら落ちるのか,また動くのか,そういう想定が前よりはうまくなったように感じます.
(というわけで,言語の習得には実は競プロ向いてるのかも… って少し思っていたりします)


あともう一つ,忘れてはいけないこととして,ツイッターのアカウントを変えて,プログラミングしてる人を中心に変えたこともあって,いろんな人とプログラムの話やエンジニアリングの話,競プロの話をするのが楽しく,モチベーションが保たれたということがありました.
面白い問題を作っていただいているコンテスト主催の皆様にも感謝していますが,いつも助けていただいているフォロワーの皆様にも感謝です.


特にCode Festival勉強会でお会いした皆さんが私の中ですごくいい刺激になっています.
私はあの場にいた中では,多分下から数番目くらいだとは思うのですが,同じないしひとつ上のレベルで頑張っている人がこれだけいて,一緒の会場でまたあって話したいなあ.オンサイト会場に行きたいな! と思いました.
なんでしょうね,競プロをやっている人は私のリアル知り合いでは片手で数えるだけしかいないため,なんか嬉しかったんですかね…w
結構あの日のことを思い返してしまいます.それだけ,自分の人生を変えた一日だったんじゃないかなあと.


残念ながら私自身はCode Festivalには行けず,Code Thanks Festivalへの出場になってしまったんですが,それでも予選を突破してオンサイトに行くことができた! というのは私の中で自信につながったと思います.
本当はもう一年あったら,Code Festival参加を狙ってみたいのですが,残念ながら私は今年で学生を終える予定なので,叶いません.来年もある人たちがいいなーと思いつつ,最後の年にオンサイト出場できたのは,本当に忘れられない,良い経験でした.


ってなんか書きすぎてしまいましたが,総括すると,いつの間にか私は競技プログラミングにハマってしまったようですww
あとプログラミングもいつの間にか,やらされるものじゃなくて,自分から書くものになっていました.
まだまだ初心者(というのも,未だにまともなC++のコードが書けないので)ですが,これからもひたすら精進していきたいです.
TopCoderCodeForcesといった英語のコンテストはまだまだ言語の壁が厚く,苦戦を強いられていますが,これからもっと挑戦していきたいです! 当然これからもAtCoderやYukicoderにもでます! 他のコンテストはあまり知らないので,おすすめがあったらぜひツイッターなどで教えて下さい!

それと実は今日,12/9に私が初めて作った問題がyukicoderで出題されております><
No.316 もっと刺激的なFizzBuzzをください - yukicoder
拙作ではございますが,よろしかったらぜひ問題を説いていただいて,感想等いただけると嬉しいです.
(テストケースが弱いぞってめっちゃ言われてますので,次回への反省にします・・・ あとこの問題についてのもろもろは明日くらいにでもブログに書いてアップします)
これからは作問も頑張っていきたい・・・ というか面白いネタが書きたいので,それを書いてプログラムの問題として皆さんに問いてもらいたいです(おい)

ここまで読んでいただいて,本当にありがとうございました.