QLITRE DIALY

AtCoderで入緑したのでこれまでのことを振り返る

2023年05月14日

2023年5月13日に行われたパナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)にて、Highestを達成。

入緑をすることができた。

パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)



以前に入茶報告をしたエントリをみると、2022/12/17に入茶をしていたようだ。

エントリ

なので、約5カ月で緑になったということになる。

振り返りをかねて、この5カ月の間にやったこと、考えたことなどを書き連ねておく。

鉄則本をとりあえず一周する

これが一番費用対効果が高かったと思う。

年明けから鉄則本をやり始めて、明らかにレートの上昇が良くなった。

この本、はっきりいって凄い。

言葉の説明が非常に分かりやすい。

図もふんだんに用いられているので、頭の中に良く落ちてくる。

コードも分かりやすい。

さすがはレッドコーダー、と唸らずにはいられない一冊だった。

高度典型も紹介されていて、こちらはまだ理解が追い付いていない。

定期的にチャレンジしていきたい。

感動をしたのは書籍ではC++で解説がされているものの、githubでPythonコードも掲載してくれているところ。

これはPythonを使っている自分にはとても嬉しい思いがした。

著者のホスピタリティと、「競プロの楽しさを広げたい」という純粋な熱意を感じた場面だ。

競プロに限らずプログラミングをやっている人は、絶対に読んだ方が良い。

翔泳社が主催しているITエンジニア本大賞でもベスト10に選出されている。

https://www.shoeisha.co.jp/campaign/award/result/

競プロをやっている人で読んでいない場合、ビハインドになってしまうレベル。

AtCoder Problemsでひたすら解く

書籍を一通り終えた後は、基本的にAtCoder Problemsで解いたことのない問題を解いていた。

現在の状況。

最近はLIST表示をして、D問題でDiff 800-1199を抽出、Diffが低いものから順番に精進を行っている。

考えて問題を選ぶのは面倒くさいし、機械的に上から処理している。

逆に問題をチョイスすると、「特定のアルゴリズムのものだけ選んでしまう」、「解けそうにないものは解かない」といった思考が入ってしまいそう。

そうすると、自分の知識に偏りが生まれるので、機械的に解いた方が良いと思う。

バチャの参加

平日の決まった時間で開催されているものは仕事の都合上できたりできなかったりするので、1か月程度の長期間系のバチャに参加をしたりしていた。

これもランダムで問題を解く、という側面からおススメ。

立ててくれたGiant_Pandaさんには謝謝。

TypeScriptでも解く

3月頃からPythonで解いた問題をTypeScriptでも解いてみる、ということをやっていた。

一応このブログなどでもTypeScriptを使っているものの、簡単なfor 文をそらで書けないレベルだったので、さすがにヤバいと思って練習を兼ねてやっていた。

これはどうだろう…

一般化すると別言語で解く、ということ。

精進という観点からはあまりコストパフォーマンスは高くないか。

あえて利点を挙げるならば、Pythonではライブラリで処理できる場面が、TypeScriptだと自分で組まなければいけないこともあるので、思考の幅は広がったと思う。

その過程でTypeScriptの基本文法はけっこうさらえたので、別言語の習得にはとても良い。

ネットで調べなくても、for文、set、オブジェクト、配列、if文などの基本どころはすらすらと書けるようになった。

相変わらず型のことは良く分からんが。

noteに解説記事を書く

上記の営みと連動しているが、TypeScriptで解いた問題をnoteで解説する、ということをやっていた。

AtCoder 精選良問集 Diff 茶後半~水前半

いわゆる「精進日記」に近いものなのかもしれない。

これには賛否両論ある。

否定的なところでは「記事を書く暇があるなら問題を解いた方がいい」という意見をよく目にする。

個人的には書くことには意味があると思っている。

「書いて説明できないことは理解ができていない」という性質は確実にある。

なので、「説明できない問題は、同じような問題が出題された時に解くことができない可能性が高い」ということになる。

逆に考えると、書いて説明するためには理解をしなければならない。

解けた問題でも、書いている途中に、「ここってうまく言語化できていないな、どういうことだろう」と頭をひねることもある。

その過程で、新しい発想や理解が生まれることもある。

ただ、この営みを人に勧めるかと言うと微妙なライン。

自分の場合は、単純に書くこと自体が苦じゃない、むしろ好きな部類なので、続けられるというのはある。

あとnoteというサービスを単純に使ってみたかった、という動機もある。

ChatGPTを使う

学習の補助として使うのはとても有用的。

例えば解説コードはC++で書かれていることが多いが、それをPythonに翻訳してもらう。

コードや説明の分からない箇所を、かみ砕いて解説してもらう、など。

難しくて「こんなの俺には分からん」という解説でも、ChatGPTに根気強く質問をしていくと、理解できる形で落ちてくることも多い。

もちろん、間違った方向に導かれることもある。

だが、総合的に考えて、学習に活用した方が良いことは間違いない。

コンテスト中の使用について

今のところ禁止もされていないので、コンテスト中も使っている。

自分は10分~20分考えて、解法が思いつかない問題に対して、「この問題の考え方を教えて、コードは書かなくて良い」というように聞く。

そうすると、日本語で考えが返ってくるので、思考の整理がしやすい。

コードを直接書かせると、一発でACコードを書くこともあるが、泥沼にはまるケースも多い。

何らかの問題で、ChatGPTを使うことを考える。

日本語で回答を促すと、「1からNまでの数字を全探索して答えを見つけます」というような回答が返ってくる。

ここで、「Nは10**18まであるので、明らかに間に合わない。効率的な方法を探す必要がある」みたいに聞く。

そうすると、二分探索などの別の方法を考えてくれたりする。

一方で「コードを書いて」や「問題を解いて」と質問をすると、コードが中心になって返ってくる。

確認するべきポイントが多く、問題があるときに特定が難しい。

コンテスト中に使用していて「うまくいかんなー」という人も多いと思う。

まずは日本語で対話をすると、打率が上がると思う。

コンテスト使用の是非について

ここも賛否両論あると思うが、自分は「使えるカードは使った方が良い」という考え。

そもそも能力の不足している部分を補うのがテクノロジーだと思っているため。

個人的にはライブラリをコピペして問題を解くのと同感覚。

ChatGPTを使って結果を出すのはぜんぜんダサいことじゃない。

それに、なによりも精神的に安定するという効果もある。

コンテストは孤独な戦いで、問題を解けないと精神的に乱れることもある。

さすがにゲロを吐くまではいったことはないが、パニック状態になることもある。

そんな時に相談できるツールがある、というだけで、かなり気持ちが落ち着く。

「ゲームバランスが崩れる」、という意見については…どうなんだろう。

個人的には、ChatGPTを使おうが使わまいが、負けないように頑張るしかないのかなぁ、と思うが。

Majorのこれ。

ただ、さらに学習が進んだら、どうかなぁとは思う。

例えばABCの問題を最後まで「コード書いて」だけで終わらせられるレベル。

まぁ、そのときはまた別の議論が出るはず。

その時に考える。

レッドブルを飲む

21:00からの開始なので、当初は敬遠していたがコンテスト中にレッドブルを飲むようにしている。

気合がとても入るので良い。ただし眠れなくなるので、注意。

DDoS対策

これも本質的ではないが、最早With DDoS状態なので、最善を尽くすようにする。

とりあえずは

  • コンテスト開始時に問題を別タブで開く
  • サーバーが落ちたら延長情報を確認。ぎりぎりまで粘る

などをしている。

おわりに

ひとまず今年の目標が達成できたので、よかった。

次のステップとしては高確率でD問題を解けるように精進をしていきたい。

水色はどうかな、今のレベルだと難しい気もするが。

マイペースでやっていきたいと思う。ではでは。