aboutsummaryrefslogtreecommitdiff
path: root/2022/src/day10.cpp
blob: 5238474e237ad1f62c7ccb52a5f382539b0d7889 (plain)
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
54
55
56
57
58
59
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<int>
read_file(string_view filename)
{
	fstream     input{ filename };
	vector<int> cycles{};
	int         reg_x = 1;

	static const string add_instr = "addx ";

	for ( string line; getline(input, line); ) {
		cycles.emplace_back(reg_x);

		if ( line.starts_with(add_instr) ) {
			cycles.emplace_back(reg_x);
			reg_x += stoi(line.substr(add_instr.size()));
		}
	}

	return cycles;
}

void
part1(const vector<int>& cycles)
{
	int sum = 0;
	for ( size_t cycle = 19; cycle < cycles.size(); cycle += 40 ) {
		sum += static_cast<int>(cycle + 1) * cycles[cycle];
	}
	cout << sum << endl;
}

void
part2(const vector<int>& cycles)
{
	static const size_t width = 40;
	for ( size_t cycle = 0; cycle != cycles.size(); ++cycle ) {
		auto column = cycle % width;
		if ( column == 0 ) {
			cout << '\n';
		}
		auto res = static_cast<int>(column) - cycles[cycle];
		cout << " #"[res == -1 || res == 0 || res == 1];
	}
	cout << endl;
}

int
main()
{
	const auto cycles = read_file("data/day10.txt");
	part1(cycles);
	part2(cycles);
}