Add day 8
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
class Comp {
|
||||
static final Comp _singleton = Comp._internal();
|
||||
int _pc;
|
||||
int _acc;
|
||||
Set<int> _loopTest;
|
||||
int _swapJmp = -1;
|
||||
int _swapNop = -1;
|
||||
|
||||
factory Comp() {
|
||||
return _singleton;
|
||||
}
|
||||
|
||||
// singleton's constructor
|
||||
Comp._internal() {
|
||||
reset();
|
||||
}
|
||||
|
||||
void reset() {
|
||||
_pc = 0;
|
||||
_acc = 0;
|
||||
_loopTest = {};
|
||||
}
|
||||
|
||||
void swapJmp(int index) {
|
||||
_swapJmp = index;
|
||||
_swapNop = -1;
|
||||
}
|
||||
|
||||
void swapNop(int index) {
|
||||
_swapNop = index;
|
||||
_swapJmp = -1;
|
||||
}
|
||||
|
||||
int get pc => _pc;
|
||||
int get acc => _acc;
|
||||
|
||||
bool execute(String command) {
|
||||
var _newPC = _pc;
|
||||
var _newAcc = _acc;
|
||||
|
||||
// print(command);
|
||||
var parse = command.split(' ');
|
||||
var _val = int.parse(parse[1]);
|
||||
var instruction = parse[0];
|
||||
if (_swapJmp >= 0 && _swapJmp == _pc) {
|
||||
instruction = 'nop';
|
||||
}
|
||||
if (_swapNop >= 0 && _swapNop == _pc) {
|
||||
instruction = 'jmp';
|
||||
}
|
||||
// print('$instruction:$_val pc=$_pc swpJmp=$_swapJmp swpNop=$_swapNop');
|
||||
switch (instruction) {
|
||||
case 'nop':
|
||||
_newPC++;
|
||||
break;
|
||||
case 'acc':
|
||||
_newAcc += _val;
|
||||
_newPC++;
|
||||
break;
|
||||
case 'jmp':
|
||||
_newPC += _val;
|
||||
break;
|
||||
default:
|
||||
print('********** ERROR **********');
|
||||
break;
|
||||
}
|
||||
if (_loopTest.contains(_newPC)) {
|
||||
return false;
|
||||
}
|
||||
_pc = _newPC;
|
||||
_acc = _newAcc;
|
||||
_loopTest.add(_pc);
|
||||
return true;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() => 'pc:$_pc -- acc:$_acc';
|
||||
}
|
||||
Reference in New Issue
Block a user