Experiments Never Fail

C# で Reactive PPAP

エンジニア立ち居振舞いには乗らないが、こういうのには乗ってしまうw

C# と Reactice Extension で。以前の をちょっと改造しただけだが。

//PPAPClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using System.Threading.Tasks;
using System.Reactive.Threading.Tasks;

namespace PPAPConsole
{
class PPAPClass
{
public static void Main(string[] args)
{
var random = new Random();
var FIN = "Pen-Pineapple-Apple-Pen";
var PPAP = new string[] { "ペン", "パイナッポー", "アッポー", "ペン" };
var WORDS = new string[] { "ペン", "パイナッポー", "アッポー" };

var ppapObservable = Observable.Interval(TimeSpan.FromMilliseconds(100))
.Select(_ => WORDS[random.Next(WORDS.Length)]) // ランダムに
.Buffer(PPAP.Length, 1) // 要素数4のBufferを1ずつズラしてく
.SelectMany(queue => queue.SequenceEqual(PPAP) ? // パターンと一致したら…
Observable.Concat(
Observable.Return(queue.Last()), // Queueの最後
Observable.Return(string.Empty)) : // + 空文字(終了判定用)
Observable.Return(queue.Last()))
.TakeWhile(x => !string.IsNullOrEmpty(x)); // 空文字になるまで繰り返す

Observable.Return("PPAP") // 最初に言うので
.Concat(Task.Delay(TimeSpan.FromMilliseconds(1000)).ToObservable() // なんとなく待つ
.SelectMany(ppapObservable))
.Subscribe(
x => Console.WriteLine(x),
() => Console.WriteLine(FIN));

Console.Read();
}
}
}

結果 #

PPAP
パイナッポー
ペン
ペン
アッポー
ペン
パイナッポー
アッポー
アッポー
アッポー
アッポー
ペン
アッポー
ペン
アッポー
ペン
パイナッポー
アッポー
ペン
Pen-Pineapple-Apple-Pen

apple-pen と pineapple-pen をうまく活かした感じにしたいですね。

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