countメソッドにブロック渡そう
November 03, 2021
こんにちは、たわらです。
ある配列のなかで条件を満たした要素数を数える、みたいなことがよくありますよね。たぶん。
変数を用意して、条件を満たせば、インクリメントする、というやり方はパッと思いつきます。
しかしそうではない方法もあります。今回は count メソッドにブロックを渡せば、より短いコードで書けるよね、という記事です。
問題
N の約数の個数を数えるプログラムを作成してください。 ただし NN の約数は「 NN を割り切ることのできる 11 以上の整数」です。
アルゴ式の問題ですね。
[https://algo-method.com/tasks/221:title]
例えば、、、
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