2014年12月17日

C#でn個の数値を10個ずつ折り返して表示

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その57

この問題のオリジナルタイトルは、、「ビンゴの結果を整形表示」です。

■問題 (出題者:raynstard さん)
「重複無し乱数」の続編です。 「重複無し乱数」で作ったbingo関数の結果を下のように「何番目の乱数か」と セットにして10個ずつ折り返して表示するコードを書いてください。

>>> bingo(30)
 1  2  3  4  5  6  7  8  9 10
29 14 16 13 30 15 22 11 25  9

11 12 13 14 15 16 17 18 19 20
23  4 18  5 28 17  8 12 21 20

21 22 23 24 25 26 27 28 29 30
26  6  2 19  1  7 10 27  3 24

>>> bingo(35)
 1  2  3  4  5  6  7  8  9 10
 7 15  3 32  1 16 17 28  6 29

11 12 13 14 15 16 17 18 19 20
19 23 30 26 20  5 12  2 25 31

21 22 23 24 25 26 27 28 29 30
35 13 24 18 11  8 10 34 22 21

31 32 33 34 35
 9  4 27 33 14



前回作成した Bingoクラスに、Printメソッドを追加しました。
表示する個数が100を超えても、数字がくっつかないように工夫しています。 それ以外は、いたって普通のコードです。特に説明するまでもないかと。

using System;
using System.Collections.Generic;
using System.Linq;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            var result = Bingo.Create(9);
            Bingo.Print(result);
            Console.ReadLine();
        }
    }

    static class Bingo {
        // シャッフル拡張メソッド : Fisher-Yates shuffle アルゴリズムを採用
        public static IEnumerable<int> Create(int n) {
            return Enumerable.Range(1, n).Shuffle();
        }

        // これが新たに追加したメソッド
        public static void Print(IEnumerable<int> list) {
            string head = "";
            string data = "";
            // listの個数によって、幅を調整している。
            string format = string.Format("{{0,{0}}}", (int)(Math.Log10(list.Count()) + 2));
            int i = 1;
            foreach (var val in list) {
                head += string.Format(format, i);
                data += string.Format(format, val);
                if (i++ % 10 == 0) {
                    Print10(head, data);
                    head = "";
                    data = "";
                }
            }
            if (head.Length > 0)
                Print10(head, data);
        }

        private static void Print10(string head, string data) {
            Console.WriteLine(head);
            Console.WriteLine(data);
            Console.WriteLine();
        }


    }

    static class IEnumerableExtentions {
        static Random rnd = new Random();
        // シャッフル拡張メソッド : Fisher-Yates shuffle アルゴリズムを採用
        public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> list) {
            T[] result = list.ToArray();
            for (int i = result.Length - 1; i > 1; i--) {
                int j = rnd.Next(0, i);
                T a = result[i];
                result[i] = result[j];
                result[j] = a;
            }
            return result;
        }       
    }
}


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52392862