Paizaのアルゴリズムの問題が、2017年7月10日まで無料で受けられるということでトライしてみたところ、FizzBuzzという存在を初めて知りました。
Fizz Buzz(フィズ・バズ、Bizz BuzzやBuzzとも呼ばれる)は英語圏で長距離ドライブ中や飲み会の時に行われる言葉遊びである。
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。
ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。
⇩ 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); } } }
&&条件(論理積)のものを一番上に持ってこないと評価がされないので注意が必要です。
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); } }
再帰処理はソースコードを見てもどういう動きになってるのかいまいちつかめないですね。というわけで、図にしてみました。
たしかに、トリボナッチが成り立ってますが....再帰処理、激ムズですね。
プログラミングでピタゴラスの定理
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』が無料で受けられるみたいですね、ありがたや~。
今回はこのへんで。