はじめに
今回はFizzBuzz問題についての記事になります!
そもそもFizzBuzz問題
とはどんなものか一応説明しておくと、こんな感じ。
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。
これはプログラミング上での遊びだと思っていたのですが、一応パーティーゲームらしいです。
早速みていきましょう。
コード
ネットサーフィンをしていたらこのような記事を見つけました。
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 ・ ・ ・
さいごに
こういう時はインスタンスを作成する静的メソッドなんかも用意した方がより使いやすいんですかね。
今回はしませんでしたが、付け足しても良かったのかもしれません。
ではまた。