C# と Reactive Extensions でズンドコキヨシ

流行り?に乗っていくスタイル。

//Zondoko.cs
var random = new Random();
var K = "キ・ヨ・シ!";
var PATTERN = new string[] { "ずん", "ずん", "ずん", "ずん", "どこ" };

Observable.Interval(TimeSpan.FromMilliseconds(100))
    .Select(_ => (random.Next() % 2 == 0) ? "ずん" : "どこ") // ランダムに ずんorどこ
    .Scan(new List<string>(), (queue, x) => // 最大5つのQueueに貯める
        {
            queue.Add(x);
            while (queue.Count > PATTERN.Count) { queue.RemoveAt(0);}
            return queue;
        })
    .SelectMany(queue => queue.SequenceEqual(PATTERN) ? // パターンと一致したら…
        Observable.Concat(
            Observable.Return(queue.Last()),   // Queueの最後
            Observable.Return(K),              // + キ・ヨ・シ!
            Observable.Return(string.Empty)) : // + 空文字(終了判定用)
        Observable.Return(queue.Last()))
    .TakeWhile(x => !string.IsNullOrEmpty(x))  // 空文字になるまで繰り返す
    .Subscribe(
        x => Console.WriteLine(x),
        () => Console.WriteLine("complete!!"));

どこ

どこ ずん ずん ずん どこ どこ どこ ずん どこ ずん ずん ずん ずん どこ キ・ヨ・シ! complete!!

SelectMany に頼ってるのが気に入らない。。。