泥庭

2013年9月25日

ナムドット問題に挑戦

Filed under: .NET, LINQ — タグ: , — yone64 @ 2:43 AM

CodeIQの問題にチャレンジしたので、記録。
https://codeiq.jp/ace/yuki_hiroshi/q468

この問題では、1~5の数字をグループ分けする全パターンが、とある順で並んでいます。

グループ分けの全パターンを網羅する場合、数字が1だけならば、1パターンしかありません。
ここに2を追加する場合、1と同じグループに入れるか、新しいグループにするかで2パターンできます

12      ← 1と同じグループに追加
1.2     ← 2を新しいグループとして追加

同様に3を追加する場合は、以下のようになります。

123    ← 12の第1グループに3を追加
12.3   ← 12の新しいグループとして3を追加
13.2   ← 1.2の第1グループとして3を追加
1.23   ← 1.2の第2グループとして3を追加
1.2.3  ← 1.2の新しいグループとして3を追加

同様に、4・5を追加すると解答になります。

これをLINQで書くと、こんな感じ。

var es = Enumerable.Repeat(Enumerable.Empty<string>(), 1);

var qq = Enumerable.Range(1, 5).Aggregate(es, (bs, ii) =>
            bs.SelectMany(s => Enumerable.Repeat(s, s.Count())
            .Select((ss, i) => ss.Select((m, i2) => (i == i2) ? m + ii : m))
            .Concat(new[] { s.Concat(new[] { ii.ToString() }) })));

foreach (var item in qq)
{
    Console.WriteLine(string.Join(".", item));
}

ConcatメソッドがIEnumerable<T>を引数に取るものしかないので、ちょっと記述が面倒ですねぇ。

広告

コメントする »

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

WordPress.com で無料サイトやブログを作成.

%d人のブロガーが「いいね」をつけました。