ひでぼ~blog

C#ときどきゲーム

「あいうえお表」を作れ (制限時間 : 10 分)をやってみた

先日こちらのイベントで出題された問題を自分でもやってみました。

togetter.com

次のようなあいうえおの文字列を加工して、

const string aiueo = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもや ゆ よらりるれろわ   をん";

最終的に次のようなあいうえお表をコンソールに表示させろという問題です。

んわらやまはなたさかあ
  り みひにちしきい
  るゆむふぬつすくう
  れ めへねてせけえ
 をろよもほのとそこお

Chunkで5文字ずつ切り出してみる

Chunkで5文字ずつの文字列の塊に切り出して出力したら良い感じになりそうだったので、とりあえずやってみました。

const string aiueo = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもや ゆ よらりるれろわ   をん";

var chunked = aiueo.Chunk(5);

foreach (var text in chunked)
{
    Console.WriteLine(text);
}

次のような結果になりました。それっぽいものは表示されましたが、正解とは向きが少し違います。この表を右に90度回転させたら正解になりそうです。

あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
はひふへほ
まみむめも
や ゆ よ
らりるれろ
わ   を
ん

最終的にこうなった

ChunkとReverseして得られた結果の1文字目目~5文字目をそれぞれ結合しました。マジックナンバーごりごりに使って少しイマイチな気がしますがそこそこシンプルに書けたんじゃないか感があります。

const string aiueo = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもや ゆ よらりるれろわ   をん";

var chunked = aiueo.Chunk(5).Reverse();
var row1 = chunked.Select(text => text.Length < 1 ? ' ' : text[0]).ToArray();
var row2 = chunked.Select(text => text.Length < 2 ? ' ' : text[1]).ToArray();
var row3 = chunked.Select(text => text.Length < 3 ? ' ' : text[2]).ToArray();
var row4 = chunked.Select(text => text.Length < 4 ? ' ' : text[3]).ToArray();
var row5 = chunked.Select(text => text.Length < 5 ? ' ' : text[4]).ToArray();

Console.WriteLine(row1);
Console.WriteLine(row2);
Console.WriteLine(row3);
Console.WriteLine(row4);
Console.WriteLine(row5);

ちなみに20分くらいかかりました。これを10分で解答できるMVPの皆さんはすごいですね。

参考

blog.xin9le.net