스택 머신 프로그래머

시간 제한1초메모리 제한128 MB

요약
최대 5개의 작은 입출력 정수 쌍을 정확히 매핑하는 스택 머신 프로그램을 연산 및 스택 제약 조건 안에서 생성하는 문제입니다.
난이도

보통10점 중 6점

유형
시뮬레이션, 수학, 구현, 조합론
정답자
아직 제출이 없습니다

문제

많은 암호 연산은 전용 기계나 오토마타로 훨씬 빠르게 계산할 수 있다. 그런 기계의 단점은 누군가가 그 기계용 프로그램을 직접 작성해야 한다는 점이다. 만약 다른 프로그램을 자동으로 만들어 주는 프로그램을 쓸 수 있다면 얼마나 편할까. 이 문제에서는 그런 범용 생성기가 존재한다고 가정한다.

당신의 과제는 아래에 정의한 스택 머신용 프로그램을 자동으로 생성하는 프로그램을 작성하는 것이다.

스택 머신은 정수만 저장하는 스택 하나로 동작한다. 프로그램은 한 줄에 하나의 명령으로 구성되며, END가 나오면 끝난다.

  • NUM X: 정수 X를 스택에 넣는다. (0 ≤ X ≤ 10^9)
  • POP: 맨 위 원소를 제거한다.
  • INV: 맨 위 원소의 부호를 바꾼다.
  • DUP: 맨 위 원소를 복제한다.
  • SWP: 맨 위 두 원소의 순서를 바꾼다.
  • ADD, SUB, MUL, DIV, MOD: 맨 위 두 원소를 꺼내 연산한 뒤 결과를 넣는다. 두 번째로 꺼낸 값이 피연산자의 앞쪽, 첫 번째로 꺼낸 값이 뒤쪽이다. DIV와 MOD는 0으로 나누면 실패한다.
  • 모든 중간 결과와 최종 값의 절댓값은 10^9를 넘을 수 없다.

프로그램을 실행할 때 스택에는 입력값 Vi 하나만 있다. 실행이 끝났을 때 스택에 정확히 하나의 값 Ri만 남아야 한다.

입력

입력은 여러 테스트 케이스로 이루어진다. 각 테스트 케이스는 정수 N(1 ≤ N ≤ 5)으로 시작하며, N은 그 케이스에서 맞춰야 할 입력-출력 쌍의 개수이다. 다음 N줄에는 각각 정수 Vi와 Ri가 주어진다. Vi(0 ≤ Vi ≤ 10)는 입력값이고 Ri(0 ≤ Ri ≤ 20)는 그 입력에 대해 스택에 남아야 하는 값이다. 모든 Vi는 서로 다르다.

각 테스트 케이스 뒤에는 빈 줄이 하나 있다. N이 0인 줄이 나오면 입력이 끝난다.

출력

각 테스트 케이스마다, 그 케이스의 모든 (Vi, Ri) 쌍을 동시에 만족하는 스택 머신 프로그램을 하나 출력한다. 프로그램은 위 명세의 형식, 공백, 길이 제한, 스택 크기 제한을 모두 지켜야 하며 실행 중 오류가 나면 안 된다.

각 프로그램 뒤에는 빈 줄을 하나 출력한다. 마지막 프로그램 뒤에도 빈 줄을 출력한다.

예제1

  1. 예제 1

    입력
    3
    1 3
    2 6
    3 11
    
    1
    1 1
    
    2
    2 4
    10 1
    
    0
    
    예상 출력
    DUP
    MUL
    NUM 2
    ADD
    END
    
    END
    
    NUM 2
    ADD
    NUM 11
    MOD
    END