競技プログラミング in Go #1

背景

2年半くらい前に少しやって以来あまりできていない。たまに思い立ったように問題を解いたり蟻本を読んでみたりするものの、以前の内容を憶えておらず同じような内容を初見の顔をして勉強していることが多い。

まずはこの現状を打破して継続できるようにしたい。そもそもではあるが、最強最速アルゴリズマーになってアルゴリズムを仕事にするのは力量的にも難しいため、教養と知的好奇心と趣味としての競プロを楽しんで続けられるようにしていきたい。

なんで続かなかったんだろう...

自分なりに考えてみると、理由がいくつかありそうだ。
まず、C++を使っていた。私はC++を普段仕事や趣味で使っていなかった*1。使っていた理由は、競プロの解説や解答例でC++が使われることが多いからだ。けれど、時間を置くとすぐにわからなくなり毎回調べていた。問題を解くということに集中するためにはC++は扱う技量が足りていなかった。
また、競プロの優先順位をなかなか上げられなかった。他にも知らなきゃいけないことが多かったのだ。仕事で活かせる機会が少ない*2競プロに大きく時間を割くことができなかった。

継続のために

まず言語はGoにしようかなと思っている。Goは個人的に触っており、コーディングテストでも毎回選択している*3。そのため、Goで競プロに慣れておくメリットは大きいかなと思っている。Rustを使うことも検討したけれど、業務で使う可能性を考えるとRustよりもGoの方が高いかなぁ、と思う。まだまだ求人少ないし。

また、何を考えてどう解き、解説に何が書いてあるのか、そして時間を置いてもう一度解く必要があるのか、という当たり前のことができていなかった。理解より解くことが目的化していたからこそ中途半端になっていた。ここの思考を記録して整理しておく必要性を感じた*4。管理内容は後述する。

競プロにおけるGo

微妙らしい。

これはたしかにそうで鬱陶しさや足りない機能が目立ってしまう。
例えば、未使用変数がワーニングじゃなくてエラーになるとか、タプルがないこととか、min/maxの関数がないとか。探せばたくさんある。

精選10問

なんやかんやあるけれど、とりあえず解いていこう。
思い立った時に毎回お世話になっている気がするが、drkenさんの記事を参考に解いていく。

qiita.com

今回はこれをGoで解いた。

Product Submission #19666588 - AtCoder Beginner Contest 086
Placing Marbles Submission #19666903 - AtCoder Beginner Contest 081
Shift only Submission #19667849 - AtCoder Beginner Contest 081
Coils Submission #19668136 - AtCoder Beginner Contest 087
Some Sums Submission #19668805 - AtCoder Beginner Contest 083
Card Game for Two Submission #19669348 - AtCoder Beginner Contest 088
Kagami Mochi Submission #19669660 - AtCoder Beginner Contest 085
Otoshidama Submission #19670032 - AtCoder Beginner Contest 085
白昼夢 Submission #19670532 - AtCoder Beginner Contest 049
Traveling Submission #19671230 - AtCoder Beginner Contest 086

学び

知っていると思っていたようなことも競プロをやると厳密な理解を求められるのでよりクリアになった。

  • breakで抜けるスコープは1つなので大域脱出したいならラベルを使う
  • 数値のstringをループで回してruneを操作する場合、内部では文字コードになってしまうが、'0'を引くことで数値を得られる
  • sort.Xxxに渡す関数であるfunc (i, j int) boolijはインデックスのため、比較を行う場合はfunc (i, j int) bool { v[i] > v[j] }のように書く
  • Goの配列のインデックスに負数は不可(Pythonとは違う)

管理方法

前述した思考の記録は、神ツールであるNotionを使っている。聖書や古事記などまだ印刷技術がなかった時代に書かれたもの大半はNotionで進捗管理されていたと言われている。そのくらい強力なツールだ。

f:id:TakumiKaribe:20210130194400p:plain f:id:TakumiKaribe:20210130194500p:plain

こんな感じで復習できるようにまとめつつ思考過程と解説を載せている。初めはScrapboxで関連問題が表示されるようにしていたけれど、Notionの使い勝手の良さに負けてしまった。まだまだ改善の余地がありそうなので、もっと上手く管理したい。

結び

失踪せずに#2を書きたい。次回は蟻本の全探索の部分和問題とLake Counting問題の類題を解いていく。

コンテストは出れる時に出る。寝たい。

*1:実は一瞬だけ仕事で使っていた。一瞬だけ。

*2:当然仕事による

*3:通信が絡む問題の時はすごく楽なので

*4:AtCoder Problemsもあるけど、思考過程もセットにしたかったためNotionを選択した