Pythonで競プロを始めるという選択肢

久しぶりにブログを更新します。今回は解説記事ではなく自分語り系の記事です。

twitterを見ていたら「pythonで競プロをやるってどうなの?」みたいな話が出ていたので、私も元python競プロerとして考えを述べてみたいと思います。(もともとこのブログのタイトルは「Pythonで競プロ」だった)

結論から言うと、AtCoderに限ればpythonで競プロを始めるのは普通にアリなんじゃないかなと思います。
なぜAtCoderに限定しているかというと

  • いざとなればpypyに投げれば何とかなる
  • 制約が厳しい問題がそんなに多くない(大きくても10^7とか)
  • 分かってしまえば実装はシンプルなので定数倍もキツくない

という感じであまり障壁にならないからですね。前にも書きましたがCodeforcesは問題の傾向が割と多種多様で想定解が10^8という問題もdiv.2-Bに出てきたりするのでpythonではまともに戦えないなと過去に思いました。(最近はめっきりこどふぉに出てないのでもしかしたら現状は変わっているかもしれないです、そうならばすみません)

pythonで競プロを始めることに対する想定される反対意見として

pythonで競プロを始めても、そのうちpythonでは通せない問題が出てきて絶望して他の言語に乗り換えるのだからその乗換えの無駄を考えたら最初からC++とかで競プロに慣れておいたほうがいい」

というのがあって、これは一理あるかもしれません。実際私がそうで最終的にはD言語に乗換えました。こどふぉもキツいんですが、本格的にpythonでは無理だなーって思い始めたのはJOIの過去問を解いていたときですね。あれも10^8とか普通に想定解になってたり、pythonだとメモリも食うのでそもそもMLEになっちゃって(JOIはメモリ制限もキツめです)どうしようもないなと思いました。

しかしこのデメリットは競プロをある程度やって初めて感じるデメリットです。最初から「競プロを一生の趣味にするぞ!」とか「レッドコーダーになるまでやり続けるぞ!」とか意志を固めて始める人はC++からのほうがよさそうですが、そうでないなら別にpythonでもよさそうです。どうせすぐ辞めちゃうかもしれないしね。

自分の場合は少し時間が出来てプログラミングを勉強しようかなと思って、まずpythonを覚えようと思って最初にpaizaで勉強してたんですね。paizaも一応コーディングテストみたいな、競プロっぽい問題を解けるのですがそのうち物足りなくなってyukicoderに出会いました。なんでAtCoderの前にyukicoderに出会ったのか、その経緯は覚えてませんが……ともかくその延長でpythonで競プロを始めたんですね。その後詳しく調べてみると「pythonで競プロは無理だぞ」というのが競プロ界の常識だったのですが、ひねくれているのでpythonでやっていってやるぞとか思っていました。最終的に折れちゃったんですけど。

だからといって「最初からpythonで競プロやらなければよかった……」と後悔しているかというと別にそうでもなくてですね。pythonで簡単な競プロ問題が解けるぐらいになっておくと良いこともあります。あれとかこれとか。

それでもし、あなたがpythonで競プロを始めて数か月か数年かしたぐらいに「pythonでは無理だー!」と思ったとします。そのときに乗換え先としてオススメしたいのはD言語ですね。

そもそもなんで私はD言語というマイナー言語を使っているんでしょうか。どこかで「pythonD言語は似ているからpython競プロerの乗換先としてちょうどいい」みたいな言説を見たからだったと記憶してます。

実際似ているかと言われるとよく分かりませんが、しかし確かにD言語は使いやすいです。「pythonだったらこういうことできるのにな」と思ったことはD言語でもだいたい出来るしそれどころかあんなことやこんなことも出来る!っていうのが結構嬉しいし、使っていて楽しい言語だなと思います。それでいて実行速度も速い(10^8が余裕で通るのは本当に感動します)ので文句がありません(ホントは少しある)。デバッグもしやすいし、パソコン音痴でもインストール簡単なのでもう少し使われてもいいんじゃないかと思います。yosupoさんも使ってるし。

主題からズレたのでそろそろまとめると

  • とりあえずpythonでも何でもいいから好きな言語で競プロを始めよう
  • pythonに限界を感じたらD言語に乗換えよう

ということでした。ありがとうございました。