75 lines
1.5 KiB
C++
75 lines
1.5 KiB
C++
//
|
|
// Created by Matthew Gretton-Dann on 09/12/2022.
|
|
//
|
|
|
|
#include <array>
|
|
#include <iostream>
|
|
#include <numeric>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
using Int = std::int64_t;
|
|
using UInt = std::uint64_t;
|
|
|
|
struct State
|
|
{
|
|
auto draw_crt() const
|
|
{
|
|
Int const loc{(static_cast<Int>(pc_) - 1) % 40};
|
|
if (std::abs(x_ - loc) < 2) {
|
|
std::cout << '#';
|
|
}
|
|
else {
|
|
std::cout << '.';
|
|
}
|
|
if (loc == 39) {
|
|
std::cout << '\n';
|
|
}
|
|
}
|
|
|
|
auto addx(UInt incr, Int delta)
|
|
{
|
|
for (unsigned i = 0; i < incr; ++i) {
|
|
draw_crt();
|
|
++pc_;
|
|
}
|
|
if (current_sample_ != sample_points_.end() && *current_sample_ < pc_) {
|
|
score_ += x_ * *current_sample_;
|
|
++current_sample_;
|
|
}
|
|
x_ += delta;
|
|
}
|
|
|
|
[[nodiscard]] auto score() const noexcept -> Int { return score_; }
|
|
|
|
Int x_{1};
|
|
Int score_{0};
|
|
UInt pc_{1};
|
|
static std::array<UInt, 6> const sample_points_;
|
|
std::array<UInt, 6>::const_iterator current_sample_{sample_points_.begin()};
|
|
};
|
|
|
|
std::array<UInt, 6> const State::sample_points_ = {20, 60, 100, 140, 180, 220};
|
|
|
|
auto main() -> int
|
|
{
|
|
std::string line;
|
|
State state;
|
|
using namespace std::literals::string_literals;
|
|
|
|
while (std::getline(std::cin, line) && !line.empty()) {
|
|
if (line == "noop"s) {
|
|
state.addx(1, 0);
|
|
}
|
|
else if (line.substr(0, 5) == "addx "s) {
|
|
state.addx(2, std::stoll(line.substr(5)));
|
|
}
|
|
else {
|
|
std::cerr << "Unable to interpret: " << line << '\n';
|
|
return EXIT_FAILURE;
|
|
}
|
|
}
|
|
std::cout << "Score: " << state.score() << '\n';
|
|
return 0;
|
|
}
|