// Solutions to the Advent Of Code 2024. // Copyright (C) 2025 Stefan Müller // // This program is free software: you can redistribute it and/or modify it under // the terms of the GNU General Public License as published by the Free Software // Foundation, either version 3 of the License, or (at your option) any later // version. // // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along with // this program. If not, see . #include #include #include #include #include RestroomRedoubt::RestroomRedoubt(const int width, const int height) : width_{ width }, height_{ height }, halfWidth_{ width / 2 }, halfHeight_{ height / 2 } { quadrants_.fill(0); } const std::string RestroomRedoubt::getPuzzleName() const { return "Restroom Redoubt"; } const int RestroomRedoubt::getPuzzleDay() const { return 14; } void RestroomRedoubt::processDataLine(const std::string& line) { std::istringstream stream{ line }; char c; Point2 p; Point2 v; stream >> c >> c >> p.x >> c >> p.y >> c >> c >> v.x >> c >> v.y; Point2 position = p + v * getNPredictionSeconds(); position.x %= width_; if (position.x < 0) { position.x += width_; } position.y %= height_; if (position.y < 0) { position.y += height_; } if (position.x < halfWidth_) { if (position.y < halfHeight_) { quadrants_[0]++; } else if (position.y > halfHeight_) { quadrants_[1]++; } } else if (position.x > halfWidth_) { if (position.y < halfHeight_) { quadrants_[2]++; } else if (position.y > halfHeight_) { quadrants_[3]++; } } } void RestroomRedoubt::finish() { part1 = std::accumulate(quadrants_.cbegin(), quadrants_.cend(), 1, std::multiplies{}); } constexpr int RestroomRedoubt::getNPredictionSeconds() { return 100; }