はじめに
入力された値がゾロ目かどうかを判定したい。
2021.7.30
コメントを頂き、空白文字が入力された際の対策を追加しました。
条件
ruby 2.6.5
実際の記述
最終的な記述は以下となる。
n = gets.gsub(/ | /){""}
if n.length > 1
puts n.chomp.split("").uniq.size == 1
else
puts "少なくとも2文字以上入力してください"
end
1. 空白を除外
入力された値に空白が含まれている場合を考慮。
n = gets.gsub(/ | /){""}
以下のようにgsub
で、「全角空白」と「半角空白」が含まれていれば「空白なし」に置換している。
gsub(/ | /){""}
# ① (/ | /) : 全角・半角を含むものを判定
# ② {""} : 全角・半角を "" に置換する
# 【例1】 : n に 1 1 1 1 が入力された場合(間に半角空白を入力)
n = gets.gsub(/ | /){""}
# => 1111
# 【例2】 : n に 1 1 1 1 が入力された場合(間に全角空白を入力)
n = gets.gsub(/ | /){""}
# => 1111
# 【例3】 : n に 1111 が入力された場合(先頭にに半角空白3つ入力)
n = gets.gsub(/ | /){""}
# => 1111
2. uniq
uniq
で入力された値に被りがあるか確認。
被り(重複)がある場合は、その要素を取り除き、新しい配列を結果として出力してくれる。
n = gets.gsub(/ | /){""}
n.chomp.split("").uniq
# 【例1】 : 渡ってきた値に被りがある時①
n = gets.gsub(/ | /){""}
# n に 1111 が入力された場合
n.chomp.split("").uniq
# => 1
# 【例2】 : 渡ってきた値に被りがある時②
n = gets.gsub(/ | /){""}
# n に 1122 が入力された場合
n.chomp.split("").uniq
# => 1
# 2
# 【例3】 : 渡ってきた値に被りがない時
n = gets.gsub(/ | /){""}
# n に 1234 が入力された場合
n.chomp.split("").uniq
# => 1
# 2
# 3
# 4
3. size
uniq
で被りが含まれていない配列を作成した次に、size
を使いその配列の要素数を数える
n = gets.gsub(/ | /){""}
n.chomp.split("").uniq.size
# 【例1】
n = gets.gsub(/ | /){""}
# n に 1111 が入力された場合
n.chomp.split("").uniq.size
# => 1
# 【例2】
n = gets.gsub(/ | /){""}
# n に 1122 が入力された場合
n.chomp.split("").uniq.size
# => 2
# 【例3】
n = gets.gsub(/ | /){""}
# n に 1234 が入力された場合
n.chomp.split("").uniq.size
# => 4
先程のuniq
で生成された配列の要素数を出力してくれている。
4. ゾロ目の判定
「ゾロ目」ということは、入力された全ての値が同じであると言える。
なので、最終的にsize
で出力された値が1
であれば入力された値は同じ数であると言える。
そのため、以下のように ==
の条件演算子を用いる事で結果をtrue
またはfalse
で出力してくれる。
n = gets.gsub(/ | /){""}
n.chomp.split("").uniq.size == 1 # sizeの値が1と等しいかどうか判定
# 【例1】
n = gets.gsub(/ | /){""}
# n に 1111 が入力された場合
n.chomp.split("").uniq.size == 1
# => true
# 【例2】
n = gets.gsub(/ | /){""}
# n に 1122 が入力された場合
n.chomp.split("").uniq.size == 1
# => false
# 【例3】
n = gets.gsub(/ | /){""}
# n に 1234 が入力された場合
n.chomp.split("").uniq.size == 1
# => false
もし、結果をtrue
false
でなくYes
No
で出力したければ、以下のように記述することで出力できる。
n.chomp.split("").uniq.size == 1 ? "Yes" : "No"
おわり
true
false
の判定を1行でできるのはいいですね!
if
とうまく使い分けていこうと思います。