http://golf.shinh.org/p.rb?Morse+decode
이번 문제에서는 input으로 모스부호가 들어오면 이걸 해석하여 문장을 출력해야 합니다.
이 문제의 경우, 짧은 신호는 '.', 긴 신호는 '-', 띄어쓰기는 ' ', 글자마다의 구분은 '/' 으로 되어있습니다.
예를 들어, input 으로
가 들어오면
를 출력하면 됩니다.
문제의 요지는 크게 두가지로 나뉩니다.
1) input에서 /를 기준으로 글자들과 띄어쓰기를 분리해내기.
2) a에서 z까지, 그리고 쉼표와 마침표에 해당하는 모스 부호를 맵핑하기.
1번의 경우, 정규표현식을 사용하면 간단합니다.
모스부호는 .과 -로만 이루어져있고, 띄어쓰기는 스페이스 하나 이므로
로 표현할 수 있습니다. /는 위 정규식에 매치되지 않기 때문에 자연스럽게 걸러집니다.
문제는 모스코드를 맵핑하는 방법인데요, 일단 제일 먼저 머릿속에 떠오른 방법은 해시테이블을 사용하는겁니다.
이렇게 해서 나온 최종 코드는 다음과 같습니다.
아주 잘 동작하기는 하지만 무려 480바이트로 너무 깁니다, 저걸 줄인다고 그렇게 큰 성과가 나올것 같지도 않습니다.
두번째로 생각한 방법은 gsub를 사용해서 모스부호를 글자로 고치고, /를 지워버린 후 출력하는 방법인데요
대략 이런 식의 코드가 나왔습니다.
388바이트. 아까보다는 훨씬 줄었지만, 이걸 eval과 array.join 을 적절히 사용하여 줄여본다 해도 200바이트 미만으로 내려가기는 힘들 것 같습니다.
세번째로 생각한 방법은 .를 0으로, -를 1로 고친 후 맨 앞자리에 1을 붙여서 나온 이진수를 index로 사용하여
a~z, 쉼표, 마침표, 띄어쓰기가 들어간 문자열상수로부터 해당 글자의 아스키 코드를 골라낸 다음 putc 함수로 출력하는 방법이었습니다.
다음과 같이, 각 글자들은 그 글자를 나타내는 모스부호를 적절히 변환하여 하나의 숫자로 표현할 수 있습니다.
그런데, 자세히 보시면 이 숫자들 중에 겹치는 수는 단 하나도 없으며, 단 두개의 숫자를 제외한 모든 수가 30보다 작다는 것을 알 수 있습니다. 보기 쉽게 정렬하면 다음과 같이 됩니다.
이러한 원리를 이용하여 86바이트까지 줄일 수 있었고, 현재 공동 1위에 올라있습니다
그래도 아직 종료시각 까지 25일이나 남아서 누군가가 이 기록을 깰 가능성이 크기 때문에 장담은 못하겠습니다. -_-;
세번째 방법으로 작성한 코드는 경기 종료 후 공개하겠습니다. ㅎㅎ
=================
아악 벌써 순위 뒤편으로 밀려나버렸네요 -_-; 86바이트로는 택도 없어요 -_-;;
무서운 사람들.. ㄷㄷ
'Programming > Ruby' 카테고리의 다른 글
| [Anarchy Golf] Morse decode (2) | 2008/04/18 |
|---|---|
| Ruby로 짜본 간단한 369게임 (2) | 2008/04/08 |
| [Golf] るびまゴルフ 【第 3 回】38 bytes (0) | 2008/04/04 |
| [Golf] るびまゴルフ 【第 3 回】42 bytes (0) | 2008/03/31 |
| 루비 프로그램을 하나의 exe 파일로 바꾸기 (0) | 2008/03/31 |
| 테스트 주도 개발로 "숫자 세자리 마다 콤마 찍는 프로그램" 코딩하기 (2) | 2008/03/19 |



