はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】FizzBuzz問題のイカした解答を考えてみる

はじめに

今回はFizzBuzz問題についての記事になります!

そもそもFizzBuzz問題とはどんなものか一応説明しておくと、こんな感じ。

プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。

Fizz Buzz - Wikipedia


これはプログラミング上での遊びだと思っていたのですが、一応パーティーゲームらしいです。

早速みていきましょう。

コード

ネットサーフィンをしていたらこのような記事を見つけました。
qiita.com

これをみた時はあまりの素晴らしさにビックリしてしまいました。

ただ私的にはルールを追加するときにメソッドチェーンにした方がより使いやすいFizzBuzzになる気がしたので(Unityだと結構メソッドチューンを使った記法を多様する)、少し改良をしてみました。

public class FizzBuzz
{
    public class Rule
    {
        public Func<int, bool> Condition { get; }
        public string Value { get; }

        public Rule(Func<int, bool> condition, string value)
        {
            Condition = condition;
            Value = value;
        }
    }

    private List<Rule> rules;

    public FizzBuzz()
        => rules = new List<Rule>();

    public void Excute(int start, int stop, Action<string> action)
    {
        for (int i = start; i <= stop; i++) action(GetText(i));
    }

    public FizzBuzz AddRule(Func<int, bool> condition, string value)
    {
        rules.Add(new FizzBuzz.Rule(condition, value));
        return this;
    }

    private string GetText(int n)
    {
        var s = rules.Aggregate("", (a, rule) => rule.Condition(n) ? a + rule.Value : a);
        return (string.IsNullOrEmpty(s)) ? n.ToString() : s;
    } 
}


メソッドチェーンとかカッコいい名前がついていますが、ただ自分自身のインスタンスを返すだけです。

使い方はこんな感じ。

static void Main(string[] args)
{
    var fb = new FizzBuzz();
    fb.AddRule(n => n % 3 == 0, "Fizz")
        .AddRule(n => n % 5 == 0, "Buzz")
        .Excute(1, 100, Console.WriteLine);
}
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
・
・
・

さいごに

こういう時はインスタンスを作成する静的メソッドなんかも用意した方がより使いやすいんですかね。

今回はしませんでしたが、付け足しても良かったのかもしれません。

ではまた。