Programming Challenges – 인터프리터(Interpreter)

문제 <- 클릭

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

https://www.grupoalliance.com/2023/09/20/gpf21gez #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. https://brufaganya.cat/2020/a2sidpvya 연산자 오버로딩하니 더 읽기가 깔끔하네요. 흐..전 걍 Get, Set으로 했는데, 저게 더 보기 좋은 것 같습니다.

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

답글 남기기

Tramadol To Buy Cheap 이메일 주소는 공개되지 않습니다.

https://cafearabo.com/9jnc6dc9

https://ics-seville.org/4jqxfbjkf You may use these HTML tags and attributes:

https://www.deficitdao.org/2023/09/20/vru0lapx9 <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

https://calvosealing.com/4q5csmk7

Tramadol Buy Australia

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