相対的鉈

久々に競プロをやったら「あーこれとりあえずこうすれば動くけどたぶんでかいケースで落ちそうだなー」と思う問題に多数当たってめちゃくちゃ悔しい思いをしたのでまたアルゴリズム系の勉強をしようと思った。

家にあるアルゴリズム系の本はAOJ*1の本だけ。ちゃんと(?)購入当時に挫折済み。
なのでAOJ本をやり直すことにしたのが3日前くらい。

当時はたしか水たまりを計算する問題が解けなくて挫折したのだけど*2今解いてみたらあっさり終わって「いつの間にこんなに……」という気持ちになった。解説の内容をうろ覚えながら頭にいれてたのでソレが残ってただけだと思うけど。特に地力があがったわけでもないだろう。いや上がってないわけではないと思うけど別に競プロっぽいことやってないしな……。

普段はRuby使いだしRubyで書くかと思ってたのだけど、どうも便利メソッドが揃いすぎてて卑怯な気がしてきた。卑怯というか学習目的なら不適切というか。なのでC#でEnumerableとか封印して書くか、と思ったらAOJのランタイムがmonoでめんどいことになるのもなーと思ってうじうじ。そこでC++書けばいいじゃんって気持ちになってきたので最近書いてる。

「Goがなんとなく好き。Rubyは魔法で切れたか切れてないかよくわかんないけどスパスパパシパシ切れる感じでそれはそれでステキなんだけど、Goは鉈でオラァっていって切り回していく感じがあって好き。書いた分だけ動くっていうプログラミングの原点に立ち戻れる気がする」みたいなことを前にいった記憶があるのだけど、C++を前にするとGoは日本刀くらいの切れ味がありますね。ほんものの鉈の無骨さを目の当たりにしている。
たぶん僕の書いてるC++がマクロもtemplateもautoも使ってないのでだいぶ無骨だっていうのはあるのですが。というかたぶんほぼCで書いてる気がする。便利にC++書けたら嬉しいよなって気持ちもあるけどたぶんそこへの道のりがかなり長そうなので尻込みしちゃう。あくまでも競プロ用、みたいなね。適当なバッチかいてたときにpowershellの文法があやしいのと同じ。複雑なのはC#書くけど書き捨てはpowershellで。仕事でならRubyだけど勉強なら(無骨な)C++で。

元鉈現日本刀のGoは書いた分だけ動くといってもfor rangeとか配列とSliceとかが言語機能として備わっててやっぱモダンなんだよなーという感じ。C++を書いてGoへの想いを強くしている。
AOJでは選べないけどyukicoderはGoとかRustが選べた気がするので、yukicoderでこの問題を問いていけばアルゴリズムの勉強になるよという記事(あるいは本)の登場が待たれますね。

*1:サイト 具体的にはALDSコース

*2:見直したら超序盤で笑う。もうちょい頑張れ