1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ゾロ目を判定したい

Last updated at Posted at 2021-07-29

はじめに

入力された値がゾロ目かどうかを判定したい。

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とうまく使い分けていこうと思います。

1
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?