Life & Style

FizzBazz

FizzBuzz問題とは、プログラミングにおける有名な問題である。

非常に初歩的なのだが、案外、きちんと解答できる人が少ない事でも有名。

熟練のエンジニア、プログラマーでもだ。

既存コードを元に実装したり、設計工程が多くなる事によって、何も見ずに実装する事ができなくなってしまっているのだ。

初心者の方、また上級者の方でも、ぜひトライしてみてほしい。

ではJava、RubyにおけるFizzBazz問題について考えよう。

問題

1から100までの数を出力するプログラムを書け。

ただし3の倍数のときは「Fizz」と、

5の倍数のときは「Buzz」と出力し、

3と5両方の倍数の場合には「FizzBuzz」と出力すること。

Javaでの実装

while文でも実装可能だが、一般的なfor文での実装。

public class FizzBazz{
  public static void main(String[] args){
    String space = "";

    for(int i = 1; i <= 100; i++){
      if(i % (3 * 5) == 0){
        System.out.println("FizzBazz");
      }else if(i % 3 == 0){
        System.out.println("Fizz");
      }else if(i % 5 == 0){
        System.out.println("Bazz");
      }else{
        System.out.println(i);
      }
      System.out.println(space);
    }
  }
}

Rubyでの実装

Rubyでは様々なメソッドが用意されているため、数種類の実装方法がある。全ては紹介できないが、for、each、uptoメソッドでの実装。

for文を使用した実装

def fizz_bazz
  for i in 1..100
    if i % (3 * 5) == 0
      puts "FizzBazz"
    elsif i % 3 == 0
      puts "Fizz"
    elsif i % 5 == 0
      puts "Bazz"
    else
      puts i
    end
end

eachメソッドを使用した実装

def fizz_bazz
  (1..100).each do |i| 
    if i % (3 * 5) == 0
      puts "FizzBazz"
    elsif i % 3 == 0
      puts "Fizz"
    elsif i % 5 == 0
      puts "Bazz"
    else
      puts i
    end
  end
end

uptoメソッドを使用した実装

def fizz_bazz
  1.upto(100) do |i| 
    if i % (3 * 5) == 0
      puts "FizzBazz"
    elsif i % 3 == 0
      puts "Fizz"
    elsif i % 5 == 0
      puts "Bazz"
    else
      puts i
    end
  end
end

こうしてJavaとRubyを比べてみると、静的型付けであるJavaの方がコード量が多いのが分かる。

厳密に型まで指定する必要があるJavaの安心感。汎用的で、大規模開発で活躍する要因の一つだ。

反対にRubyは動的型付けであり、型の指定が不要。

「全てがオブジェクト」である事から、String型やInteger型もオブジェクトであり、様々なメソッドを持っている。そのためメソッドを呼ぶだけで勝手に動いてくれる感覚だ。

開発スピードが圧倒的に早い。ベンチャーやスタートアップ企業でよく用いられるのも納得だ。

応用編 世界のナベアツ問題

FizzBazz問題を基本形とし、様々な応用へと発展させる事も可能。

問題

1から100までの数を出力するプログラムを書け。

ただし3の倍数または3を含む数のときは「Fizz」と、

5の倍数または5を含む数字のときは「Buzz」と出力し、

3と5両方の倍数の場合には「FizzBuzz」と出力すること。

Javaでの実装

public class FizzBazz{
  public static void main(String[] args){
    String space = "";

    for(int i = 1; i <= 100; i++){
      if(i % (3 * 5) == 0){
        System.out.println("FizzBazz");
      }else if(i % 3 == 0 || Integer.toString(i).contains("3")){
        System.out.println("Fizz");
      }else if(i % 5 == 0 || Integer.toString(i).contains("5")){
        System.out.println("Bazz");
      }else{
        System.out.println(i)
      }
      System.out.println(space);
    }
  }
}

Rubyでの実装

def fizz_bazz
  for i in 1..100
    if i % (3 * 5) == 0
      puts "FizzBazz"
    elsif i % 3 == 0 || i.to_s.include?("3")
      puts "Fizz"
    elsif i % 5 == 0  || i.to_s.include?("5")
      puts "Bazz"
    else
      puts i
    end
end

何も見ずに誤字脱字無く実装できるか

実際に手を動かしてみると、クラス宣言、for文の書き方等に手が止まる方も多かったのではないだろうか。

基本に立ち戻り、こういった問題を解いてみるのも面白い。

PICK UP

  • コメント ( 0 )

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。