클레오파시의 차세대 순열 프로세서
시간 제한1초메모리 제한512 MB
26개의 레지스터와 비트 연산 명령만 있는 프로세서에서 64비트 값 A를 같은 1 비트 개수를 가진 다음으로 큰 값으로 바꾸는 300개 미만 명령의 프로그램을 작성한다.
문제
과학자를 꿈꾸는 클레오파시는 최근 새 프로세서를 개발했다. 이 프로세서에는 A부터 Z까지 이름이 붙은 26개의 레지스터가 있다. 각 레지스터는 64비트 부호 없는 정수 변수다.
이 프로세서는 놀랄 만큼 단순하다. 아래 표에 명시된 명령어만 지원한다. (모든 명령어에서 R은 레지스터의 이름이고, X는 레지스터의 이름이거나 64비트 부호 없는 정수 상수다.)
참고:
- not을 제외한 모든 명령어에서 두 번째 인자가 레지스터 이름이면, 그 레지스터의 내용은 변하지 않는다.
- shl이나 shr을 0이 아닌 두 번째 인자로 호출하면, 첫 번째 인자의 시프트된 값은 0으로 채워진다. 따라서 두 번째 인자가 64 이상이면 첫 번째 인자와 관계없이 결과는 항상 0이다.
예시 과제:
레지스터 A에 0과 15 사이의 임의의 입력 숫자가 들어 있고, 나머지 레지스터는 모두 0이라고 하자. A에 설정된 비트 수가 홀수이면 Z를 1로, 그렇지 않으면 0으로 설정하는 프로그램을 작성하시오.
고난도 과제:
레지스터 A에 임의의 입력 숫자가 들어 있고, 나머지 레지스터는 모두 0이라고 하자. 레지스터 A의 값을 같은 수의 설정된 비트를 가진 다음으로 큰 값으로 바꾸는 프로그램을 작성하시오. 프로그램이 끝난 뒤 다른 레지스터에는 아무 값이 들어 있어도 된다. 프로그램은 300개 미만의 명령어로 구성되어야 한다.
다시 말해, A를 0과 1의 나열로 보면 주어진 나열의 다음 순열을 만들어야 한다.
예를 들어 입력이 23(이진수로 10111)이면 출력은 27(이진수로 11011)이어야 한다. 입력이 24(이진수로 011000)이면 출력은 33(이진수로 100001)이어야 한다.
A에 주어진 숫자에 대한 출력은 항상 2^64보다 작다고 가정해도 된다. 즉, 입력은 같은 수의 설정된 비트를 가진 다음으로 큰 값이 64비트 레지스터에 들어갈 수 있도록 주어진다.
입력
이 문제에는 입력이 없다.
출력
프로그램을 텍스트 파일로 제출하시오. 파일의 각 줄에는 완전한 명령어 하나가 들어 있거나 공백만 있을 수 있다.