From 56e890cec0a28c0a485212ccebfaf774235a79a2 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Wed, 3 Jan 2024 23:35:54 +0100 Subject: prepare for more puzzles ... :) --- 2023/src/day13.cpp | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 2023/src/day13.cpp (limited to '2023/src/day13.cpp') diff --git a/2023/src/day13.cpp b/2023/src/day13.cpp new file mode 100644 index 0000000..549457b --- /dev/null +++ b/2023/src/day13.cpp @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +string +read_file(string_view filename) +{ + fstream input{ filename }; + return { istreambuf_iterator{ input }, istreambuf_iterator{} }; +} + +vector +split(string_view line, string_view delimiter) +{ + size_t pos_start = 0; + size_t pos_end = 0; + + vector res; + + while ( (pos_end = line.find(delimiter, pos_start)) != std::string::npos ) { + auto token = line.substr(pos_start, pos_end - pos_start); + pos_start = pos_end + delimiter.length(); + + res.emplace_back(token); + } + + res.emplace_back(line.substr(pos_start)); + return res; +} + +vector +transpose(const vector& lines) +{ + vector result(lines[0].size()); + + for ( const auto& line: lines ) { + for ( size_t i = 0; i < line.size(); ++i ) { + result[i] += line[i]; + } + } + return result; +} + +long +find_mirror(const vector& input) +{ + for ( size_t idx = 1; idx < input.size(); ++idx ) { + bool equal = true; + for ( size_t cnt = 0; cnt != min(idx, input.size() - idx); ++cnt ) { + if ( !(input[idx + cnt] == input[idx - 1 - cnt]) ) { + equal = false; + break; + } + } + if ( equal ) { + return long(idx); + } + } + return 0; +} + +long +count_differences(string_view str1, string_view str2) +{ + long diffs = 0; + for ( size_t idx = 0; idx != str1.size(); ++idx ) { + diffs += long(str1[idx] != str2[idx]); + } + return diffs; +} + +long +find_mirror_part2(const vector& input) +{ + for ( size_t idx = 1; idx < input.size(); ++idx ) { + long errs = 0; + for ( size_t i = 0; i != min(idx, input.size() - idx); ++i ) { + errs += count_differences(input[idx + i], input[idx - 1 - i]); + } + if ( errs == 1 ) { + return long(idx); + } + } + return 0; +} + +void +solve(const function&)>& find_mirror) +{ + static const long multiplier = 100; + + auto contents = read_file("data/day13.txt"); + auto parts = split(contents, "\n\n"); + + long sum = 0; + for ( const auto& part: parts ) { + auto lines = split(part, "\n"); + + sum += find_mirror(transpose(lines)); + sum += find_mirror(lines) * multiplier; + } + cout << sum << endl; +} + +int +main() +{ + solve(find_mirror); + solve(find_mirror_part2); +} -- cgit v1.3