다이아몬드 그리기

다이아몬드 그리기

"*"이 찍히는 갯수를 보면 홀수입니다. 1부터 시작하는 N개의 홀수를 돌려주는 함수를 만듭니다.

odds(N) ->
odds(N * 2 - 1, []).

odds(1, Acc) ->
[1|Acc];
odds(I, Acc) ->
odds(I - 2, [I|Acc]).

odds_test_() ->
[?_assertMatch([1], odds(1)),
?_assertMatch([1,3], odds(2))].


크기 N인 다이어몬드는 N개의 홀수를 얻고 그것을 반으로 접으면 되겠죠. 가장 큰 홀수는 두 번 나오면 안되니까 한 번은 빼주어야겠네요.

plan(N) ->
Top = odds(N),
[Width|Bottom] = lists:reverse(Top),
{Width, Top ++ Bottom}.

plan_test_() ->
[?_assertMatch({3, [1,3,1]}, plan(2)),
?_assertMatch({5, [1,3,5,3,1]}, plan(3))].


계획은 다 했으니 이제 그리면 됩니다. 우선 가운데로 정렬된 한줄을 그리는 함수가 필요하겠네요. 폭 W의 줄에 N개의 별표를 가운데 정렬하여 그립니다.

draw_line(N, W) ->
Space = lists:duplicate((W - N) div 2, $ ),
Space ++ lists:duplicate(N, $*) ++ Space.

draw_line_test_() ->
[?_assertMatch("*", draw_line(1, 1)),
?_assertMatch(" * ", draw_line(1, 3)),
?_assertMatch(" *** ", draw_line(3, 7))].


이제는 계획한대로 그리면 됩니다.

draw(Size) ->
{Width, Design} = plan(Size),
lists:map(fun(N) -> draw_line(N, Width) end, Design).

draw_on_console(Size) ->
lists:foreach(fun(Line) -> io:format("~s~n", [Line]) end, draw(Size)).


짜잔~

20> diamond:draw_on_console(5).
*
***
*****
*******
*********
*******
*****
***
*
ok


여친께 바칩니다. ^.^

Sonic Youth의 Diamond Sea

by 만성피로 | 2007/05/05 13:43 | Erlang | 트랙백 | 덧글(0)

트랙백 주소 : http://colus.egloos.com/tb/3376757
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶