귀도 반 로썸은 크리스마스에 심심해서 파이썬을 만들었다

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

요약
메모리 32바이트짜리 8비트 가상 기계를 정지할 때까지 실행하고, 마지막 누산기 값을 8비트 이진수로 출력한다.
난이도

보통10점 중 4점

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

문제

귀도 반 로썸은 크리스마스에 심심해서 파이썬을 만들었다고 한다. 그래서 여러분도 심심한 김에 컴퓨터를 하나 만들었다.

이 컴퓨터는 아주 적은 종류의 명령어만 사용하는 프로세서 하나, 32바이트 메모리, 8비트 가산기(누산기), 5비트 프로그램 카운터(PC)로 이루어져 있다. 폰 노이만 구조를 따르므로 프로그램과 데이터가 같은 메모리를 공유한다.

프로그램 카운터는 다음에 실행할 명령어의 주소를 담고 있다. 각 명령어의 길이는 1바이트이고, 상위 3비트는 명령어의 종류를, 하위 5비트는 피연산자를 나타낸다. 피연산자는 언제나 메모리 주소(xxxxx)이다. 피연산자가 필요 없는 명령어도 있으며, 이 경우 하위 5비트는 아무 의미가 없다(-----). 각 명령어의 의미는 다음과 같다.

000xxxxx STA x 메모리 주소 x에 가산기의 값을 저장한다.
001xxxxx LDA x 메모리 주소 x의 값을 가산기로 불러온다.
010xxxxx BEQ x 가산기의 값이 0이면 PC를 x로 바꾼다.
011----- NOP 아무 연산도 하지 않는다.
100----- DEC 가산기의 값을 1 감소시킨다.
101----- INC 가산기의 값을 1 증가시킨다.
110xxxxx JMP x PC를 x로 바꾼다.
111----- HLT 프로그램을 종료한다.

처음에 PC와 가산기의 값은 모두 0이다. 명령어를 불러와 해독한 뒤, 그 명령어를 실행하기 전에 PC 값을 1 증가시킨다. 프로그램은 언제나 종료된다고 가정해도 된다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 32개의 줄로 주어지며, 각 줄은 메모리의 한 바이트(즉 코드)를 주소 0번부터 순서대로 8비트 2진수로 나타낸 것이다. 왼쪽에 있는 비트일수록 상위 비트이다. 입력은 파일의 끝(EOF)에서 종료된다.

출력

각 테스트 케이스마다 프로그램이 종료되었을 때의 가산기 값을 8비트 2진수로 한 줄에 출력한다. 이때도 왼쪽에 출력되는 비트일수록 상위 비트이다.

힌트

가산기는 8비트이므로 그 값이 범위를 넘으면 하위 8비트만 남기고 잘린다. 예를 들어 가산기 값이 11111111일 때 INC를 수행하면 00000000이 된다. 프로그램 카운터도 5비트이므로 같은 원리로, 값이 32가 되면 하위 5비트만 남아 0이 된다.

예제1

  1. 예제 1

    입력
    00111110
    10100000
    01010000
    11100000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00111111
    10000000
    00000010
    11000010
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    00000000
    11111111
    10001001
    
    예상 출력
    10000111