1行で書く『「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了』


ズンドコキヨシ

こちらの記事が面白かったので僕もチェレンジしてみました。

ズンドコキヨシをLINQでゴリ押してみる

元ネタはこちらだそうです。

C#でやってみることにします。
LINQを使ってワンライナーで書くことチャレンジしてみました。

実行結果

成果物はこちらです。

1行ズンドコ
Console.WriteLine(Enumerable.Range(0, 1000).Select(x => new[] { "ZUN", "DOKO" }.OrderBy(_ => Guid.NewGuid()).First()).Aggregate((acc, cur) => acc.EndsWith("KI・YO・SHI!!") ? acc + "" : acc.EndsWith("ZUN ZUN ZUN ZUN DOKO") ? $"{acc} KI・YO・SHI!!" : $"{acc} {cur}"));

分かりやすく改行すると以下のようになります。

Console.WriteLine(Enumerable
    .Range(0, 1000)
    .Select(x => new[] { "ZUN", "DOKO" }
        .OrderBy(_ => Guid.NewGuid()).First())
    .Aggregate((acc, cur) =>
        acc.EndsWith("KI・YO・SHI!!")
            ? acc + ""
            : acc.EndsWith("ZUN ZUN ZUN ZUN DOKO")
                ? $"{acc} KI・YO・SHI!!"
                : $"{acc} {cur}"));

Guid.NewGuidで並び替え、最初の要素を取得することで、
ランダムに「ズン」「ドコ」を取得できるようにしました。

Enumerable.Range(0, 1000)モヤっとしますが、
「ズンズンズンズンドコ」が現れる確率が2 x 2 x 2 x 2 x 2の 32 分の 1 なので十分かなと...
Linq のAnyとか使えば「キ・ヨ・シ」で処理中断できるから綺麗そう、、、?

Aggregateの畳み込みをする際にStringbuilderを使わないと遅くならないかな?と考えましたが「ズンズンズンズンドコ」が現れる確率が高いので速度は気になりませんでした。