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바이트가 완성되었습니다.
'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 |



