🐙

FizzBuzzプログラム

に公開

FizzBuzzプログラムとは

FizzBuzz(フィズ・バズ)は、もともとはシンプルなパーティゲームです。
このFizzBuzzを、プログラムコードとして画面上に出力できるかどうかでプログラマーの技術力がわかるため、
コーディング面接の題材としてよく使われています。

要件

FizzBuzzプログラムでは、以下の挙動をするfizz_buzzメソッドを定義してください。

3で割り切れる数値を引数に渡すと、「Fizz」を返す
5で割り切れる数値を引数に渡すと、「Buzz」を返す
3と5の両方で割り切れる数値を引数に渡すと、「FizzBuzz」を返す
それ以外の数値は、その数値を文字列に変えて返す
また、引数として渡す値は、getsメソッドを使ってキーボードから入力できるようにしましょう。

実装

まず「Fizz」「Buzz」「FizzBuzz」数値を文字列に変えて返す動作をメソッドを使って、定義します。
割り切れる数値はnumber % 15 == 0といったように記述します。

# 3と5の両方で割り切れる場合"FizzBuzz"を出力する条件式
def fizz_buzz(number)
  if number % 15 == 0
    puts "FizzBuzz"
# 3で割り切れる場合"Fizz"を出力する条件式
 elsif number % 3 == 0
    puts "Fizz"
# 5で割り切れる場合"Fizz"を出力する条件式
  elsif number % 5 == 0
    puts "Fizz"
#上記の条件を満たさないときその数値を文字列に変えて返す
  else
    puts number.to_s
  end
end
なぜ15の条件式を先に記述したのか

仮にnumber % 3 == 0やnumber % 5 == 0を先に書いてしまうと、そちらが先にtrueで評価され期待通りの挙動をしてくれないからです。
そのため、number % 15 == 0を条件分岐の先頭に持ってくる必要があります。

次に指定した条件式を表示する記述をします。
fizz_buzz()に引数のinputを入力してもらい結果を表示します。

puts "数字を入力してください。"
input = gets.to_i
puts '結果は...'
puts fizz_buzz(input)

これで期待通りの結果を表示できるようになります!

正規表現について

このままでも最低限条件を満たしていますが、数字以外が入力された場合期待している表示にはなってくれません。
そのため正規表現によって文字列を取得できなくします。

正規表現とは?

正規表現とは、わかりやすく定義すると、ある一定の規則で並んでいる文字列を検出するための技術のことです。
正規表現で文字列などの抽出を行うには

  • match
  • pre_match
  • post_match
  • slice, slice!
    を使用します。

match(マッチした部分を取得する)

matchメソッドは正規表現にマッチした部分文字列を取得するときに使用します。

オブジェクト名 .match(/正規表現/)

以下の例では、正規表現で「*の勉強」にマッチする文字列を取り出しています。

string = "Rubyの勉強, Railsの学習"
md = string.match(/.*の勉強/)
p md[0]
=> "Rubyの勉強"

string = "Rubyの勉強, Railsの勉強"
md = string.match(/.*の勉強/)
p md[0]
=> "Rubyの勉強, Railsの勉強"

pre_match(マッチした部分の前を取り出す)

pre_matchは正規表現にマッチした前の部分の文字列を取得します。

reg = /の勉強/.match("Railsの勉強をしよう")
p reg.pre_match
=> "Rails"

post_match(マッチした部分の後を取り出す)

post_matchは正規表現にマッチした部分の後の文字列を取得します。

reg = /の勉強/.match("Railsの勉強をしよう")
p reg.post_match
=> "をしよう"

slice, slice!(マッチした文字列を取り出す)

sliceはマッチした部分の文字列を取り出します。以下の例ではaから始まる最初の文字を取り出しています。

p "xxxabcxxxx".slice(/a../)
=> "abc"

マッチしない場合はnilを返す
p "xxxxxxx".slice(/a../)
=> nil

slice!はレシーバからマッチした部分を削除します。
a = "xxxxaaaxxx"
a.slice!(/a../)
=> "aaa"
p a
=> "xxxxxx"

実際にFizzBuzzに数値以外の時にエラー文を表示させる。

def fizz_buzz(number)
  if number % 15 == 0
    puts "FizzBuzz"
  elsif number % 3 == 0
      puts "Fizz"
  elsif number % 5 == 0
      puts "Buzz"
  else
      puts number.to_s
  end
end

puts "数字を入力してください。"
input = gets
if input.to_s.match?(/^[0-9]+$/)
  puts "結果は…"
  puts fizz_buzz(input)
else
  puts "やり直してください"
end

if input.to_s.match?(/^[0-9]+$/)でinputが数字以外の文字を含んでいるときfalseが返されるように条件指定しました。

参考にさせていただいた記事

https://www.sejuku.net/blog/11692#index_id13

まとめ

正規表現にはこれ以外にもメタ文字列など検索する条件を指定することもできるみたいなので、
参考にさせていただいた記事を読み込んでおかないといけないです!
FizzBuzzは基礎の基礎で面接などテストの時に出題されることもあるようなので、いつでもできるように何度か練習しておきたいと思います。

Discussion