만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

Halt and Catch Fire

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

요약
mov, add, sub, jeq, hcf 다섯 가지 연산으로 이루어진 작은 프로그램을 실행해서 $out 값이나 hcf에서 멈췄을 때의 상태를 출력합니다.
난이도

쉬움10점 중 3점

유형
시뮬레이션, 해시맵
정답자
아직 제출이 없습니다

문제

연구를 통해 FPC(Fast Processing Chip)라는 새로운 초고속 CPU가 만들어졌다. 이 제품에는 지금까지 본 적 없는 디버깅 기능인 hcf 명령어가 있다. 이전에 설계된 어떤 CPU보다 강력한 디버깅 기능을 제공한다.

제품이 빠르게 인기를 얻으면서 기업들은 개발을 바로 시작하려고 칩을 손에 넣고 싶어 한다. 다만 칩이 너무 비싸서 모든 개발자에게 마음대로 나눠 줄 수 없다.

당신은 프로세서처럼 동작하는 프로그램을 설계하도록 고용되었다. 프로그래머는 이 프로그램으로 하드웨어 없이 자신의 프로그램을 작성하고 쉽게 테스트할 수 있다.

입력

첫 줄에는 프로그램의 줄 수를 나타내는 정수 1≤n≤10001 \leq n \leq 1000이 하나 주어진다.

이어지는 nn개 줄에는 공백으로 구분된 세 부분이 있다.

  • 연산. 항상 3글자이다.
  • 인자. 정수 −231≤a≤231−1-2^{31} \leq a \leq 2^{31}-1이거나, $가 앞에 붙은 변수 이름이다.
  • 인자. 정수 −231≤b≤231−1-2^{31} \leq b \leq 2^{31}-1이거나, $가 앞에 붙은 변수 이름이다.

연산은 다섯 가지이다.

  • mov: 첫 번째 인자의 값을 두 번째 인자로 옮긴다.
  • add: 두 번째 인자의 값을 첫 번째 인자에 더하고, 결과를 $acc에 저장한다.
  • sub: 첫 번째 인자의 값에서 두 번째 인자의 값을 빼고, 결과를 $acc에 저장한다.
  • jeq: 첫 번째 인자의 값이 $cmp와 같으면, 두 번째 인자의 값이 가리키는 주소의 명령으로 점프한다.
  • hcf: 프로그램을 즉시 멈춘다. 정수 인자만 받는다.

인자는 정수 즉시값이거나, $로 시작하는 변수 참조이다. 변수 이름은 최대 20자의 영어 소문자(a-z)와 밑줄(_)로 이루어진다.

미리 정의된 변수는 네 개이다.

  • $acc: 마지막 add 또는 sub 연산의 결과를 담는다.
  • $pc: 현재 처리 중인 연산의 주소를 담는다.
  • $cmp: jeq 연산에서 비교할 때 쓴다.
  • $out: 프로그램이 끝날 때 출력해야 하는 값이다.

그 밖의 변수는 값이 처음 옮겨지는 순간 정의된다.

입력 프로그램은 문법적으로 올바르다고 가정한다. 정수는 오버플로나 언더플로가 발생하지 않는다.

출력

$pc의 값이 프로그램의 범위를 벗어나거나 hcf 명령어에 도달하면 프로그램이 끝난다.

$pc가 범위를 벗어나서 끝난 경우에는 프로그램이 끝날 때의 $out 값을 한 줄에 출력한다.

hcf 명령어에서 끝난 경우에는 다음 네 줄을 출력한다.

  • 호출된 hcf 명령어 한 줄.
  • $acc의 값 한 줄.
  • $cmp의 값 한 줄.
  • $out의 값 한 줄.

예제2

  1. 예제 1

    입력
    6
    mov 3 $cmp
    jeq 3 3
    jeq $cmp 5
    mov 42 $out
    jeq $cmp 7
    mov 50 $out
    
    예상 출력
    42
    
  2. 예제 2

    입력
    4
    mov 3 $cmp
    mov 2 $out
    add $cmp $out
    hcf 0 0
    
    예상 출력
    hcf 0 0
    5
    3
    2