페블링 오도미터 2
시간 제한1초메모리 제한512 MB
x가 y 이하이면 (0, 0), 아니면 (0, 1) 칸에서 멈추고 두 칸의 조약돌 개수를 그대로 남기는 프로그램을 작성합니다.
동작 격자
오도미터는 개의 단위 칸으로 이루어진 가상의 정사각형 격자 위를 움직인다. 각 칸에는 조약돌을 최대 15개까지 놓을 수 있으며, (행, 열) 좌표 쌍으로 구분한다. 각 좌표는 0, ..., 255 범위에 있다. 칸 에 인접한 칸은 (존재하는 경우) , , , 이다. 첫 번째 행이나 마지막 행, 또는 첫 번째 열이나 마지막 열에 있는 칸을 가장자리라고 부른다. 오도미터는 항상 칸(북서쪽 모서리)에서 북쪽을 바라보며 출발한다.
기본 명령
오도미터는 프로그램에 적힌 순서대로 명령을 실행한다. 한 줄에는 명령을 최대 하나만 쓸 수 있다. 빈 줄은 무시한다. # 기호는 주석을 시작하며, 그 뒤부터 줄 끝까지의 글자는 무시한다. 오도미터가 프로그램의 끝에 도달하면 실행이 종료된다.
left: 왼쪽으로 90도 회전(반시계 방향)하며, 현재 칸에 그대로 머문다.right: 오른쪽으로 90도 회전(시계 방향)하며, 현재 칸에 그대로 머문다.move: 바라보는 방향으로 한 칸 앞으로 이동한다. 그 방향의 가장자리에 이미 도달했다면 이 명령은 아무 효과가 없다.get: 현재 칸에서 조약돌을 하나 가져간다. 칸에 조약돌이 없으면 아무 효과가 없다.put: 현재 칸에 조약돌을 하나 놓는다. 칸에 이미 15개가 있으면 아무 효과가 없다. 오도미터의 조약돌은 떨어지지 않는다.halt: 실행을 종료한다.
레이블, 가장자리, 조약돌
레이블은 대소문자를 구분하는 문자열이며, 최대 128자까지 a부터 z, A부터 Z, 0부터 9 사이의 기호로 이루어진다. 아래 설명에서 L은 유효한 레이블 아무것이나 가리킨다.
L:은 프로그램에서 레이블L의 위치를 선언한다. 선언된 레이블은 모두 서로 달라야 한다. 선언 자체는 오도미터에 영향을 주지 않는다.jump L은 조건 없이 레이블L이 있는 줄로 넘어간다.border L은 오도미터가 가장자리에 있으면서 격자 바깥쪽을 향할 때, 즉move를 해도 효과가 없을 때 레이블L이 있는 줄로 넘어간다. 그렇지 않으면 실행을 정상적으로 이어 간다.pebble L은 현재 칸에 조약돌이 하나 이상 있으면 레이블L이 있는 줄로 넘어간다. 그렇지 않으면 실행을 정상적으로 이어 간다.
프로그램 크기와 실행 길이
프로그램의 크기는 그 안에 있는 명령의 개수이다. 레이블 선언, 주석, 빈 줄은 세지 않는다. 실행 길이는 수행된 단계의 수이다. 명령이 실행될 때마다 효과가 있었는지와 관계없이 한 단계로 센다. 레이블 선언, 주석, 빈 줄은 단계로 세지 않는다.
과제
시작할 때 칸에는 개, 칸에는 개의 조약돌이 있다. 나머지 칸은 모두 비어 있다. 이면 오도미터가 칸에서, 그렇지 않으면 칸에서 끝나는 프로그램을 작성하라. 끝났을 때 칸에는 정확히 개, 칸에는 정확히 개의 조약돌이 있어야 한다. 어떤 칸에도 조약돌이 15개를 넘게 놓일 수 없다는 점에 유의하라.
제한
프로그램 크기는 200 이하여야 한다. 실행 길이는 2000 이하여야 한다.