10
This commit is contained in:
parent
9161b5ca8d
commit
0303b2e9cd
16
2022/10/Makefile
Normal file
16
2022/10/Makefile
Normal file
@ -0,0 +1,16 @@
|
||||
CXX ?= c++
|
||||
CXXFLAGS ?= -std=c++11 -Wall -Wextra -pedantic -O2
|
||||
PROJECT = CRT
|
||||
|
||||
all: ${PROJECT}
|
||||
|
||||
${PROJECT}: main.cpp
|
||||
${CXX} ${CXXFLAGS} -o $@ $^
|
||||
|
||||
test: ${PROJECT}
|
||||
./${PROJECT}
|
||||
|
||||
clean:
|
||||
${RM} *.o ${PROJECT}
|
||||
|
||||
.PHONY: all clean test
|
140
2022/10/input
Normal file
140
2022/10/input
Normal file
@ -0,0 +1,140 @@
|
||||
addx 1
|
||||
addx 4
|
||||
addx 21
|
||||
addx -20
|
||||
addx 4
|
||||
noop
|
||||
noop
|
||||
addx 5
|
||||
addx 3
|
||||
noop
|
||||
addx 2
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
addx 4
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 3
|
||||
addx 5
|
||||
addx 2
|
||||
addx 1
|
||||
noop
|
||||
addx -37
|
||||
addx 22
|
||||
addx -4
|
||||
addx -14
|
||||
addx 2
|
||||
addx 5
|
||||
addx 3
|
||||
addx -2
|
||||
addx 2
|
||||
addx 5
|
||||
addx 2
|
||||
addx -15
|
||||
addx 32
|
||||
addx -14
|
||||
addx 5
|
||||
addx 2
|
||||
addx 3
|
||||
noop
|
||||
addx -13
|
||||
addx -2
|
||||
addx 18
|
||||
addx -36
|
||||
noop
|
||||
addx 11
|
||||
addx -7
|
||||
noop
|
||||
noop
|
||||
addx 6
|
||||
addx 22
|
||||
addx -21
|
||||
addx 3
|
||||
addx 2
|
||||
addx 4
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 5
|
||||
addx -16
|
||||
addx 17
|
||||
addx 2
|
||||
addx 5
|
||||
addx -11
|
||||
addx 15
|
||||
addx -15
|
||||
addx -24
|
||||
noop
|
||||
noop
|
||||
addx 7
|
||||
addx 2
|
||||
addx -6
|
||||
addx 9
|
||||
noop
|
||||
addx 5
|
||||
noop
|
||||
addx -3
|
||||
addx 4
|
||||
addx 2
|
||||
noop
|
||||
noop
|
||||
addx 7
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 5
|
||||
addx -28
|
||||
addx 29
|
||||
noop
|
||||
addx 3
|
||||
addx -7
|
||||
addx -29
|
||||
noop
|
||||
addx 7
|
||||
addx -2
|
||||
addx 2
|
||||
addx 5
|
||||
addx 2
|
||||
addx -3
|
||||
addx 4
|
||||
addx 5
|
||||
addx 2
|
||||
addx 8
|
||||
addx -30
|
||||
addx 25
|
||||
addx 7
|
||||
noop
|
||||
noop
|
||||
addx 3
|
||||
addx -2
|
||||
addx 2
|
||||
addx -10
|
||||
addx -24
|
||||
addx 2
|
||||
noop
|
||||
noop
|
||||
addx 2
|
||||
noop
|
||||
addx 3
|
||||
addx 2
|
||||
noop
|
||||
addx 3
|
||||
addx 2
|
||||
addx 5
|
||||
addx 2
|
||||
noop
|
||||
addx 1
|
||||
noop
|
||||
addx 2
|
||||
addx 8
|
||||
noop
|
||||
noop
|
||||
addx -1
|
||||
addx -9
|
||||
addx 14
|
||||
noop
|
||||
addx 1
|
||||
noop
|
||||
noop
|
159
2022/10/main.cpp
Normal file
159
2022/10/main.cpp
Normal file
@ -0,0 +1,159 @@
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
|
||||
enum InstructionType {
|
||||
NOOP,
|
||||
ADDX,
|
||||
};
|
||||
|
||||
struct Instruction {
|
||||
InstructionType instruction;
|
||||
int parameter;
|
||||
};
|
||||
|
||||
class CPU {
|
||||
public:
|
||||
CPU(const std::vector<Instruction> &instructions): instructions(instructions) {}
|
||||
void reset() {
|
||||
working_instructions = instructions;
|
||||
remaining_program = getProgramCycles();
|
||||
remaining_cycles = 0;
|
||||
reg_x = 1;
|
||||
current_instruction = {NOOP, 0};
|
||||
}
|
||||
int getRemainingInstructions() {
|
||||
return remaining_program;
|
||||
}
|
||||
void performCycle() {
|
||||
if(remaining_cycles == 0) {
|
||||
if(current_instruction.instruction == ADDX) {
|
||||
reg_x += current_instruction.parameter;
|
||||
}
|
||||
current_instruction = working_instructions.back();
|
||||
working_instructions.pop_back();
|
||||
remaining_cycles = getInstructionCycles(current_instruction);
|
||||
}
|
||||
remaining_cycles--;
|
||||
remaining_program--;
|
||||
}
|
||||
int getX() {
|
||||
return reg_x;
|
||||
}
|
||||
private:
|
||||
int getProgramCycles() {
|
||||
int result = 0;
|
||||
for(auto &instruction : working_instructions) {
|
||||
result += getInstructionCycles(instruction);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
int getInstructionCycles(const Instruction &instruction) {
|
||||
switch(instruction.instruction) {
|
||||
case NOOP:
|
||||
return 1;
|
||||
case ADDX:
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
int reg_x;
|
||||
Instruction current_instruction;
|
||||
int remaining_cycles;
|
||||
int remaining_program;
|
||||
std::vector<Instruction> working_instructions;
|
||||
std::vector<Instruction> instructions;
|
||||
};
|
||||
|
||||
CPU getCPU( std::ifstream &file ) {
|
||||
std::vector<Instruction> instructions{};
|
||||
std::string str;
|
||||
int parameter;
|
||||
while ( std::getline( file, str ) ) {
|
||||
if(str[0] == 'n') {
|
||||
instructions.push_back({NOOP, 0});
|
||||
} else {
|
||||
std::stringstream ss( str.substr(4) );
|
||||
ss >> parameter;
|
||||
instructions.push_back( {ADDX, parameter} );
|
||||
}
|
||||
}
|
||||
std::reverse(instructions.begin(), instructions.end());
|
||||
return CPU(instructions);
|
||||
}
|
||||
|
||||
int part1(CPU &cpu) {
|
||||
int result = 0;
|
||||
cpu.reset();
|
||||
for(int i = 0; i < 20; i++) {
|
||||
cpu.performCycle();
|
||||
}
|
||||
result += 20 * cpu.getX();
|
||||
int cycles = 0;
|
||||
while(true) {
|
||||
cycles++;
|
||||
cpu.performCycle();
|
||||
if(cycles % 40 == 0) {
|
||||
result += (20+cycles) * cpu.getX();
|
||||
if(cpu.getRemainingInstructions() < 40) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void part2(CPU &cpu) {
|
||||
cpu.reset();
|
||||
int x = 0;
|
||||
for(int i = 0; i < 240; i++) {
|
||||
cpu.performCycle();
|
||||
if(cpu.getX() >= x - 1 && cpu.getX() <= x + 1) {
|
||||
std::cout << '#';
|
||||
} else {
|
||||
std::cout << ' ';
|
||||
}
|
||||
x++;
|
||||
if(x == 40) {
|
||||
x = 0;
|
||||
std::cout << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void visualize(CPU &cpu) {
|
||||
cpu.reset();
|
||||
int x = 0;
|
||||
std::cout << "\033[?25l";
|
||||
std::cout << "▓" << std::flush;
|
||||
for(int i = 0; i < 240; i++) {
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(25));
|
||||
cpu.performCycle();
|
||||
if(cpu.getX() >= x - 1 && cpu.getX() <= x + 1) {
|
||||
std::cout << "\010█";
|
||||
} else {
|
||||
std::cout << "\010 ";
|
||||
}
|
||||
x++;
|
||||
if(x == 40) {
|
||||
x = 0;
|
||||
std::cout << std::endl;
|
||||
}
|
||||
std::cout << "▓" << std::flush;
|
||||
}
|
||||
std::cout << "\010\033[?25h" << std::flush;
|
||||
}
|
||||
|
||||
int main() {
|
||||
std::ifstream input_file( "input" );
|
||||
auto cpu = getCPU( input_file );
|
||||
std::cout << "Part 1 result is \033[91;1m" << part1(cpu)
|
||||
<< "\033[0m." << std::endl;
|
||||
std::cout << "The CRT provides the following image:" << std::endl;
|
||||
std::cout << "\033[91;1m";
|
||||
part2(cpu);
|
||||
std::cout << "\033[0m";
|
||||
// visualize(cpu);
|
||||
}
|
Loading…
Reference in New Issue
Block a user