FizzBuzzという存在を初めて知る

Paizaのアルゴリズムの問題が、2017年7月10日まで無料で受けられるということでトライしてみたところ、FizzBuzzという存在を初めて知りました。

Fizz Buzz(フィズ・バズ、Bizz BuzzBuzzとも呼ばれる)は英語圏で長距離ドライブ中や飲み会の時に行われる言葉遊びである。

プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。

ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。

Fizz Buzz - Wikipedia

⇩ Paizaは、プログラミングの学習ができます(無料、有料さまざま)

初心者でも楽しく学べるプログラミング入門サービス | paizaラーニング

プログラミングでFizzBuzz

今現在は、Javaを学習中なので、Javaで記述していきたいと思います。

package algorithm;
/**
 * FizzBuzzクラス
 * @author ts0818
 *
 */
// 1から整数を数える
// 3で割り切れる = Fizz
// 5で割り切れる = Buzz
// 3でも5でも割り切れる = FizzBuzz
public class FizzBuzz {

  public static void main(String[] args) throws Exception {
    // 表示用の変数
    String output;
    for(int i = 1; i <= 100; i++) {
      // 変数の中身をリセット
      output = "";
      // 3で割り切れるとき
      if(i % 3 == 0) {
        output = "Fizz";
      }
      // 5で割り切れるとき
      if(i % 5 == 0) {
        output += "Buzz";
      }
      // どちらでもないとき
      if((i % 3 != 0) && (i % 5 != 0)) {
        output = "暇をもてあます・・・神々の遊び・・・";
      }
      System.out.println(i + ": " + output);

    }
  }
}

if esle文で記述する際は、記述する順番に注意が必要です。

package algorithm;
// 1から整数を数える
// 3で割り切れる = Fizz
// 5で割り切れる = Buzz
// 3でも5でも割り切れる = FizzBuzz
public class FizzBuzz {

  public static void main(String[] args) throws Exception {
    // 表示用の変数
    String output;
    for(int i = 1; i <= 100; i++) {
      // 変数の中身をリセット
      output = "";
      // 3かつ5で割り切れるとき
      if((i % 3 == 0) && (i % 5 == 0)) {
        output = "FizzBuzz";
      // 3で割り切れるとき
      } else if(i % 3 == 0) {
        output = "Fizz";
      // 5で割り切れるとき
      } else if(i % 5 == 0) {
        output += "Buzz";
      // それ以外のとき
      } else {
        output = "暇をもてあます・・・神々の遊び・・・";
      }
      System.out.println(i + ": " + output);
    }
  }

}
    

&&条件(論理積)のものを一番上に持ってこないと評価がされないので注意が必要です。

閏年FizzBuzzの考え方で記述できるみたいです。

package algorithm;    
// グレゴリオ暦閏年判定 - 乱数版
public class Main {
  public static void main(String[] args) throws Exception {

    int seireki = (int)(Math.random() * 3000 + 1);
    // 西暦年が100で割り切れるとき
    if (seireki % 100 == 0) { 
      System.out.println(seireki);
    // 西暦年が400で割り切れるとき
    } else if (seireki % 400 == 0) {
      System.out.println(seireki + " 閏年");
    // 西暦年が4で割り切れるとき
    } else if (seireki % 4 == 0) { 
      System.out.println(seireki + " 閏年");
    // それ以外のとき
    } else { 
      System.out.println(seireki);
    }
  }
}

プログラミングで2のN乗

package algorithm;
public class Main {

  public static void NthPower(String[] args) throws Exception {

    int number = 10;
    long[] pow = new long[number + 1];
    // 2の0乗は1
    pow[0] = 1; 
    
    for (int i = 0; i <= number; i++) {
      if (i >= 1) {
        // 2の(i-1)乗から2のi乗の値を求める
        pow[i] = pow[i -1] * 2; 
      }
      System.out.println(i + ": " + pow[i]);
    }
  }

}
package algorithm;
// 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024
// 再帰
public class Main {
  public static void main(String[] args) throws Exception {
    int number = 10;
    for (int i = 0; i <= number; i++) {
      System.out.println(i + ": " + power(i));
    }
  }
  public static int power(int num) {
    // 2の0乗は1
    if (num == 0) {
      return 1;
    }
    // 2の(num -1)乗に2を掛けた値を返す
    return power(num - 1) * 2; 
  }
}

 

プログラミングでNの階乗

package algorithm;
public class Main {

  public static void Factorial(String[] args) throws Exception {

    int number = 10;
    long[] perm = new long[number + 1];
    // 0の階乗の値は1
    perm[0] = 1; 
    
    for (int i = 0; i <= number; i++) {
      if (i >= 1) {
        // (i-1)の階乗の値からiの階乗の値を求める
        perm[i] = perm[i -1] * i; 
      }
      System.out.println(i + ": " + perm[i]);
    }
  }

}
package algorithm;    
// 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800
// 再帰
public class Factorial {
  public static void main(String[] args) throws Exception {
    int number = 10;
    for (int i = 0; i <= number; i++) {
      System.out.println(i + ": " + permutation(i));
    }
  }
  public static int permutation(int num) {
    // 0の階乗は1
    if (num == 0) {
      return 1;
    }
    // (num-1)の階乗にnumを掛けた値を返す
    return permutation(num - 1) * num;
  }
}

 

プログラミングでトリボナッチ数列

package algorithm;
//トリボナッチ数
// 0, 0, 1, 2, 4, 7, 13, 24, 44, 81, 149

public class Main {
  public static void main(String[] args) throws Exception {
    int number = 50;
    long[] tri = new long[number + 1];
    
    tri[0] = 0; // 0番目のトリボナッチ数は0
    tri[1] = 0; // 1番目のトリボナッチ数は0
    tri[2] = 1; // 2番目のトリボナッチ数は1
    
    for (int i = 0; i <= number; i++) {
      if (i >= 3) {
        // 直前の3つのトリボナッチ数から次のトリボナッチ数を求める
        tri[i] = tri[2] + tri[1] + tri[0]; 
        // トリボナッチ数の項を更新
        tri[0] = tri[1];
        tri[1] = tri[2];
        tri[2] = tri[i];
      }
      System.out.println(i + ": " + tri[i]);
    }
  }
}

package algorithm;
//トリボナッチ数
// 0, 0, 1, 1, 2, 4, 7, 13, 24, 44, 81, 149
// 再帰
public class Main {
  public static void main(String[] args) throws Exception {
    int number = 30;
    for (int i = 0; i <= number; i++) {
      System.out.println(i + ": " + tribonacci(i));
    }
  }
  public static long tribonacci(int num) {
    // numが0ならば
    if (num == 0) { 
      return 0; 
    }
    // numが1ならば
    if (num == 1) {
      return 0; 
    }
    // numが2ならば
    if (num == 2) {
      return 1; 
    }
    // 直前の3つのトリボナッチ数の和を返す
    return tribonacci(num -1) + tribonacci(num -2) + tribonacci(num -3); 
  }
}
package algorithm;
//トリボナッチ数
// 0, 0, 1, 1, 2, 4, 7, 13, 24, 44, 81, 149
// 再帰
public class Main {
  public static void main(String[] args) throws Exception {
    int number = 50;
    for (int i = 0; i <= number; i++) {
      System.out.println(i + ": " + tribonacci(i));
    }
  }
  public static long tribonacci(int num) {
    // トリボナッチ数の最初の3項(0, 0, 1)を用いて,再起呼び出し
    return tri2(0, 0, 1, num);
  }
  public static long tri2(long a, long b, long c, long d) {
    // 再起の深さがd
    if (d < 2) {
      return a;
    }
    // 再起呼び出し
    return tri2(a + b + c, a, b, d - 1); 
  }
}

再帰処理はソースコードを見てもどういう動きになってるのかいまいちつかめないですね。というわけで、図にしてみました。

f:id:ts0818:20170708185427p:plain

f:id:ts0818:20170708185424p:plain

f:id:ts0818:20170708185421p:plain

f:id:ts0818:20170708185418p:plain

f:id:ts0818:20170708185415p:plain

f:id:ts0818:20170708185445p:plain

f:id:ts0818:20170708185831p:plain

たしかに、トリボナッチが成り立ってますが....再帰処理、激ムズですね。

 

プログラミングでピタゴラスの定理

package algorithm;    
//ピタゴラスの定理
public class Main {
  public static void main(String[] args) throws Exception {
    int number = 10;
    for (int i = 1; i <= number; i++) {
      System.out.println(i + ": " + pythagorean(3, i));
    }
  }
  public static double pythagorean(int a, int b) {
    // 斜辺の値を返す
    return Math.sqrt((Math.pow(a, 2) + Math.pow(b, 2))); 
  }
}

2017年の7月11日からは、Paizaの『アルゴリズム入門2』が無料で受けられるみたいですね、ありがたや~。