久しぶりにProject Eulerをやってみようと思ったが、せっかくなので進捗をリセットして最初からにした。
とりあえず10問やってみたが大分脳がヤバくなってる感あったのでちゃんと継続してボケ防止に努めたい。
解答コードはgithubで管理することにして、ここには要点をメモっていく。
Problem 1: Multiples of 3 and 5
簡易版FizzBuzz。添字操作と条件式の組み合わせの基本確認。
Problem 2: Even Fibonacci numbers
RでProject Eulerをやる場合、gmpパッケージを縛るか縛らないかで難易度に雲泥の差が生ずるが、基本的には使っていく方針で進めていきたい。便利そうなパッケージがあれば積極的に利用していく。
フィボナッチ数はgmp::fibnum()で求められる。
Problem 3: Largest prime factor
素因数分解はgmp::factorize()で実行できる。
Problem 4: Largest palindrome product
文字列の反転はstringi::stri_reverse()で実行できる。
組み合わせ毎に調べたほうが効率が良いが、探索範囲が狭いので999*999からスタートして下っていく方針でもすぐに終わる。
クリアすると読めるPDFファイルで勉強するための問題だろう。
Problem 5: Smallest multiple
大きな階乗はgmp::factorialZ()を使うと良い。
Big Integerに演算を施す場合は専用の関数が必要になる場合がしばしばある。剰余を求めるにはgmp::mod.bigz()を使う。
Problem 6: Sum square difference
ベクトル演算が出来るRでは基本操作レベル。
Problem 7: 10001st prime
gmpにはgmp::nextprime()という便利な関数がある。
Problem 8: Largest product in a series
文字列の操作方法が問題となる。
- 置換: sub(最初の1つだけ)、gsub(全て)
- 切り出し: substring
- 分割: strsplit(結果はlistなのでunlistする)
Problem 9: Special Pythagorean triplet
多重ループを抜けるにはlabeledLoopパッケージによるラベル付きループが便利だ。
探索範囲が狭いのでbrute forceでもすぐに終わってしまうのだが、これもProblem 4と同様、クリア後にPDFファイルで学習する用に簡単になっているのだろう。
Problem 10: Summation of primes
エラトステネスの篩は覚えるまで何度か自分で実装してみたほうが良いが、numbersというパッケージにエラトステネスの篩が入っている。numbers::Primes()は2つの引数を与えるとその数以下の、2つの値を与えると2数間の素数を列挙する。2つの値を与える場合に2数が20万くらい以上離れているとエラーが出るようだが、一つだけなら2^53-1まで指定できるようだ(あまり大きいと終わらなくなるが)