Programming Challenges – 인터프리터(Interpreter)

문제 <- 클릭

와우~ 이거 재미 있는데 ㅎㅎㅎ 레벨은 2인데 크게 어렵지는 않은듯..
작동은 잘 되는데 출력 형태가 맘에 안든다고 로봇님이 그래서 출력 부분은 책을 좀 참고 ㅎㅎ

#include 
#include 
using namespace std;

class Memory {
private:
	int val;
public:
	Memory() :
		val(0) {
	}
	int getVal() {
		return val;
	}
	void getArg(int * arg) {
		arg[0] = val / 100;
		arg[1] = (val / 10) % 10;
		arg[2] = val % 10;
	}
	Memory& operator+=(const int& rhs) {
		val += rhs;
		if (val > 999)
			val %= 1000;
		return *this;
	}
	Memory& operator+=(const Memory& rhs) {
		*this += rhs.val;
		return *this;
	}
	Memory& operator*=(const int& rhs) {
		val *= rhs;
		if (val > 999)
			val %= 1000;
		return *this;
	}
	Memory& operator*=(const Memory& rhs) {
		*this *= rhs.val;
		return *this;
	}
	Memory& operator=(const Memory& rhs) {
		val = rhs.val;
		return *this;
	}
	Memory& operator=(const int& inVal) {
		val = inVal;
		return *this;
	}
};

class Interpreter {
private:
	Memory registers[10];
	Memory ram[1000];
	int counter;
public:
	Interpreter() :
		counter(0) {
	}

	void reset() {
		for (int i = 0; i < 10; i++)
			registers[i] = 0;
		for (int i = 0; i < 1000; i++)
			ram[i] = 0;
		counter = 0;
	}

	void input(char* command) {
		ram[counter++] = atoi(command);
	}

	int execute() {
		bool doing = true;
		int addr = 0;
		int arg[3];
		int numberOfExecuted = 0;
		while (doing) {
			ram[addr].getArg(arg);
			addr++;
			numberOfExecuted++;

			switch (arg[0]) {
			case 0:
				if (registers[arg[2]].getVal() != 0)
					addr = registers[arg[1]].getVal();
				break;
			case 1:
				doing = false;
				break;
			case 2:
				registers[arg[1]] = arg[2];
				break;
			case 3:
				registers[arg[1]] += arg[2];
				break;
			case 4:
				registers[arg[1]] *= arg[2];
				break;
			case 5:
				registers[arg[1]] = registers[arg[2]];
				break;
			case 6:
				registers[arg[1]] += registers[arg[2]];
				break;
			case 7:
				registers[arg[1]] *= registers[arg[2]];
				break;
			case 8:
				registers[arg[1]] = ram[registers[arg[2]].getVal()];
				break;
			case 9:
				ram[registers[arg[2]].getVal()] = registers[arg[1]];
				break;
			}
		}
		return numberOfExecuted;
	}

};

int main() {
	Interpreter inter;
	int numberOfCase;
	char command[10];

	cin >> numberOfCase;
	gets(command);
	gets(command);
	for (int caseTime = 0; caseTime < numberOfCase; caseTime++) {
		for (int i = 0; gets(command) && *command; ++i) //입력부분은 에러나서 책 참고
			inter.input(command);
		if (caseTime > 0)
			putchar('n');
		cout << inter.execute() << endl; //출력하고
		inter.reset(); //리셋하기
	}

	return 0;
}

3 thoughts on “Programming Challenges – 인터프리터(Interpreter)

  1. 연산자 오버로딩하니 더 읽기가 깔끔하네요. 흐..전 걍 Get, Set으로 했는데, 저게 더 보기 좋은 것 같습니다.

    • 왠지 연산자 오버로딩을 써먹을 수 있는 기회 같아서 사용해 보았습니다 ^^ 감사합니다.

  2. 문제 링크 : http://uva.onlinejudge.org/external/100/10033.html 응시 유저 수 : 3002 해결한 유저 비율 :68.79% 예전에 배웠던 어셈블리 생각이 나는 문제다. 문제에 적힌 대로 instruction들을 차례대로 RAM에 적재하고 나서 program counter를 0에서부터 진행하면 된다. 점프할 때 점프하고. 빈 줄 처리를 위해 getline()을 사용했다. 이렇게 되면 instruction을 in..

답글 남기기

이메일 주소는 공개되지 않습니다.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.