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

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

PF

시간 제한0.1초메모리 제한1024 MB

요약
숫자와 +, -, * 연산자가 순서대로 들어오는 입력을 읽어 표준 우선순위로 계산해 그 결과를 레지스터 A에 남기는 PF 나노프로세서 프로그램을 255줄 이내로 작성한다.
난이도

보통10점 중 7점

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

문제

나노프로세서 Perfect Function(줄여서 PF)의 단순한 구조에는 입력 레지스터 IN과 세 개의 정수 레지스터 A, B, C가 있다. IN은 표준 입력에 연결되어 있고, 계산 결과는 A에 들어 있어야 한다. IN에서는 음이 아닌 정수 하나와 +, -, *, = 중 하나의 문자를 표준 입력에서 읽을 수 있다.

PF가 수행할 수 있는 기본 연산은 아래 표에 나와 있다.

다음 기호를 사용한다.

  • <Reg> - 네 레지스터 중 아무거나;
  • <R>, <R1>, <R2> - 세 정수 레지스터 A, B, C 중 아무거나;
  • <number> - 음이 아닌 정수;
  • <const> - 허용된 문자 중 아무거나, 또는 음이 아닌 정수.

레지스터를 바꾸는 이항 연산에서는 바뀌는 레지스터가 두 번째 인자라는 점을 알 수 있다.

연산 코드동작
ReadInt표준 입력에서 IN으로 음이 아닌 정수 하나를 읽는다. 구분자를 정리한 뒤 표준 입력에서 다른 것이 들어오면 오류가 발생한다.
ReadChar표준 입력에서 IN으로 +, -, *, = 중 하나의 문자를 읽는다. 구분자를 정리한 뒤 표준 입력에 다른 문자나 수가 있으면 오류가 발생한다.
If <Reg> Is <const>Reg의 내용이 상수 const와 같으면 실행할 블록의 시작. 문자와 수를 비교하려 하면 오류가 발생한다.
EndIfIf 블록의 끝
Store <number> <R>R의 내용이 음이 아닌 정수 <number>가 된다.
Copy IN <R>IN의 내용을 R로 복사한다. IN에 수가 아니라 문자가 들어 있으면 오류가 발생한다.
Copy <R1> <R2>R1의 내용을 R2로 복사한다.
Add <Reg> <R>Reg의 내용을 R의 내용에 더한다. Reg에 문자가 들어 있으면 오류가 발생한다.
Sub <Reg> <R>R의 내용에서 Reg의 내용을 뺀다. Reg에 문자가 들어 있으면 오류가 발생한다.
Mul <Reg> <R>R의 내용에 Reg의 내용을 곱한다. Reg에 문자가 들어 있으면 오류가 발생한다.
Repeat순환 블록의 시작
Loop순환 블록의 끝
Stop계산 과정의 끝. 결과는 A의 내용이다.

계산을 시작할 때 모든 레지스터에는 수 0이 들어 있다.

음이 아닌 정수와 산술 연산 +, -, *로 이루어진 산술식을 올바르게 계산하는 PF 프로세서용 프로그램을 작성하라. 결과는 레지스터 A에서 얻어야 한다. 여기서 “올바르게”란 통상적인 연산 우선순위를 따른다는 뜻이다. 곱셈을 먼저 하고, 덧셈과 뺄셈은 왼쪽에서 오른쪽으로 한다. 따라서 입력 2 + 2 * 2 =에 대해서는 A에 8이 아니라 6이 남아야 한다.

입력

프로그램의 입력은 올바르며 다음과 같은 모양이다.

수와 그 뒤에 올 수도 있는 문자가 표준 입력에서 IN 레지스터로 들어온다. 이 열은 수로 시작한다. 모든 수는 음이 아닌 정수다. 각 수 뒤에 오는 문자는 +, -, *, = 중 하나다. 공백, 탭, 줄 바꿈 문자로 이루어진 비어 있지 않은 임의의 집합이 열의 원소 사이 구분자 역할을 할 수 있다. 열의 끝은 문자 =를 읽는 것으로 표시된다. 문자 +, -, *는 각각 덧셈, 뺄셈, 곱셈이라는 표준 수 연산을 뜻한다.

출력

이 문제는 “출력 전용” 유형이다. 채점 시스템에, 설명한 문제를 푸는 PF 프로세서용 프로그램이 담긴 텍스트 파일 PF.txt를 제출하라. PF.txt의 각 줄은 PF 프로세서에 맞는 올바른 연산이어야 한다.

제한

PF.txt 파일은 255개 프로그램 줄과 64 KB 크기를 넘지 않아야 한다. 주어진 열의, 수에서 시작하고 수에서 끝나는 임의의 부분 열을 계산한 결과는 양의 정수, 음의 정수 또는 0이지만, 십진수 18자리를 넘지 않는다.

예제1

  1. 예제 1

    입력
    0 =
    
    예상 출력
    Store 0 A
    Store 0 C
    ReadInt
    Copy IN B
    Repeat
    ReadChar
    If IN Is =
    If C Is 0
    Add B A
    EndIf
    If C Is 1
    Sub B A
    EndIf
    Stop
    EndIf
    If IN Is *
    ReadInt
    Mul IN B
    Loop
    EndIf
    If IN Is +
    If C Is 0
    Add B A
    EndIf
    If C Is 1
    Sub B A
    EndIf
    Store 0 C
    ReadInt
    Copy IN B
    Loop
    EndIf
    If IN Is -
    If C Is 0
    Add B A
    EndIf
    If C Is 1
    Sub B A
    EndIf
    Store 1 C
    ReadInt
    Copy IN B
    Loop
    EndIf
    Loop