LoginSignup
7
7

More than 5 years have passed since last update.

ある確率で間違えるFizz Buzz

Last updated at Posted at 2016-08-10

プログラミングの練習問題にFizzBuzz問題がありますが、WikiのページFizz Buzzを見たところ、遊び方が書いてありました。一例として「FizzBuzz遊び」をプログラミングしてみました。

FizzBuzzクラス

FizzBuzzは次の2つのstaticメソッドを持ちます。

public static String replyStablyBasedOn(int i)
引数iに対して、Fizz Buzzにおいての正しい返事を返します。
public static String replyUnStablyBasedOn(int i)
引数iに対して、Fizz Buzzにおいての正しい返事をランダムに返します。

ソースは以下です。

FizzBuzz.java
package fizzbuzz;

import java.util.Random;

public class FizzBuzz {

    private static final String FIZZ_BUZZ = "FizzBuzz";

    private static final String FIZZ = "Fizz";

    private static final String Buzz = "Buzz";

    public static String replyStablyBasedOn(int i) {

        String s = null;

        if (i % 3 == 0 && i % 5 == 0) {
            s = FIZZ_BUZZ;
        } else if (i % 3 == 0) {
            s = FIZZ;
        } else if (i % 5 == 0) {
            s = Buzz;
        } else {
            s = String.valueOf(i);
        }

        return s;

    }

    private static final Random random = new Random();

    public static String replyUnStablyBasedOn(int i) {

        String s = null;
        int key = random.nextInt(4);
        switch (key) {
        case 0:
            s = FIZZ_BUZZ;
            break;
        case 1:
            s = FIZZ;
            break;
        case 2:
            s = Buzz;
            break;
        case 3:
            s = String.valueOf(i);
            break;
        }

        return s;

    }



}

HumanFizzBuzzクラス

ソースを見た方が早いかもしれませんが、以下がメソッドの説明です。

public HumanFizzBuzz(String name, int stableRange)
nameはプレーヤーの名前です。stableRangeは0から100までの整数を指定します。0に近いほど間違えやすくなります。
public String replyFrom(int i)
引数iに対して、Fizz Buzzにおいての正しい返事をランダムに返します。
public String getName
プレーヤーの名前を返します。

replyFrom()は工夫してコンストラクタで指定したstableRangeが100に近いほど、ある程度間違えないようにしています。

以下がソースです。

HumanFizzBuzz.java
package fizzbuzz;

import java.util.Random;

public class HumanFizzBuzz {

    private String name;

    private int stableRange;

    private final int BOUND = 100;

    private final Random random = new Random();

    public HumanFizzBuzz(String name, int stableRange) {
        this.name = name;
        this.stableRange = stableRange;
    }

    public String replyFrom(int i) {

        int randomNum = random.nextInt(BOUND);

        String s = null;
        if (randomNum < stableRange) {
            s = FizzBuzz.replyStablyBasedOn(i);
        } else {
            s = FizzBuzz.replyUnStablyBasedOn(i);
        }

        return s;

    }

    public String getName() {
        return name;
    }

}

Testクラス

「FizzBuzz遊び」をするクラスです。5人のプレーヤーで「FizzBuzz遊び」をします。

以下がソースです。

Test.java
package fizzbuzz;

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) {

        List<HumanFizzBuzz> list = new ArrayList<>();
        list.add(new HumanFizzBuzz("A", 90));
        list.add(new HumanFizzBuzz("B", 90));
        list.add(new HumanFizzBuzz("C", 90));
        list.add(new HumanFizzBuzz("D", 90));
        list.add(new HumanFizzBuzz("E", 90));

        int index = 0;
        int i = 1;
        HumanFizzBuzz humanFizzBuzz;
        while (list.size() > 1) {

            index = index % list.size();

            // 返事
            humanFizzBuzz = list.get(index);
            String reply = humanFizzBuzz.replyFrom(i);

            // 答え合わせ
            String correctAnswer = FizzBuzz.replyStablyBasedOn(i);
            System.out.printf("%3d番目 正解: %-8s %sさんの返事: %-8s",
                    i, correctAnswer, humanFizzBuzz.getName(), reply);
            if (correctAnswer.equals(reply)) {
                index ++;
            } else {
                System.out.printf(" 退場です。");
                list.remove(humanFizzBuzz);

                // 残りを表示
                if (list.size() > 1) {
                    System.out.println();
                    System.out.print("残り: ");
                    for (HumanFizzBuzz h : list) {
                        System.out.print(h.getName() + " ");
                    }
                }
            }
            System.out.println();

            i ++;
        }

        System.out.println("勝者: " + list.get(0).getName());

    }

}

以下が実行結果の一例です。

結果
  1番目 正解: 1        Aさんの返事: 1       
  2番目 正解: 2        Bさんの返事: 2       
  3番目 正解: Fizz     Cさんの返事: Fizz    
  4番目 正解: 4        Dさんの返事: 4       
  5番目 正解: Buzz     Eさんの返事: Buzz    
  6番目 正解: Fizz     Aさんの返事: Fizz    
  7番目 正解: 7        Bさんの返事: 7       
  8番目 正解: 8        Cさんの返事: 8       
  9番目 正解: Fizz     Dさんの返事: Fizz    
 10番目 正解: Buzz     Eさんの返事: Buzz    
 11番目 正解: 11       Aさんの返事: 11      
 12番目 正解: Fizz     Bさんの返事: Fizz    
 13番目 正解: 13       Cさんの返事: 13      
 14番目 正解: 14       Dさんの返事: 14      
 15番目 正解: FizzBuzz Eさんの返事: FizzBuzz
 16番目 正解: 16       Aさんの返事: 16      
 17番目 正解: 17       Bさんの返事: 17      
 18番目 正解: Fizz     Cさんの返事: Fizz    
 19番目 正解: 19       Dさんの返事: 19      
 20番目 正解: Buzz     Eさんの返事: Buzz    
 21番目 正解: Fizz     Aさんの返事: Buzz     退場です
残り: B C D E 
 22番目 正解: 22       Bさんの返事: 22      
 23番目 正解: 23       Cさんの返事: 23      
 24番目 正解: Fizz     Dさんの返事: Fizz    
 25番目 正解: Buzz     Eさんの返事: Buzz    
 26番目 正解: 26       Bさんの返事: 26      
 27番目 正解: Fizz     Cさんの返事: Fizz    
 28番目 正解: 28       Dさんの返事: 28      
 29番目 正解: 29       Eさんの返事: 29      
 30番目 正解: FizzBuzz Bさんの返事: FizzBuzz
 31番目 正解: 31       Cさんの返事: 31      
 32番目 正解: 32       Dさんの返事: 32      
 33番目 正解: Fizz     Eさんの返事: Fizz    
 34番目 正解: 34       Bさんの返事: 34      
 35番目 正解: Buzz     Cさんの返事: Buzz    
 36番目 正解: Fizz     Dさんの返事: Fizz    
 37番目 正解: 37       Eさんの返事: 37      
 38番目 正解: 38       Bさんの返事: 38      
 39番目 正解: Fizz     Cさんの返事: Fizz    
 40番目 正解: Buzz     Dさんの返事: Buzz    
 41番目 正解: 41       Eさんの返事: FizzBuzz 退場です
残り: B C D 
 42番目 正解: Fizz     Bさんの返事: Fizz    
 43番目 正解: 43       Cさんの返事: 43      
 44番目 正解: 44       Dさんの返事: 44      
 45番目 正解: FizzBuzz Bさんの返事: Buzz     退場です
残り: C D 
 46番目 正解: 46       Cさんの返事: 46      
 47番目 正解: 47       Dさんの返事: 47      
 48番目 正解: Fizz     Cさんの返事: FizzBuzz 退場です
勝者: D

上記ではDさんが勝ちましたが、実行するごとに結果は変わります。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7