From 22f96da42562d1f9ab3e5fd1715a6158ebebf3a2 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sat, 18 Oct 2025 10:38:00 +0200 Subject: day 15, aoc 2016 --- 2016/src/day15.cpp | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 2016/src/day15.cpp (limited to '2016/src') diff --git a/2016/src/day15.cpp b/2016/src/day15.cpp new file mode 100644 index 0000000..ced6102 --- /dev/null +++ b/2016/src/day15.cpp @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +namespace { + +struct Disc { + [[nodiscard]] + bool zeroAtTime(int time) const + { + return (time + num + phase) % positions == 0; + } + + int num; + int phase; + int positions; +}; + +vector +extractNumbers(const string& text) +{ + static const regex number_regex("\\d+"); + + vector numbers; + smatch match; + + auto searchStart = text.cbegin(); + while ( regex_search(searchStart, text.cend(), match, number_regex) ) { + numbers.emplace_back(stoi(match.str())); + searchStart = match.suffix().first; + } + + return numbers; +} + +vector +readFile(const filesystem::path& filename) +{ + ifstream file{ filename }; + vector discs; + + for ( string line; getline(file, line); ) { + auto numbers = extractNumbers(line); + discs.emplace_back(numbers.at(0), numbers.at(3), numbers.at(1)); + } + + return discs; +} + +void +solve(const vector& discs) +{ + for ( int time = 0;; ++time ) { + auto found = ranges::all_of(discs, [&time](const auto& disc) { return disc.zeroAtTime(time); }); + if ( found ) { + cout << time << '\n'; + return; + } + } +} + +void +part1(const vector& discs) +{ + solve(discs); +} + +void +part2(vector discs) +{ + discs.emplace_back(discs.size() + 1, 0, 11); + solve(discs); +} + +} // namespace + +int +main() +{ + auto discs = readFile("data/day15.txt"); + part1(discs); + part2(discs); +} -- cgit v1.3