2007년 05월 05일
다이아몬드 그리기
다이아몬드 그리기
"*"이 찍히는 갯수를 보면 홀수입니다. 1부터 시작하는 N개의 홀수를 돌려주는 함수를 만듭니다.
크기 N인 다이어몬드는 N개의 홀수를 얻고 그것을 반으로 접으면 되겠죠. 가장 큰 홀수는 두 번 나오면 안되니까 한 번은 빼주어야겠네요.
계획은 다 했으니 이제 그리면 됩니다. 우선 가운데로 정렬된 한줄을 그리는 함수가 필요하겠네요. 폭 W의 줄에 N개의 별표를 가운데 정렬하여 그립니다.
이제는 계획한대로 그리면 됩니다.
짜잔~
여친께 바칩니다. ^.^
Sonic Youth의 Diamond Sea
"*"이 찍히는 갯수를 보면 홀수입니다. 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)







☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]