ズンドコキヨシ(逐次出力版)


「ズンドコキヨシ」について

は以下のリンクを参照(手抜き)

特徴

  • 表題通り逐次出力。
    「ズン」「ドコ」のどちらになるか確定するたびにコンソール出力を実行。つまりToArrayやStringBuilderは使えない。
  • ソースデータとして円周率の文字列を使用。
    乱数作るのめんどくさいから。
  • マッチング判定には履歴バッファを使用。
    LINQで書こうとすると一番めんどくさい箇所なので楽な方法に逃げた。
    こうした方がわかりやすい流れになるし、実行効率もよかったりする。
  • たぶん比較的わかりやすいコード
    あまり特筆できることがないので円周率持ち出した
逐次出力ズンドコ
static void Main(string[] args)
{
  var matchingSequence = new[] { "ZUN", "ZUN", "ZUN", "ZUN", "DOKO" };
  var historyBuffer = new Queue<string>();

  "3.1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 5923078164 0628620899 8628034825 3421170679"//ソース文字列(円周率)
    .Where(c => char.IsDigit(c))  //数字以外の文字を除外
    .Select(degit => "02468".Contains(degit) ? "ZUN" : "DOKO")  //偶数ならZUN、奇数ならDOKO
    .All(word =>
    {
      Console.Write(word + " ");//単語を出力

      historyBuffer.Enqueue(word);//履歴に追加
      while (historyBuffer.Count > matchingSequence.Length)
      { historyBuffer.Dequeue(); }//古い履歴を捨てる(判定に必要なのは直近5ワードのみ)

      if (historyBuffer.SequenceEqual(matchingSequence))
      {//ZUN ZUN ZUN ZUN DOKO なら
        Console.WriteLine("KI・YO・SHI!!");//KI・YO・SHI!!と叫んで改行
        return false;//ここをコメントアウトするとデータが尽きるまでズンドコ言い続ける
      }
      return true;
    });
}

結果

小数点以下100桁の円周率をソース文字列にして「KI・YO・SHI!!」の後も中断せず最後まで実行すると、四回「KI・YO・SHI!!」と言ってくれました。