Reverse Bits FIXED
코드 골프는 어떤 문제를 가장 짧게 짜는 것을 다투는 대회입니다. 아나키 골프는 여러 언어를 지원하는 골프 사이트로 유명합니다. 이 사이트에서 기간이 초과된 문제를 하나씩 다루어보려 합니다.
펄 언어에 익숙하지 못한 사람이 많기 때문에 아예 모른다고 생각하고 하나씩 설명하겠습니다. 아마 리눅스/유닉스에는 펄이 깔려있을테고 윈도우 환경에서는 스트로베리 펄을 이용하시면 됩니다. 확장자는 .pl인데 텍스트 에디터에서 파일명을 test.pl 정도로 해주시면 됩니다.
오늘은 Reverse Bits FIXED 문제입니다.
비트를 역으로 바꾸는게 문제입니다. 모범 답안은 아래와 같네요.
print pack"b*",unpack"B*",<>
하나 씩 풀어봅시다.
처음은 print네요. 이건 제일 쉽습니다. Hello, Dalinaum!을 출력하기 위해서는 아래의 한줄이면 됩니다.
print "Hello, Dalinaum!"
제일 뒤에 세미콜론은 붙여도 되고 안 붙여도 됩니다. 쿨하죠?
실행시켜 볼려면 해당 파일을 test.pl등으로 저장하셔서 아래와 같이 해도 됩니다.
perl test.pl
아니면 이렇게도 됩니다.
perl
print "Hello, Dalinaum!"
커맨드라인에서 저렇게 입력하신 다음에 대부분의 환경에선 C-D(콘트롤을 C-라고 얘기하겠습니다.)를 누르면 되고요. 윈도우에선 C-Z를 누르시면 됩니다.
파일로 저장하지 않고 간단히 테스트해볼 수 있는 거죠.
아니면 이렇게 해도 됩니다.
perl -e 'print "Hello, Dalinaum!"'
이제 한줄로도 수행할 수 있네요. 윈도우에서는 -e 뒤에 작은 따옴표(‘)를 쓸 수 없는데요. 그래서 큰 따옴표(“)를 써야합니다.
perl -e "print \"Hello, Dalinaum!\""
\"는 무엇을 의미하시는 지 아시겠지만, 노파심에 다시 얘기해드리자면 문자열 안에 '"를 쓰면 문자열이 종료가 되기 때문에 \"로 표기해야하는 것입니다.
그럼 pack"b*",unpack"B*",<>는 어떻게 봐야할까요? 저 명령은 사실은 아래와 같습니다.
pack ("b*", unpack("B*",<>))
펄은 내장 함수에서 괄호를 생략할 수 있습니다. (조금 혼란스러울 수도 있는 부분이긴 합니다.) pack과 unpack이 보이고 인자들이 보이네요. 여기에서 <>는 무엇일까요?
perl -e "print <>"
이렇게 입력하시면 사용자 입력을 기다리고 있습니다. nice라고 입력하고 C-D(윈도우에선 C-Z)를 입력하면 화면에 nice라고 출력됩니다. 표준 입력이 <>로 들어갑니다.
이제 unpack("B*", <>)는 표준 입력을 두번째 인자로 삼아서 unpack을 호출하는 것이란 것을 알았습니다.
아래와 같이 입렵해봅시다.
perl -e "print unpack'B*','A""
01000001이 출력되네요. 65입니다. unpack에 B*를 넣어주면 우리가 표기하는 2진수의 형태로 출력하고 있습니다. B뒤에 붙어 있는 *는 처리할 데이터의 단위입니다. 아래와 같이 하시면 4비트만 처리해줍니다.
perl -e "print unpack'B4','A""
‘b*’를 입력하면 비트가 역순으로 나타나게됩니다.
perl -e "print unpack'b*','A""
풀어주는 함수(unpack)가 있으면 묶어주는 함수(pack)도 있겠죠.
perl -e "print pack'b*','01000010'"
pack과 unpack에서 같은 서로 같이 b*나 B*를 쓴다면 상호 변환할 수 있습니다. 그런데 서로 다른 것을 쓴다면? 비트가 역순으로 뒤집히게 되겠죠.
print pack"b*",unpack"B*",<>
위의 한줄은 정순서대로 비트열로 풀고 역순대로 비트를 묶어내는 거죠.
참 쉽죠?