茶色コーダーになったので、ここ半年間で学んだことを振り返ります。
やっと茶色コーダーになれました!
2020年5月30日のNOMURAプログラミングコンテストです。A問題とB問題を早く解くことができ、茶色後半パフォで入茶しました。
ただ、その後のABC169で爆死したという悲しい事実があります。
かかった時間
初めてコンテストに参加したのは2019年12月18日で、茶色コーダーになるのに5ヶ月半ほどかかりました。
Twitterを眺めていると、初参加から数ヶ月で茶色、緑色と進歩していく人がいて凄いなと思っていました。強い方々の興味深い解説や、熱心な学生さんがぐんぐん成長していくのに刺激を受けました。
できるようになったこと
始めは多重ループで目を回したり、配列への入力の仕方であわあわしたり、大量の入力に圧倒されてフリーズしたりという有様でした。
ただ、学習スピードはかなりゆっくりですが、できることは確実に増えています。
私が今のところ身につけていること(or調べればできる)ことはこんな感じです。
・シフト演算子を使った組み合わせ列挙
・do-while next-permutationを使った順列列挙
・mapを使ったカウント
・二分探索
・Lower_bound
・modライブラリを使った演算(演算子オーバーロード?のことはよくわかりません)
・再起を使った累乗計算
・ユークリッドの互除法を使った最大公約数の取得
・二重ループ
・boolを使った終了判定
・無向グラフのデータ保持方法
・関数を定義して使うこと
・return 0で途中終了できること
・約数の列挙
・小数点への注意(ABC169の反省です……)
組み合わせ列挙や公約数の取得、累乗計算などは、すとんと腑に落ちて使えるようになりました。高校数学の貯金のおかげです。
できるようになりたいこと
・DP
・BFS
・DFS
アルゴリズム知識は、何が不足しているのかもよくわかっていない感じがしますねね……!
BFS/DFSについては3ヶ月前からわからんわからんと言っていますが、未だにそれっぽい問題に当たっても実装できずにいます。ABCのD〜Eのところに壁があって、ここを乗り越えるのに苦労しています。
で、D・Eを解けるように練習していたらCで足をすくわれたりします。
UnionFindやダイクストラと言ったアルゴリズムは、名称こそ知っているものの手がつけられていません。
問題を解いていくのは楽しいですが、人生が破綻してしまう危険があるため、あまり自分を追い詰めないようにやろうと思います。
過去問を1日1AC(サボっても可)、コンテストには100%参加し、できなかった問題を解説ACする、といった軽めのルーティンを継続していきたいと思っています。
過去は変えられませんが、どうしても言いたいことがあるとすると、学生のうちに競プロに出会いたかった……! という感じです。
他にやったこと
プログラミングが楽しいことに気がついたので、パソコンを使って仕事や日常生活、趣味に+αできればいいなと思っていました。ただ、何をすべきかわかっていなかったので、手当たりしだいに興味のある本を読んだりオンライン講座をやったりしました。
①IT知識をつける
そもそもITについての知識が不足していたので、かの有名なGoogleのお医者さんの記事で紹介されていた本を買って勉強してみました。難しくて理解できなかったものもありますが、この2冊は初学者向けで、わかりやすく楽しく読めました。
1冊目、資格の本です。
ウェブページがどんなふうに表示されているのか、ネットワークの仕組みがどうなっているのか、パソコンの中身がどんなふうになっているのか……といった広汎な基礎知識がイラストでまとめられていて、楽しく、新鮮な驚きとともに読むことができました。なにかわからなくなったときには、この本に戻ってくることがありそうです。
一番興味を引いたのはソフトウェアの開発フローです。私はハード設計の仕事をしていますが、ハードのベテランから教わったことがこの本にも書いてありました。
ハードとソフトの違いがあるとは言え、両方とも「ものづくり」なんだな、と感じました。
2冊目、CPUの本です。
会社の同期が面白いと言っていたのを思い出して購入しました。
「コンピュータは01で動いている」ということをぼんやりと知ってはいましたが、その挙動がもっと具体的にイメージできるようになりました。
クロック、フリップフロップ、デコーダ……いろいろモジュールが組み合わさってパソコンが動いているということを実感できます。そのひとつひとつのモジュールの動作を、回路図と一緒に説明してくれるのがとてもわかりやすいです。
また、2000年代前半の秋葉原を彷彿とさせる絵柄と語り口がわりと好きでした。
②仕事に役立てる
もうひとつ、C++を使って、仕事で使う解析ソフトが自作できるかも、ということを試しました。流体解析を自分でやってみようとして、仕事50%趣味50%でこの本を読みました。
ようやくナビエ・ストークス方程式を自分で導ける(ときどき教科書を見ながら)ようになったのは内緒です。
コーディングは環境構築の仕方がよくわからなかったため、paizaのオンラインコンパイラを使っていました。
ただ、行列計算をバグらせてしまったり、使うにあたって不便な部分がいろいろあったりして、実用するには全く届きませんでした。バグや入力ミス、大量のコードとの戦いです。仕事でのコーディングの大変さのほんの一端が垣間見えたような気がします。
私がやったのは二次元翼の簡単な(はずの)解析ですが、実際は三次元の翼を扱います。
ソフトメーカーさんってすごいですね……使いにくいとか言ってすみませんでしたという気持ちです。
もうひとつ、データサイエンスとPythonにも興味があったので、kaggleに登録しました。
いろいろなパラメータから目的の数値を予測することができるなら、きっと仕事にも役に立つと思いました。C++よりもコードの読み書きが簡単ということをProgateの講座で知っていたので、流体解析もPythonなら簡単にできるかも、という狙いもありました。
また、会社にはPythonを使ったデータサイエンスの外部講習の案内が去年から来ていました。私は上司に出たい旨を伝えましたが、すでに枠は埋まっていたようです。その腹いせということで、自分で勉強してやるモチベーションが高まっていました。
とはいえ、登録していきなりデータ解析ができるものでもないので、しばらくはそのままほったらかしにしていました。が、ある日micro courseなるもの があると知り、ひとまずここを進めてみることにしました。コースを終えるたびに称号がもらえるので、学習モチベーションが死ぬほど高められました。IT関連の教材って、学習のモチベーションを高めるのが上手な気がしませんか? ゲームが好きな人が多いからでしょうか?
終了した講座の一覧です。
いろいろいじってわかったことですが、jupitarの使い方を覚えれば、exelよりもずっと早く、見やすいデータが作れそうです。
それだけでなく、なんとディープラーニングや自然言語処理までマスターしてしまいました。
特に、自然言語処理の講座はお気に入りです。これがきっかけで、数年前に読んで気になっていた本のことを思い出しました。
③趣味に役立てる
数年前、この本を読んで衝撃を受けました。
「パソコンに小説を読ませてベストセラーになるか予測する」試みをした本です。
私はかなり前から新人賞を目指して小説を書いています。が。才能がなさそうなのでいまだそこに至っていません。なので、感性やミラクルに頼らず、物語作りのノウハウを固め、理屈を積み上げた上で面白い小説を書いて賞を取ってやろうと思っています。
初めてこの本を読んだ時、自分のやりたいことはこの本の中にありそうだと思いました。売れる本はタイトルにtheがつく、テーマは増やす過ぎずにポイントを絞る、主人公は主体性のある動詞をよく使う……創作界隈でまことしやかに囁かれるノウハウが、数値計算の結果からはじき出されてくるのがまさに私の望むところでした。
誰が読んでも面白い読み物ですが、追試をしようと思うとそれなりのバックグラウンドが必要になりそうで、自分にはできないかもと当時は思っていました。
競プロからスタートしてこの本に戻ってこられたのは嬉しい偶然です。
今後はこの本の追試を目標に自然言語処理を始めていこうと思っています。
まず「感情分析」だけは、今の私でも実装できそうだったので、やってみました。
その結果、実際の読み味をうまく模擬した結果を得ることができました。この結果を見て、自然言語処理にさらに興味がわきました。
太宰治の作品の中では、最も読んだ印象が異なる2作です。片方はポジティブ、片方はネガティブ。陰陽がはっきり分かれます。きっと誰が読んでも同じ印象を受けるでしょう。簡単なコードでもその読み味をきちんと再現できています。
今後やること
興味の先はいろいろありますが、自分を追い詰めず、できることを少しずつやっていこうと思います。
①ABCには全部参加して、解けなかった問題を1つ解答する。
②ABCのC問題を1日1問埋める(サボっても良い)。
③「ベストセラーコード」を読み返して、追試できそうなところを自分で書いて回してみる。その結果が自分の書いたものに反映できればなお良し。
今年中には緑コーダーになって、トピック分析ができるようになって、長編小説が一篇出来上がっていればいいなと思います。
お付き合いいただきありがとうございました。何かアドバイスや興味のあるところがあれば、お教えください。