このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集のスキルチェック見本問題セットから「Fizz Buzz (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
整数 N が入力として与えられます。
1からNまでの整数を1から順に表示してください。
ただし、表示しようとしている数値が、
- 3の倍数かつ5の倍数のときには、”Fizz Buzz”
- 3の倍数のときには、”Fizz”
- 5の倍数のときには、”Buzz”
を数値の代わりに表示してください。
入力される値
入力は以下のフォーマットで与えられます。
1 |
N |
- N は1以上N以下の整数です。
考え方
ある数値 x が y の倍数か否かを判断するには剰余演算子 % を使う。
このとき、ある数 x が 3 と 5 の最小公倍数 15 で割ったときのあまりが であれば "Fizz Buzz" であることに気づけばコードが簡素化できる。
さらに、 switch-case 文とパターンマッチを使い、 where 節で条件分岐を行うことでも実現可能。
解答例
愚直な例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
let j = Int(readLine()!)! for i in 1...j { if i % 3 == 0 { if i % 5 == 0 { print("Fizz Buzz") } else { print("Fizz") } } else if i % 5 == 0 { print("Buzz") } else { print(i) } } |
最小公倍数を使うとこのような感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 求める数の上限値 let j = Int(readLine()!)! for i in 1...j { if i % 15 == 0 { print("Fizz Buzz") } else if i % 5 == 0 { print("Buzz") } else if i % 3 == 0 { print("Fizz") } else { print(i) } } |
switch-case のパターンマッチを使うとこのような感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 求める数の上限値 let j = Int(readLine()!)! for i in 1...j { switch i { case _ where i % 15 == 0: print("Fizz Buzz") case _ where i % 5 == 0: print("Buzz") case _ where i % 3 == 0: print("Fizz") default: print(i) } } |