LoginSignup
17
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-10

ズンドコキヨシ

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

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

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

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

実行結果

carbon (1).png

成果物はこちらです。

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を使わないと遅くならないかな?と考えましたが「ズンズンズンズンドコ」が現れる確率が高いので速度は気になりませんでした。

17
6
5

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
17
6