あなたのノイズ、わたしのミュージック。

自分が何にどう関心を示したかの記録。

【Ruby】class Prime / injectメソッド

忙しい人のためのなんとか

paizaの某問題を解いていて、素因数分解したくなったけどどういうロジックで処理していけばいいんだ?とテンパりわからなくなったので、

メソッドとかないかなと藁にもすがる思いでグーグル先生にお問い合わせたら、なんとあったんですねというお話。

素因数分解をするにあたり、前もって唱えていく呪文はこちら。

require 'prime'

用法はこちら。

class Prime (Ruby 2.5.0)

お暇な方はこちら↓

詳細

前述のrequireでは、Primeというライブラリクラスを呼び出しています。

これには素因数分解などの、素数を取り扱うメソッドが定義されているようです。

素因数分解の対象.prime_division
# => [[素数, その素数の個数], [... ...]]

上記のようにすると、素因数分解の結果が2次元の配列で取得できます。

18.prime_division
# => [[2, 1], [3, 2]]

81.prime_division
# => [[3, 4]]

3.prime_division
# => [[3, 1]]

Rubyで素因数分解って簡単じゃん - k242hd's memo

Rubyで素数で遊ぶ(prime モジュール) - Qiita


これとinjectメソッドuniqメソッドを使って、対象の数値自身以外の約数全てを足し合わせた数を出したかったんだけど、

約数の出現パターンをうまくロジックに落とし込めず、某問題はいまだに解けてません。

Primeクラス、およびinjectの面白い書き方(下記)を知れただけでもよしとしよう……?

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
numbers.inject(:+)
# => 55

リファレンスより引用するとこういうことらしい。

Ruby 1.8.7と1.9では、injectメソッドにブロックの代わりにシンボルsymでメソッド名を渡すことができます。メソッド名を渡すと、「要素1.メソッド(要素2)」、「前回の結果.メソッド(要素3)」、...を計算していき、最後の結果を返します。

すごい。

すごいけど初読ではよくわからなかったのでもう少し探したら、小分けして解説している記事ありました。

Rubyで数値の配列の合計を求める方法 -- ぺけみさお