今週のABC結果 ABC313

結果的には前回と変わらずABの2問しか解けなかった。

タイピングミスで集中力が乱れたり、問題文の理解に苦労したりということはなかったものの、Cは時間内に解くことができなかった。パフォーマンス的にはいつもと変わらない感じではあった。Cが解けなくてDを考えようか、いややっぱCをやったほうがいいなと問題行ったり来たりしたのもよくなかったかもしれない。

Read full post gblog_arrow_right

ABC312Dに挑戦

コンテストの結果はさんざんだった。あとからやってみたら素直に解けて、これが本番で出来ていればと思わずにはいられなかった。本番の状態ではとてもじゃないけど、できなかったけどね。

Read full post gblog_arrow_right

AtCoderはじめました

競技プログラミングをはじめた。はじめたと言っても、はじめてではないのだけどね。真面目にコンテスト参加をするようになったというだけである。

これまでも何度かやってみてはいた。しかしどうにも続かなかった。今回はなぜ続かなかったのかと、何がきっかけでやり始めるようになったかを書いておこうと思う。

Read full post gblog_arrow_right

Kotlin Heroesに挑戦してみた

Kotlinを使ったプログラミングコンテストに参加した。たまたまTwitterで流れてきたのを見て、たまたま時間が空いてたので挑戦してみた。

https://codeforces.com/contests

腕試しになるかなぁという程度の軽い気持ちでの挑戦であったが、「俺ってまったくできないじゃん」と凹む結果に終わってしまった。 そんなに深刻になるレベルではないけれど、それなりにできるんじゃないかという妙な自身は見事に砕かれた。 もっと地道に精進しようと反省である。

Read full post gblog_arrow_right

LeetCodeでプログラミング学習

最近LeetCodeというサイトを利用してプログラミングの学習をしている。学習と腕試しと頭の体操を兼ねてというのが正確なところだろうか。 自分の中では頭の体操的な位置づけが大きい。設定された問に対して、どうやったら解けるか自分で考え実装してみる。実装の過程で、ついでにKotlinの勉強にもなったらなぁなんて感覚である。 そう、Kotlinで解いている。つい最近も、groupingByなるメソッドが用意されていることを知ったが、問題を解いている最中にこういった新たな発見に出会えるかもしれないというのが、Kotlinの勉強にもなるかなあと思っている所以である。 競技プログラミングという観点で見れば、日本語でできるAtCoderが有名だろう。こっちのほうが計算量やら書いたプログラムの効率性をちゃんと測れて良いと思う。LeetCodeでも処理時間は出るが、Kotlinで解いた場合、同じコードでもSubmitするたびに100msくらいの誤差が出る場合があって、まったく指標として役に立たない。ついでにKotlinで解いている人は少ないのか、提出されたコードの100%より早いです=自分が初めてKotlinで提出した、なんてパターンがあってさらに指標にならない。 そもそも競技プログラミングとしてやっているというよりは、先にも書いたとおり、私の場合は学習のためという面が大きい。その観点で見ると、LeetCodeは英語であることを除けばやりやすかった。AtCoderだと標準入力から入力を読み取る部分からやらないといけないのに対して、LeetCodeは引数として渡ってくるので純粋に解法に集中できるのが良かった。あとはAtCoderだとKotlinのバージョンが1.0.0で、対してLeetCodeが1.2.50だったというのも理由の1つではある。 英語であることは、障壁というよりは英語の学習にもなっていいかもしれないと考えている。英語の学習とはならなくとも、英語に慣れるのに役に立つだろう。ちなみに問題によっては英語が理解できずにそもそも解く以前の問題で詰まってしまうこともあるけれど、そういう場合は他の理解できる問題をやるようにしている。 LeetCodeのいいなと思ったところは、問題を解く以外にも学習用コンテンツがあることが挙げられる。 例えばIntroduction to Data Structure – Binary Treeは二分木についてのコーナーである。一部は課金しないとアクセスできないが、無料でもできる部分がいくつかある。 各ノードを巡回するにはどうしたらよいかという問いにすら苦労するのだが、だからこそ勉強になる。わかるわかる、再帰使えばいいんでしょと思っても、実際に適用しようとすると手が止まってしまった。 これに限らないのだが、再帰処理をすれば解けそうという場合に、どこからどこまでが再帰処理に必要なのかがすぐに言語化できない。だからなかなかコードに落とせない。LeetCodeをやったからと言ってすぐに言語化できるようになるわけではないのだが、実際に問題に直面して解くという経験を通じて徐々に理解を深めていけたらいいなぁと思っている。 そういえば感覚で理解しているといえば、lambda式も結構感覚で使っている。こう書いたらこうなるんでしょというノリで使っているということか。 こういう問題には自分でアプリを作るだけではなかなか出会えないので、こういうサイトを利用して学習するのもよいのではないかなと思う。 問題の探し方 私はProblems→Difficultyで難易度選択、Listsで「Top 100 Liked Questions」にチェックを入れてフィルタリング、その上でSolutionつきの問題を解くようにしている。 問題の質は玉石混交で「なんやねんこれ」というような問題もあったりする。likeが多い問題はそれだけ勉強になると思った人や面白いと思った人が多いということになる。さらに解説付きであれば解法の勉強にもなるだろうからなおおすすめである。 Solutionがないやつは、ディスカッションで他の人の解法を見ることも可能ではあるが、解説になっているとは限らないのでSolutionつきのものを選んでいる。