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