tawara's blog

雑記。個人の見解です。

countメソッドにブロック渡そう

こんにちは、たわらです。

ある配列のなかで条件を満たした要素数を数える、みたいなことがよくありますよね。たぶん。

変数を用意して、条件を満たせば、インクリメントする、というやり方はパッと思いつきます。

しかしそうではない方法もあります。今回はcountメソッドにブロックを渡せば、より短いコードで書けるよね、という記事です。

問題

N の約数の個数を数えるプログラムを作成してください。 ただし NN の約数は「 NN を割り切ることのできる 11 以上の整数」です。

アルゴ式の問題ですね。

数字の全探索 2 | アルゴ式

例えば、、、

6

が問題であれば、その約数は1,2,3,6 の4つです。 つまり答えは4です。

私のあまりイケてない回答

n = gets.to_i
count = 0
1..n.times do |i|
  i += 1
  if n % i == 0
    count += 1
  end
end
puts count

初期値0を変数に持たせ、条件を満たせば(6を割り切れれば)、変数をインクリメントする方法ですね。

長い、、、

ということで他の方の回答を見てみると、、、

いい感じの回答

2行!

n = gets.to_i
puts (1..n).filter{ |i| n % i == 0 }.count

(1..n).filter{ |i| n % i == 0 }の返り値が[1, 2, 3, 6]となります。約数ですね。この配列の要素数を答えにしています。

n=gets.to_i
p (1..n).count{|i| n % i ==0 }

最後の解法がいちばん速度が速かったですね。条件を満たす数を数えるだけです。

こういうふうに解けるんですね、、、勉強勉強っと。

参考文献

https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/count.html