LoginSignup
1
1

More than 5 years have passed since last update.

C# で Reactive PPAP

Posted at

エンジニア立ち居振舞いには乗らないが、こういうのには乗ってしまう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 をうまく活かした感じにしたいですね。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1