水色になった

こんな本質から外れたことばっかやってるから水色になれないんだぞ。(前回記事末尾より)

水色になれました。嬉しい。

TL;DR

これは「AtCoder で水色になれたのが嬉しすぎてなんか書きたくなった」というだけの記事です。それでも敢えて要約するならば:

  • 競プロは楽しい
  • 全探索と簡単なDPが書けると、運が良ければ水色になれる。
  • 就活のコードテスト対策に競プロは部分的に有効だが、すべての出題傾向には対応できない。競プロ傾向の問題への対策だけならば AtCoder の緑色レベルで十分。

本編

水色になった

「じっくり時間をかけてでも、コードが Readable であるように努めるべきだ」という宗教上の信条により Readability に無頓着な*1競プロは若干敬遠していたのですが、あるとき Twitter で流れてきた初心者向け問題が時間をかけても解けなかったのが悔しくて競プロに手を染めてしまいました。 そもそも解けないんじゃあ信条も何もないわけで。やらないだけなのとできないのは違うよなあという話です。

実際手を出してみれば問題はパズルみたいで面白いし、時間に追われるままガーッと書き上げるのも脳内麻薬が出てイイ感じだなと思えるようになりました。やっぱり食わず嫌いは良くないんだなあ。

で、この度、当面の目標だった水色に到達しました。わーい*2

f:id:penpenpng:20190722202050p:plain

ところで余談ですが、去年中頃からのグラフにプロットがやけに少ないのはしょうもない事情があります。 というのも、この調子でレートグラフを更新していくとちょうど就活の時期に僕がただのクソザコナメクジであることが御社にバレてしまうのではみたいな……。別に就活のためにやってたんじゃないんですけど、だからこそ趣味を理由に評価を下げられたくないなみたいな……。

でも最近見かけたこの辺を読むに、もしかしたら前面に押し出していってもよかったのかもしれないです。過ぎた話なので分かりませんが……。

水色になるまで

何かを練習するとき、「とりあえずやってみる」と「本か何かで理論を大雑把に把握する」をちょうどいい塩梅で並行するのが最も効率がいいと経験上感じています。感じてはいるのですが、僕はどちらかというと後者が好きなので座学に偏重しがちで、コンテストに参加する前にとりあえず蟻本を通しで読みました。読んだだけで体では分かってないやつです。

そのうち実際に問題を解いていくうちに、水色を目指すレベルでは「蟻本の2章を体で理解すること」「分かる問題でバグらせないこと」が重要っぽいことを察したので、そのあたりをちょっとやりました。具体的には:

  • 蟻本2章の写経をした上で、紙とペンで絵を描いて動作を追う。該当章の内容は:
  • コーディング中に考えることを少なくすることで、バグを埋めるリスクを減らす。
    • 0-based indexing な言語で 1-based indexing な問題を解くときには先頭にダミーを挿入するなど、問題文中の表現とコード中の表現を可能な限り一致させる。
    • 積極的に部分問題を(できれば純粋な)関数に分離する。
    • 番兵を使う。

これで足りたのは問題運が良かっただけかもしれないなーとは思います。そのうち僕がまた緑に落ちたらそういうことです。

就活と競プロ

別に就活のためにやってたんじゃないんですけど、

とは言うものの、実際のところ大分役に立ちました。

前述の通り、ナメクジを晒したくなかったので面接で特に競プロ経験を主張したりはしなかったのですが、とりわけ面接前のコーディングテストでは大いに役立ちました。

どうも同じIT系でも業界ごとに傾向は随分と違うようですが、少なくとも僕が受けたようなところが コーディングテストで出題する問題の半分くらいは AtCoder で言うところの緑色以下の問題で、もう半分くらいは競プロっぽくない問題です。 競プロっぽい問題については皆さんご存知の通りですので、競プロっぽくない問題について言及すると、例えば

  • Webサーバ の URL と Web API の仕様が与えられ、これを叩く問題
  • ハフマン符号を構成する問題(何故か複数社で問われた)

みたいなのが出ました。後者は僕が知らないだけで競プロにも出るのかも。

これから

次は青色になりたいです。どうすればいいかはこれから考えます。

*1:少なくともジャッジサーバは可読性をスコアに反映しないという意味で、それ以上にネガティブな意味はないです。

*2:次回のコンテストで普通に緑に落ちかねないので今のうちに喜んでおこう。