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 - Erlang

formatでの整数指定がBなのに気がつかず、
ちょっと悩みました。
実数指定はC言語と同じくfなのに…。

1> c(show_bingo).
{ok,show_bingo}
2> show_bingo:bingo(30).
 1  2  3  4  5  6  7  8  9 10
23 19 12 14  2 13 29  7  1 26

11 12 13 14 15 16 17 18 19 20
 4  5 24 20 16  8 22 30  3 17

21 22 23 24 25 26 27 28 29 30
 6  9 18 25 15 21 28 11 27 10
ok
3> show_bingo:bingo(35).
 1  2  3  4  5  6  7  8  9 10
 5  2 21 29 10 33  4  7 20  6

11 12 13 14 15 16 17 18 19 20
34 30  3 16 24 22 23 12 18 14

21 22 23 24 25 26 27 28 29 30
17 28  9 15 26 13 11  8 27  1

31 32 33 34 35
25 35 32 19 31
ok
 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
-module(show_bingo).
-export([bingo/1]).

show_line([X | []], Size) -> io:format("~" ++ Size ++ "B~n", [X]);
show_line([X | XS], Size) ->
    io:format("~" ++ Size ++ "B ", [X]),
    show_line(XS, Size).

column_size(Num) ->
    Max = length(lists:last(io_lib:format("~B", [Num]))),
    lists:last(io_lib:format("~B", [Max])).

bingo_sub(Num) -> bingo_sub(lists:seq(1, Num), Num * Num).

bingo_sub(List, 0) -> List;
bingo_sub(List, Num) ->
    R = lists:nth(random:uniform(length(List)), List),
    bingo_sub([R] ++ [X || X <- List, X =/= R], Num - 1).

bingo(Num) -> bingo(bingo_sub(Num), lists:seq(1, Num), column_size(Num)).

bingo([], _, _) -> true;
bingo(Rnd, Seq, Size) ->
    if
        length(Rnd) > 10 ->
            show_line(lists:sublist(Seq, 10), Size),
            show_line(lists:sublist(Rnd, 10), Size),
            io:nl(),
            bingo(lists:nthtail(10, Rnd), lists:nthtail(10, Seq), Size);
        true ->
            show_line(Seq, Size),
            show_line(Rnd, Size)
    end.

Index

Feed

Other

Link

Pathtraq

loading...