[CodeGolf] saving-time 공부이야기

얼마 전 KLDP에 새로 올라온 코드 골프 문제를 소개하는 글이 올라왔었습니다. 저는 쭉 C 언어 하나만 사용해왔는데, 이런 장난감 문제들은 C로 풀려고 하면 얼마나 귀찮은지... 그런 핑계를 대면서 풀어볼 생각도 하지 않았었어요.

이번 다음 DevDay 참석을 위해 루비를 급열공했었는데. 루비라는 언어가 얼마나 이쁘고 착하던지 쏙 반해버렸거든요. 그래서 루비로 한 번 풀어보기로 결심!

시간을 입력 받아서 출력으로 아날로그 시계를 표시하는 문제였습니다. (윗 링크 참고)

clock = [[1, 4, 12, 0],
[2, 3, 11, 55],
[2, 5, 1, 5],
[3, 2, 10, 50],
[3, 6, 2, 10],
[4, 1, 9, 45],
[4, 7, 3, 15],
[5, 2, 8, 40],
[5, 6, 4, 20],
[6, 3, 7, 35],
[6, 5, 5, 25],
[7, 4, 6, 30]]

hour, min = gets.strip.split(':').map { | i | i.sub(/^0/, '').to_i }

if hour > 12
hour -= 12
end

if min % 5
min = min - (min % 5)
end

puts "#{hour}:#{min}"

for i in (1..7)
out = " "
clock.each do | y, x, h, m |
if i == y
if hour == h and min == m
out[x-1] = 'x'
elsif hour == h
out[x-1] = 'h'
elsif min == m
out[x-1] = 'm'
else
out[x-1] = 'o'
end
end
end

puts out
end

아날로그 시계를 표시할 방법을 머리 싸매고 고민하다가 그냥 포기하고, 단순무식하게 리스트에 좌표값을 하나씩 때려 넣어서 루프를 돌려서 출력하도록 했습니다. 좀 더 똑똑하게 출력하는 방법이나, 이쁘지 않은 루프나 if 문 대신 좀 더 루비스러운 방법으로 코딩하는 방법을 알고 계시는 분은 좀 알려주세요. (굽신굽신)

예외처리도 하나도 없고, 코드도 엉망이고, 게다가 코드골프 문제는 코드를 최소한으로 줄이는게 목표인데 저는 500바이트까지 줄여보다가 그냥 포기하고 가독성을 위해서 코드를 더 늘려버리는 만행까지 저질렀습니다. ^^;;

좀 시간이 지나고 머리 속이 리셋되면 다시 풀어봐야겠어요.

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://grow.egloos.com/tb/4589144 [도움말]
  • 지아의 생각 2008/09/02 16:27 #

    문제를 푼 건 한참 전이긴 한데 블로그에 루비 코드를 이쁘게 올리려고 하다보니 이제야 포스팅한 [CodeGolf] saving-time... more

덧글

  • 고인현 2008/10/14 17:52 # 삭제 답글

    php 로 191바이트 했는데..1등이 157바이트네요...
    ㅡ.ㅡ; 어찌 해야할지..
  • 지아 2008/10/14 17:56 #

    오오... 가입하시고 파일 올리시면 될 듯 싶은데..
    191바이트면 1등이네요... + _ +
덧글 입력 영역