Experiments Never Fail

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

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

Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた

— てくも (@kumiromilk) 2016年3月9日
//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 に頼ってるのが気に入らない。。。

published at tags: C# ReactiveX ズンドコキヨシ .NET ReactiveExtensions