diff --git a/include/aoc/RestroomRedoubt.hpp b/include/aoc/RestroomRedoubt.hpp new file mode 100644 index 0000000..65e37d3 --- /dev/null +++ b/include/aoc/RestroomRedoubt.hpp @@ -0,0 +1,38 @@ +// 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 . + +#pragma once + +#include + +#include + +class RestroomRedoubt + : public Solver +{ +public: + RestroomRedoubt(const int width = 101, const int height = 103); + virtual const std::string getPuzzleName() const override; + virtual const int getPuzzleDay() const override; + virtual void processDataLine(const std::string& line) override; + virtual void finish() override; +private: + const int width_; + const int height_; + const int halfWidth_; + const int halfHeight_; + std::array quadrants_; + static constexpr int getNPredictionSeconds(); +}; diff --git a/src/Program.cpp b/src/Program.cpp index 6cef544..5c84d14 100644 --- a/src/Program.cpp +++ b/src/Program.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include void Program::run() @@ -65,6 +66,7 @@ void Program::runSolvers() runSolver(solverEngine); runSolver(solverEngine); runSolver(solverEngine); + runSolver(solverEngine); runSolver(solverEngine); } diff --git a/src/RestroomRedoubt.cpp b/src/RestroomRedoubt.cpp new file mode 100644 index 0000000..23b6f3f --- /dev/null +++ b/src/RestroomRedoubt.cpp @@ -0,0 +1,92 @@ +// 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; +} diff --git a/tests/src/TestCases.cpp b/tests/src/TestCases.cpp index 8697987..dd9b3f3 100644 --- a/tests/src/TestCases.cpp +++ b/tests/src/TestCases.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #define REQUIRE_MESSAGE(cond, msg) if (!(cond)) { INFO(msg); REQUIRE(cond); } @@ -220,6 +221,19 @@ TEST_CASE("[ClawContraptionTests]") } } +TEST_CASE("[RestroomRedoubtTests]") +{ + TestContext test; + SECTION("FullData") + { + test.run(std::make_unique(), 224969976, 0, test.getInputPaths()); + } + SECTION("ExampleData") + { + test.run(std::make_unique(11, 7), 12, 0, test.getExampleInputPaths()); + } +} + TEST_CASE("[LanPartyTests]") { TestContext test;