泥庭

2011年2月28日

指リスト

Filed under: Android — タグ: , , — yone64 @ 9:33 PM

週末に、Androidを買いました。
Android端末には画面ロックを解除する方法として、「指リスト」というものがあります。
#全部についてるかどうかは不明

↓こんな感じ
http://d.hatena.ne.jp/hironao24/20101129

で、やっぱりこういうのを見ると全部で何パターンあるか気になります。
というわけで、検索してみるとYAHOO!知恵袋に質問と回答が載ってました。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1253948747

全部で、389112通りだそうです。でも、せっかくなので自分でもプログラムを書いてみました。
もちろん(?)Linqで。

var c = Enumerable.Range(4, 6)
        .SelectMany(len => Enumerable.Range(1, len)
            .Select(_ => Enumerable.Range(1, 9))
            .Aggregate(Enumerable.Repeat(Enumerable.Empty<int>(), 1),
                    (ac, et) => ac.Select(a => new { AC = a, Last = a.LastOrDefault() })
                        .SelectMany(a => et.Where(t => !a.AC.Contains(t) &&
                        !(a.Last + t == 10 && !a.AC.Contains(5)) &&
                        !((a.Last == 1 || t == 1) && (a.Last + t == 4 || a.Last + t == 8 ) && !a.AC.Contains((a.Last + t) / 2)) &&
                        !((a.Last == 9 || t == 9) && (a.Last + t == 12 || a.Last + t == 16) && !a.AC.Contains((a.Last + t) / 2))
                        ).Select(t => a.AC.Concat(Enumerable.Repeat(t, 1)))))).Count();

Linqで順列生成ロジックは、↓を参考にさせていただきました。

http://d.hatena.ne.jp/taguo/20080722/1216745650

パフォーマンスはいまいちかも。

1件のコメント »

  1. […] なら、どうだろう。可能性はあるかもしれない。というわけで、チャレンジです。 前回、小町数を作成した時はAggregateを使ったんですが、今回はneueさんの記事を参考に作ってみました。 覆面算なら、こっちのほうがわかりやすいですね。 […]

    ピンバック by C# Advent Calendar で 覆面算 « 泥庭 — 2011年12月22日 @ 1:33 AM


RSS feed for comments on this post. TrackBack URI

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

WordPress.com Blog.

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