mid-kid
2 years ago
3 changed files with 269 additions and 0 deletions
@ -0,0 +1,118 @@ |
|||||
|
#include <iostream> |
||||
|
#include <vector> |
||||
|
|
||||
|
using namespace std; |
||||
|
|
||||
|
enum Opcode { |
||||
|
NOOP, |
||||
|
ADDX |
||||
|
}; |
||||
|
|
||||
|
struct Instr { |
||||
|
Opcode op; |
||||
|
int arg; |
||||
|
}; |
||||
|
|
||||
|
unsigned instr_cycles[] = { |
||||
|
1, // NOOP
|
||||
|
2 // ADDX
|
||||
|
}; |
||||
|
|
||||
|
typedef vector<Instr> Input; |
||||
|
|
||||
|
Input parse() |
||||
|
{ |
||||
|
Input data; |
||||
|
for (string line; getline(cin, line);) { |
||||
|
Instr instr; |
||||
|
string op = line.substr(0, 5); |
||||
|
if (op == "noop") { |
||||
|
instr.op = NOOP; |
||||
|
} else if (op == "addx ") { |
||||
|
instr.op = ADDX; |
||||
|
instr.arg = stoi(line.substr(5)); |
||||
|
} |
||||
|
data.push_back(instr); |
||||
|
} |
||||
|
return data; |
||||
|
} |
||||
|
|
||||
|
class Cpu { |
||||
|
const vector<Instr> *prog; |
||||
|
vector<Instr>::const_iterator cur; |
||||
|
unsigned cur_cycles = 0; |
||||
|
bool run = true; |
||||
|
|
||||
|
public: |
||||
|
unsigned cycle = 1; |
||||
|
int X = 1; |
||||
|
|
||||
|
Cpu(const vector<Instr> *prog) { |
||||
|
this->prog = prog; |
||||
|
this->cur = prog->begin(); |
||||
|
} |
||||
|
|
||||
|
void tick(); |
||||
|
bool running() { return run; } |
||||
|
}; |
||||
|
|
||||
|
void Cpu::tick() |
||||
|
{ |
||||
|
if (!run) return; |
||||
|
|
||||
|
// Fetch next instruction
|
||||
|
if (!cur_cycles) { |
||||
|
cur_cycles = instr_cycles[cur->op]; |
||||
|
} |
||||
|
|
||||
|
// Execute instruction when done
|
||||
|
if (!--cur_cycles) { |
||||
|
switch (cur->op) { |
||||
|
case NOOP: |
||||
|
break; |
||||
|
|
||||
|
case ADDX: |
||||
|
this->X += cur->arg; |
||||
|
break; |
||||
|
} |
||||
|
cur++; |
||||
|
if (cur >= prog->end()) run = false; |
||||
|
} |
||||
|
|
||||
|
cycle++; |
||||
|
} |
||||
|
|
||||
|
unsigned p1(const Input &input) |
||||
|
{ |
||||
|
unsigned sum = 0; |
||||
|
Cpu cpu(&input); |
||||
|
while (cpu.running()) { |
||||
|
if ((cpu.cycle + 20) % 40 == 0) sum += cpu.cycle * cpu.X; |
||||
|
cpu.tick(); |
||||
|
} |
||||
|
return sum; |
||||
|
} |
||||
|
|
||||
|
void p2(const Input &input) |
||||
|
{ |
||||
|
Cpu cpu(&input); |
||||
|
while (cpu.running()) { |
||||
|
// Calculate current CRT line
|
||||
|
int X = cpu.cycle % 40; |
||||
|
if (X == 0) X += 40; |
||||
|
|
||||
|
// Draw pixel
|
||||
|
if (cpu.X <= X && X <= cpu.X + 2) cout << '#'; |
||||
|
else cout << '.'; |
||||
|
if (X == 40) cout << endl; |
||||
|
|
||||
|
cpu.tick(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
int main() |
||||
|
{ |
||||
|
auto input = parse(); |
||||
|
cout << p1(input) << endl; |
||||
|
p2(input); |
||||
|
} |
@ -0,0 +1,144 @@ |
|||||
|
noop |
||||
|
addx 33 |
||||
|
addx -30 |
||||
|
noop |
||||
|
noop |
||||
|
addx 7 |
||||
|
addx 1 |
||||
|
noop |
||||
|
noop |
||||
|
addx 3 |
||||
|
addx 3 |
||||
|
addx 3 |
||||
|
addx -4 |
||||
|
addx 5 |
||||
|
addx 2 |
||||
|
noop |
||||
|
addx 7 |
||||
|
noop |
||||
|
addx 1 |
||||
|
addx 4 |
||||
|
noop |
||||
|
addx 1 |
||||
|
addx -38 |
||||
|
noop |
||||
|
addx 16 |
||||
|
addx -13 |
||||
|
addx 2 |
||||
|
addx 7 |
||||
|
noop |
||||
|
addx -2 |
||||
|
addx -10 |
||||
|
addx 17 |
||||
|
addx -5 |
||||
|
addx 10 |
||||
|
noop |
||||
|
addx -15 |
||||
|
addx 16 |
||||
|
addx 2 |
||||
|
noop |
||||
|
noop |
||||
|
addx 7 |
||||
|
addx 3 |
||||
|
addx -2 |
||||
|
addx 2 |
||||
|
addx 5 |
||||
|
addx -38 |
||||
|
addx 7 |
||||
|
addx -6 |
||||
|
addx 2 |
||||
|
noop |
||||
|
addx 7 |
||||
|
noop |
||||
|
addx 1 |
||||
|
addx 4 |
||||
|
noop |
||||
|
noop |
||||
|
noop |
||||
|
noop |
||||
|
noop |
||||
|
addx 3 |
||||
|
noop |
||||
|
addx 3 |
||||
|
addx 2 |
||||
|
noop |
||||
|
addx 7 |
||||
|
noop |
||||
|
addx -20 |
||||
|
addx 21 |
||||
|
addx 3 |
||||
|
addx 1 |
||||
|
addx -35 |
||||
|
addx 1 |
||||
|
addx 4 |
||||
|
noop |
||||
|
addx 31 |
||||
|
noop |
||||
|
addx -26 |
||||
|
addx 5 |
||||
|
noop |
||||
|
noop |
||||
|
addx -2 |
||||
|
addx 25 |
||||
|
addx -18 |
||||
|
addx -13 |
||||
|
addx 14 |
||||
|
addx 2 |
||||
|
noop |
||||
|
noop |
||||
|
noop |
||||
|
addx 6 |
||||
|
addx 1 |
||||
|
addx 5 |
||||
|
addx 3 |
||||
|
addx -2 |
||||
|
addx -38 |
||||
|
addx 24 |
||||
|
addx -17 |
||||
|
addx 5 |
||||
|
noop |
||||
|
noop |
||||
|
addx -2 |
||||
|
addx 31 |
||||
|
addx -24 |
||||
|
addx 7 |
||||
|
addx -10 |
||||
|
addx 6 |
||||
|
noop |
||||
|
addx 3 |
||||
|
addx 2 |
||||
|
noop |
||||
|
noop |
||||
|
addx 7 |
||||
|
addx -2 |
||||
|
addx -26 |
||||
|
addx 31 |
||||
|
addx 5 |
||||
|
addx -40 |
||||
|
addx 5 |
||||
|
addx 33 |
||||
|
addx -31 |
||||
|
noop |
||||
|
addx 1 |
||||
|
addx 4 |
||||
|
addx 1 |
||||
|
addx 4 |
||||
|
addx 20 |
||||
|
noop |
||||
|
noop |
||||
|
addx -14 |
||||
|
addx -1 |
||||
|
addx 5 |
||||
|
noop |
||||
|
noop |
||||
|
addx 1 |
||||
|
addx 2 |
||||
|
noop |
||||
|
noop |
||||
|
addx 7 |
||||
|
noop |
||||
|
noop |
||||
|
noop |
||||
|
noop |
||||
|
noop |
||||
|
noop |
@ -0,0 +1,7 @@ |
|||||
|
16480 |
||||
|
###..#....####.####.#..#.#....###..###.. |
||||
|
#..#.#....#....#....#..#.#....#..#.#..#. |
||||
|
#..#.#....###..###..#..#.#....#..#.###.. |
||||
|
###..#....#....#....#..#.#....###..#..#. |
||||
|
#....#....#....#....#..#.#....#....#..#. |
||||
|
#....####.####.#.....##..####.#....###.. |
Loading…
Reference in new issue