INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。
■問題
●出典
AtCoder Beginner Contest 046のA問題
https://atcoder.jp/contests/abc046/tasks/abc046_a
●問題文
シカのAtCoDeerくんはペンキをこれまでに3つ買いました。おととい買ったペンキの色は a , 昨日買ったペンキの色は b , 今日買ったペンキの色は c です。各ペンキの色は1以上100以下の整数で表されます。 AtCoDeerくんはわすれんぼうなため、同じ色のペンキを買ってしまっていることがあります。AtCoDeerくんが買ったペンキの色の種類の個数を教えてあげてください。
●制約
- 1≦a,b,c≦100
●入力
入力は以下の形式で標準入力から与えられる。
a b c
●出力
AtCoDeerくんが買ったペンキの色の種類の個数を出力せよ。
■回答
●愚直に書く
まず重複をなくして、それから配列の要素数を数えるという感じかな。
a = gets.split.map(&:to_i)
puts a.uniq.size
通った!!
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
今回は、メインメソッド、重複を取り除いて要素数を数えるメソッド、標準入力を取るメソッドの3つにしてみた。
def main
a = read_nums
puts method(a)
end
def method(a)
a.uniq.size
end
def read_nums
gets.split.map(&:to_i)
end
main
通った!
●リファクタリング/別アプローチ
全然思いつかないなぁ、変数に入れずそのままやるくらいかな。
puts gets.split.map(&:to_i).uniq.size
通った!
●他の方の回答例
最短の回答がp gets.split.uniq.size
だった。
そうか、map(&:to_i)
する必要ないのか…!
●出てきたメソッド等
公式リファレンスを見る訓練。
- Array#uniq
https://docs.ruby-lang.org/ja/latest/method/Array/i/uniq.html - Array#length
https://docs.ruby-lang.org/ja/latest/method/Array/i/length.html
ちなみにlength
がエイリアスメソッド。
■振り返りなど
メソッド化を割とすんなり書けてよかった。最近AtCoderの頻度が下がっていたので徐々に取り戻していきたい。あとできればまたB問題に着手していきたい。