아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

그림자 동반자

시간 제한2초메모리 제한512 MB

요약
그림자와 함께 비트 테이프를 조작하는 고정 명령열을 만들어, 2^10 미만의 모든 n을 n의 제곱으로 바꾸는 프로그램을 설계한다.
난이도

어려움10점 중 10점

유형
시뮬레이션, 비트 연산, 구현, 수학
정답자
아직 제출이 없습니다

문제

이진 표현의 앞에 0이 무한히 붙어 있는 수 nn이 주어진다. 이 수의 비트 위를 걸어 다니면서 여러 연산을 할 수 있다.

구체적으로 다음과 같은 이동을 할 수 있다.

  • “s”: 그림자를 소환한다. 그림자는 현재 위치에서 한 비트 왼쪽에 나타난다.
  • “l”: 한 비트 왼쪽으로 이동한다. 그림자가 있다면 그림자도 똑같이 이동한다.
  • “r”: 한 비트 오른쪽으로 이동한다. 그림자가 있다면 그림자도 똑같이 이동한다.
  • “L”: 서 있는 비트가 1이면 한 비트 왼쪽으로 이동하고, 그렇지 않으면 아무것도 하지 않는다. 그림자가 있고 그 비트가 1이면 그림자도 한 비트 왼쪽으로 이동한다. 나와 그림자는 서로 독립적으로 움직인다는 점에 유의하라. 내가 1 위에 서 있으면 내가 움직이고, 그림자가 1 위에 서 있으면 그림자가 움직인다.
  • “R”: 바로 앞의 선택지와 같지만, 나와 그림자가 왼쪽 대신 오른쪽으로 이동한다.
  • “x”: 그림자와 위치를 맞바꾼다. 그림자가 없으면 아무 일도 일어나지 않는다.
  • “f”: 몇 개의 비트를 뒤집는다(뒤집기는 0을 1로, 1을 0으로 바꾸는 것이다). 두 비트를 뒤집는데, 내가 서 있는 비트와 내 왼쪽 비트이다. 그림자가 있다면 그림자는 나만큼 강하지 않아서, 그림자가 서 있는 비트 하나만 뒤집는다. 이 이동 중에 어떤 비트가 두 번 뒤집혀서 그대로 남을 수도 있다는 점에 유의하라.

처음에는 가장 오른쪽(최하위) 비트에 있고, 0≤n<2100 \le n < 2^{10}이다. 다음 조건을 만족하는 프로그램, 즉 이동의 나열을 작성하라.

  • 나와 그림자 모두 최하위 비트에서 오른쪽으로 이동하려 해서는 안 된다(다시 말해, 수 밖으로 나가려 해서는 안 된다).
  • 프로그램은 500 000개 이하의 명령으로 이루어진다.
  • 마지막에 수는 n2n^2이다.

몇 가지 기술적인 세부 사항:

  • 어떤 이동 후에 나와 그림자가 같은 위치에 있으면 그림자는 사라진다.
  • 이미 그림자가 있는데 그림자를 소환하면 이전 그림자가 사라진다.
  • 마지막에 내 위치는 아무래도 좋다.
  • 마지막에 그림자가 남아 있어도 되고, 그 위치도 아무래도 좋다.
  • 실행 중에 비트가 나타내는 수는 임의로 커질 수 있다. 이 수에 대한 유일한 제약은 마지막에 n2n^2이어야 한다는 것뿐이다.
  • 다시 말하지만, 나와 그림자가 같은 비트를 동시에 뒤집으면 그 비트는 바뀌지 않는다.

입력

입력은 없다.

출력

집합 “slrLRxf”의 문자로 이루어진, 길이가 500 000 이하인 문자열 하나를 출력하라. 이 문자열이 프로그램이다.

힌트

예제 출력은 틀린 답이다. 실제로 이 프로그램은 가장 오른쪽 두 비트가 xx와 yy이고 나머지 비트가 0인 상태에서 시작해, 모든 비트가 0이고 세 번째 비트(1부터 셈)가 xx와 yy의 셰퍼 획(즉 ¬(x∧y)\lnot(x \land y))인 상태에 이르는 프로그램이다.

다음은 x=y=1x = y = 1일 때 이 프로그램이 동작하는 모습이다.

예제1

  1. 예제 1

    입력
    예상 출력
    lRLsfLLrfxsrLxfsrfRlfl