コンテンツへスキップ

【Ruby基礎006】AtCoder Beginner Contest 006 A – 世界のFizzBuzz

  • by

INDEX

■はじめに

Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、最も簡単なA問題を解いていく)

■問題

●出典

AtCoder Beginner Contest 006のA問題
https://atcoder.jp/contests/abc006/tasks/abc006_1

●問題文

数字 N が与えられます。 N に 3 が含まれる、もしくは 3 で割り切れる場合はYES、それ以外は NO と出力してください。

●入力

入力は以下の形式で標準入力から与えられる。

N

整数 N(1≦N≦9) が 1 行で与えられる。

●出力

N に 3 が含まれる、もしくは 3 で割り切れる場合はYES、それ以外は NO と出力してください。

■回答

●愚直に書く

愚直に考えると「3が含まれたらYes、もしくは3で割り切れたらYes、それ以外はNo」というif式かなぁ。
「含まれたら」というのはどうやるんだろう、2桁以上の場合は一旦桁ごとの数字を配列にして照合するのかな、とか思っていたら、入力の条件でN(1≦N≦9)と書いてあるので1桁だけなのか。それならば「3で割り切れたらYes、それ以外はNo」だけ考えればいいのか。であればかなりシンプルなような?

n = gets.to_i
if n % 3 == 0
  puts 'Yes'
else
  puts 'No'
end

上記を提出したらWAになってしまった…。
(WA (Wrong Answer)=誤答。提出したプログラムの出力が正しくない)
あれ〜なんでだろう。
15分くらい悪戦苦闘して、Yes/Noの表記が間違っていることに気づいた涙(本当は全て大文字のYES/NO)。こういうミスはたまに起こる。
下記で成功した。

n = gets.to_i
if n % 3 == 0
  puts 'Yes'
else
  puts 'No'
end

●リファクタリング

気を取り直してリファクタリング。
三項演算子にできるかなぁ。

n = gets.to_i
puts (n % 3 == 0 ? 'YES' : 'NO')

通った!

●他の方の回答例

変数に入れずに直接式の中に標準入力を入れてさらにコード長を短くしてる、という感じかな。

正規表現を使っている方もいて面白かった。今回でいうとNは1ケタ限定なので「3か6か9ならYES、それ以外はNO」ということになるので正規表現もアリなのか。

■振り返りなど

  • 凡ミスにより時間を浪費してしまったが、練習の場で凡ミスの経験を積めたのは良かった。
  • 正規表現をサラッと使ってみたい。
  • 「世界のFizzBuzz」というくらいなら30台や300台が真骨頂だと思うので2桁以上も見越したコードを書いてみたいけど今日は時間切れ…。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA