From 0450ecd6a67226ddbaeedde64ef45dfdd72cddd1 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sun, 19 Oct 2025 22:03:39 +0200 Subject: day 18, aoc 2016 --- 2016/src/day18.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 2016/src/day18.cpp (limited to '2016') diff --git a/2016/src/day18.cpp b/2016/src/day18.cpp new file mode 100644 index 0000000..66d1bf0 --- /dev/null +++ b/2016/src/day18.cpp @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include + +using namespace std; + +namespace { + +string +readFile(const filesystem::path& filename) +{ + ifstream file{ filename }; + string line; + getline(file, line); + return line; +} + +void +solve(string line, size_t lines) +{ + long count = 0; + while ( lines-- > 0 ) { + string current_line = "." + line + "."; + + string new_line; + + for ( size_t i = 1; i < current_line.size() - 1; ++i ) { + auto next_chr = '.'; + + const auto left = current_line[i - 1]; + const auto middle = current_line[i]; + const auto right = current_line[i + 1]; + + if ( left == '^' && middle == '^' && right == '.' ) { + next_chr = '^'; + } + else if ( left == '.' && middle == '^' && right == '^' ) { + next_chr = '^'; + } + else if ( left == '^' && middle == '.' && right == '.' ) { + next_chr = '^'; + } + else if ( left == '.' && middle == '.' && right == '^' ) { + next_chr = '^'; + } + + new_line += next_chr; + } + + count += ranges::count(line, '.'); + + line = std::move(new_line); + } + + cout << count << '\n'; +} + +void +part1(const string& line) +{ + solve(line, 40); +} + +void +part2(const string& line) +{ + solve(line, 400000); +} + +} // namespace + +int +main() +{ + auto line = readFile("data/day18.txt"); + part1(line); + part2(line); +} -- cgit v1.3