LoginSignup
2
1

More than 5 years have passed since last update.

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

Posted at

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

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

特徴

  • 表題通り逐次出力。
    「ズン」「ドコ」のどちらになるか確定するたびにコンソール出力を実行。つまり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!!」と言ってくれました。:wink:

2
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
2
1