태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

'모스'에 해당되는 글 1건

  1. 2008/04/18 [Anarchy Golf] Morse decode (2)

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바이트로는 택도 없어요 -_-;;

무서운 사람들.. ㄷㄷ

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by leonid