// // Created by Matthew Gretton-Dann on 09/12/2022. // #include #include #include #include #include using Int = std::int64_t; using UInt = std::uint64_t; struct State { auto draw_crt() const { Int const loc{(static_cast(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 const sample_points_; std::array::const_iterator current_sample_{sample_points_.begin()}; }; std::array 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; }