challenge ビンゴの結果を整形表示

重複無し乱数」の続編です。

「重複無し乱数」で作った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

Posted feedbacks - C++

bcc32とg++で確認。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdlib>

#ifdef _WIN32
# include <windows.h>
# define seed() ::GetCurrentTime()
#else
# include <ctime>
# define seed() std::time(NULL)
#endif

struct RandomGenerator
{
    RandomGenerator()
    {
        std::srand(static_cast<unsigned>(seed()));
    }

    int operator()(int n) const
    {
        const int i = static_cast<int>(static_cast<double>(std::rand()) * n / RAND_MAX);

        return std::max(0, std::min(i, n - 1));
    }
};

std::vector<size_t> create_bingo(size_t n)
{
    std::vector<size_t> v;

    for (size_t i = 0; i < n; ++i)
    {
        v.push_back(i);
    }

    static RandomGenerator gen;

    std::random_shuffle(v.begin(), v.end(), gen);

    return v;
}

void output(size_t value, size_t width)
{
    std::cout.width(width);

    std::cout << value;
}

size_t calculate_width(size_t value)
{
    size_t width = 1;

    for (; value >= 10; value /= 10)
    {
        ++width;
    }

    return width;
}

void bingo(size_t n)
{
    const std::vector<size_t> v = create_bingo(n);

    const size_t width = calculate_width(n) + 1;

    const size_t unit = 10;

    for (size_t beg = 0; beg < v.size(); beg += unit)
    {
        const size_t end = std::min(beg + unit, v.size());

        for (size_t i = beg; i < end; ++i)
        {
            output(i + 1, width);
        }

        std::cout << std::endl;

        for (size_t i = beg; i < end; ++i)
        {
            output(v[i], width);
        }

        std::cout << std::endl << std::endl;
    }
}

int main()
{
    bingo(30);
    bingo(35);
}

Index

Feed

Other

Link

Pathtraq

loading...