ズンドコキヨシ
こちらの記事が面白かったので僕もチェレンジしてみました。
元ネタはこちらだそうです。
Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
— てくも (@kumiromilk) 2016年3月9日
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
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
を使わないと遅くならないかな?と考えましたが「ズンズンズンズンドコ」が現れる確率が高いので速度は気になりませんでした。