태터데스크 관리자

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

태터데스크 메시지

저장하였습니다.


http://golf.shinh.org/p.rb?delete+duplicate+lines
 

여러줄의 input을 받고 중복되는 줄(연이어 있지는 않음)들을 지운 후 출력하는 문제입니다.

루비 언어에서는 배열에 |, &, 또는 uniq 라는 메소드를 쓰면 자동적으로 중복을 없애주기 때문에 편하지만

펄 언어에서는 자체적으로 이런 일을 해주는 함수가 없기 때문에 직접 구현해야 합니다.

해쉬를 사용하면 이 문제를 해결 할 수 있습니다.

매 라인을 parse 할 때마다 그 문자열에 해당하는 해쉬값을 변형시키면 해당 라인이 이전에 이미 읽었었던 것인지, 처음 보는 것인지를 알 수 있습니다.

제일 처음 시도 했던 코드는 다음과 같습니다.




eof나 $.를 다루지 않으므로 굳이 while문을 사용할 필요가 없습니다. for문으로 바꿔서 두글자를 절약합니다.




$a{$_}++가 처음 실행될 때는 ++가 후위연산자이므로 아직 값이 0입니다. 그러므로 1> 부분을 없애고 &&를 ||로 바꿔주면 두글자가 더 절약됩니다.




1위 코드는 17바이트인데 아직 갈 길이 멉니다. 혹시나 하고 %a의 선언부분을 없애봤습니다.



잘 작동합니다. -_-;; 인터프리터가 알아서 필요한 해쉬를 만들어놨나봅니다. 혹시나 싶어서 $a에서 이름을 없애봤더니







역시 작동합니다. -_-;;; 어째서 이런 코드가 작동하는지 이해가 가진 않지만 일단 작동하므로 내버려둡시다.

그런데 아직도 20바이트로 세글자를 추가로 줄여야됩니다.

솔직히 여기서 더 줄일 만한 건덕지가 있는지부터 의심스럽지만 포기하지 말고 계속 생각해봅시다.







눈 딱 감고 {} 괄호를 지워봤습니다.




자.. 작동한다!! -_-;;;;;;;;; 뭥미-_-;;; 이런 코드도 가능한거였군요. 역시 펄 대단한 언어입니다.

이제 한글자만 더 줄이면 됩니다.




펄로 골프 문제를 몇번 풀어보고 나서 느낀 것은 항상 최후의 1바이트는 함수가 리턴하는 값을 잘 사용하면 줄일 수 있다는 거였습니다.

위 코드에서 유일한 함수는 print인데, 성공적으로 프린트 하면 true를 리턴시킵니다. true는 곧 1이죠..

그리고 우리는 $$_의 값이 0인지 아닌지만 알면 되므로, 굳이 $$_의 값을 계속 증가시킬 필요가 없습니다.




그리하여 최후의 1바이트를 줄이고 다음과 같은 코드가 가능해집니다.





이로써 최단 17바이트가 완성되었습니다.

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

'Programming > Perl' 카테고리의 다른 글

[Anarchy Golf] Look and say  (2) 2008/09/15
[Anarchy Golf] delete duplicate lines  (0) 2008/08/09
[Anarchy Golf] rotate lines  (1) 2008/08/07
[Anarchy Golf] delete last line  (0) 2008/08/06
Posted by leonid