-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathassembunny.js
53 lines (40 loc) · 1.24 KB
/
assembunny.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
const asm = (input, a = 0, b = 0, c = 0, d = 0) => {
const instructions = input
.split('\n')
.map((x) => {
const parts = x.trim().match(/(\w+) (\w+)(?: (-?\w+))?/);
const cmd = parts[1];
const instruction = { cmd };
if (cmd === 'cpy' || cmd === 'jnz') {
instruction['registerA'] = +parts[2] || parts[2];
instruction['registerB'] = +parts[3] || parts[3];
} else if (cmd === 'inc' || cmd === 'dec') {
instruction['registerB'] = parts[2];
}
return instruction;
});
const registers = { a, b, c, d };
let position = 0;
while (position < instructions.length) {
const { cmd, registerA, registerB } = instructions[position];
if (cmd === 'cpy') {
const value = Number.isInteger(registerA)
? registerA
: registers[registerA];
registers[registerB] = value;
} else if (cmd === 'inc' || cmd === 'dec') {
registers[registerB] += cmd === 'inc' ? 1 : -1;
} else if (cmd === 'jnz') {
const value = Number.isInteger(registerA)
? registerA
: registers[registerA];
if (value !== 0) {
position += registerB;
continue;
}
}
position++;
}
return registers;
};
module.exports = asm;