部屋の隅っこで書く技術ブログ

Web系企業勤務のエンジニアリングマネージャのブログです。技術ブログと称しつつ技術にまつわる個人的な話題が多めです。

RubyでProject Euler100問解きました

f:id:expajp:20181002215133p:plain

RubyでProject Euler100問解答を達成しました。

Project Eulerとは

Project Eulerというのは、コンピュータで解く数学の問題集です。

問題はすべて英語ですが、日本語訳Wikiもあります(お世話になりました)。

projecteuler.net

GoogleのTech Dev Guideでも紹介されるなど、有名な問題集であるようです(自分は大学の講義で知りました)。

techdevguide.withgoogle.com

2018年10月現在627問あり、後半になるにつれて難問の割合が増えます。全問回答者は世界でたったの14人

100問目までなので比較的易しい問題が多かったですが、それでも1割ほどは高校数学では太刀打ちできないレベルの整数論の問題がありました。

(知らない公式を使うやつはググって対処

プロコン的な問題ではあるものの比較的「数学」に主眼が置かれているようで、設定が複雑な問題は非常に少ないです。

既知のアルゴリズムを上手に組み合わせて解くような問題も解いてみたいですね。

進め方

Write Code Everydayの一環として進めました。

毎日通勤中とか帰宅後の時間に、

問題読む → 解き方考える → 実装する → 試す → 駄目なら別の方法を考える → それでも無理ならググる → 次の問題に移る → ...

という流れで1日5-20分程度で少しずつ少しずつ。

草生やしが目的なので、もちろんGitHubリポジトリがあります。こちら。

github.com

これを見ると、

  • 13-50問目が2017/07/04-09/27の86日間
  • 51-100問目が2018/02/13-09/11の211日間
  • (Cで解いていたので飛ばしていた)1-12問目が2018/09/12-13の2日間

の合計299日間だったので、平均で3日に1問ペースで解いていたことになりますね。

解いてよかったこと

Rubyの組込クラスの機能をたくさん知れた

一番はこれです

Rubyは大クラス主義なので、組込クラスにもあらゆる機能が組み込まれています。

Array#repeated_permutation(配列の重複順列をすべて挙げる)とかPrime#prime_division(値を素因数分解する)とか、これをやらなければ絶対に知らなかったメソッドを知ることができました。

あと、お仕事へのお役立ち度はこちらのほうが高いんですが、整数論の問題が多いのでリスト処理が上手くなります

Rubyのリスト処理はワンライナーでごりごり書いていくことができるので爽快感がすごい。

&でメソッドを渡す処理が綺麗に決まると脳汁出まくりです。

キャリアにプラスになった

少なくとも、最低限の数学の能力、アルゴリズム構築力、実装力、継続力があることを証明できます。

世のテック企業の採用担当者にどれくらい刺さるかはまだわかりませんが、仕事では得がたい能力を証明できるので、差別化にはなると思います。

「やった」と胸が張れることがあると自信持てて良いですね。

ものすごく頭の体操になった

難しめの問題を脳みそひねって考えたおかげで、ものすごく頭の体操になりました

いま、受験勉強が終わった直後と同じくらいに脳みそが活性化してる実感があります。

ろくに勉強してなかった大学生のときは24時間眠ってるような感覚でアタマが上手く働いていなかったので、実際何かしらあるんだと思います。

判断力が上がって日常生活の助けになってます。

TokyuRuby会議のLTネタになった

詳しくはこちら。

expajp-tech.hatenablog.com

反省点

チェリー本と一緒に進めるべきだった

いま知識の確認を兼ねてチェリー本やってるんですが、「先にこれをやっておけば...!」と思うことがあります。

Rubyの機能に関する知識を同時に勉強しなかったことで、新しく覚えた機能をProject Eulerで試すというサイクルを作れませんでした。

例えば、Rationalクラスを知っていればもっとラクに解けていた問題がいくつかあります。

なんでやってなかったかといえば、当時は入れる知識をマネジメントとRailsに絞っていたためです。

それでいっぱいいっぱいだったとも言う。

ちなみにチェリー本とはこちらの本のことです。

順不同で解くのをもう少し早く解禁すべきだった

1ヶ月近くかけたのにどうしても解けず96問目だけを後回しにしたのですが、これはもう少し早く解禁すべきでした。

というのも、時間を置いて考えてみるとぬるっと解けてしまったから。

同じ問題にこだわりすぎて無駄にした時間は思えば他にも結構あります。。。

難しい問題は土日に当たるように後回し、は効果的に使っていくべきだと思いました。

このクセのせいで大学受験で痛い目を見たはずなのにな〜

Write Code Everydayでやってたのが裏目に出た

手続き型言語のような、設計もへったくれもない、行き当たりばったりのコード を書いていました。

もう少しオブジェクト指向を活かした書き方をすればよかった。

そうすれば、Rubyのオブジェクトの扱いをもう少し知られたかもしれません。

これは毎日進捗を出すために設計を考える時間を取っていなかったためで、Write Code Everydayに足を引っ張られた形になりました。

まとめ

  • Project Eulerで100問解いた
  • 知識は増えたしキャリアの足しになった
  • もっと効率よく学んだり解いていったりすることはできたはずだった

プログラミングを勉強する手段としてはすっごくおすすめですので、みなさんもやってみてはいかがでしょうか。

就活前に草を生やすネタがほしいけど特にアイデアがない学生さんとか、文系出身者の数学コンプレックス解消とかにも良いかもしれません。

Project Euler解くのは一旦ストップしますが、草生やしのネタが尽きたらまた戻ろうと思います。

ウデが鈍るのを防ぐためにたまに戻ってきて5問区切りで解くくらいできたら良いですね。