INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。
■問題
●出典
AtCoder Beginner Contest 061のA問題
https://atcoder.jp/contests/abc061/tasks/abc061_a
●問題文
3 つの整数 A,B,C が与えられます。
整数 C が A 以上 かつ B 以下であるかを判定してください。
●制約
- −100≦A,B,C≦100
- A,B,C は全て整数
●入力
入力は以下の形式で標準入力から与えられる。
A B C
●出力
条件を満たす場合はYes、そうでない場合はNoを出力せよ。
■回答
●愚直に書く
まずは愚直に条件分岐。
a, b, c = gets.split.map(&:to_i)
if c >= a && c <= b
puts "Yes"
else
puts "No"
end
通った!
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
def main
a, b, c = read_nums
puts is_middle?(a, b, c)
end
def is_middle?(a, b, c)
if c >= a && c <= b
"Yes"
else
"No"
end
end
def read_nums
gets.split.map(&:to_i)
end
main
通った!!
●リファクタリング/別アプローチ
問題を見た時から、max
やmin
を使えるんじゃないかと睨んでいた。
「整数 C が A 以上 かつ B 以下」ということは、Aが一番小さくてBが一番大きい(つまりCは真ん中)ということなので、1つの変数に配列で3つの数字を取ってきて、min
とmax
を使えそう。
n = gets.split.map(&:to_i)
if n[0] == n.min && n[1] == n.max
puts "Yes"
else
puts"No"
end
通った!嬉しい。ただ、そこまでスマートというわけでもないか…。
あとは三項演算子か。
a, b, c = gets.split.map(&:to_i)
puts c >= a && c <= b ? "Yes" : "No"
●他の方の回答例
min
とmax
の範囲内にあるかを判定するbetween?
メソッドというのを使っている人がいた。このメソッド初めて見た…!
a, b, c = gets.split.map(&:to_i)
puts c.between?(a,b) ? "Yes" : "No"
●出てきたメソッド等
公式リファレンスを見る訓練。
- Comparable#between?
https://docs.ruby-lang.org/ja/latest/method/Comparable/i/between=3f.html
■振り返りなど
between?
メソッド、知っておくと便利そう。