ズンドコキヨシ
こちらの記事に触発されて、自分も書かねば!と思い今更ながら「ズンドコキヨシ」を書いてみました。
1行で書く『「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了』
やりたかったこと
「ズンドコキヨシ」が何をやるプログラムなのかは、先人の記事を見てもらうとわかると思いますので、私なりにやりたかったことを書いてみます。
- RepeatやRangeを使うと繰り返し回数のマジックナンバーが発生するのが嫌
- 無限に「ズン」「ドコ」を生成したい。
- なるべくシーケンスのまま処理したい。
- 無駄に最新C#要素を挟み込みたい。(ワガママ)
- スッキリしたコードにしたい。
- 今回目指すのはワンライナーではない
書いたコード
ズンドコキヨシ-C#7.3-
using System;
using System.Linq;
using System.Collections.Generic;
class Program {
static void Main() =>
Ext.GenerateInfinite(() => Guid.NewGuid().CompareTo(Guid.NewGuid()) > 0 ? "ZUN" : "DOKO")
.Quintuple()
.TakeWhile(t => t != ("ZUN", "ZUN", "ZUN", "ZUN", "DOKO"))
.Select(t => t.w0)
.Append("DOKO")
.Append("KI・YO・SHI!!")
.Select(w => w + " ")
.ToList()
.ForEach(Console.Write);
}
static class Ext {
/// <summary>流れてきたシーケンスをバッファしつつ5-tupleで返す</summary>
public static IEnumerable<(T w4, T w3, T w2, T w1, T w0)> Quintuple<T>(this IEnumerable<T> ts) {
var result = (w4: default(T), w3: default(T), w2: default(T), w1: default(T), w0: default(T));
foreach (var item in ts) {
result = (result.w3, result.w2, result.w1, result.w0, item);
yield return result;
}
}
/// <summary>無限に生み出す</summary>
public static IEnumerable<T> GenerateInfinite<T>(Func<T> generator) {
while (true) {
yield return generator();
}
}
}
工夫した箇所
- LINQ標準メソッドには無限に要素生成するメソッドが無いようなので、
GenerateInfinite(generator)
メソッドを作って、ここで無限に「ズン」「ドコ」するようにした。 - シーケンスを流したままZUNx4DOKO判定をしたかったので、元のシーケンスを五つ組シーケンスに変換する
Quintuple()
拡張メソッドを作ることにした。 - 五つ組の比較(Tuple比較)をやりたかった。(C#7.3)
- 表示の直前までシーケンスのまま処理した。
まとめ
自分なりのコダワリを出すことは出来たような気がします。
こういった実験的なコードを書くのは楽しいですね!