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 ... :) --- src/day13.cpp | 115 ---------------------------------------------------------- 1 file changed, 115 deletions(-) delete mode 100644 src/day13.cpp (limited to 'src/day13.cpp') diff --git a/src/day13.cpp b/src/day13.cpp deleted file mode 100644 index 549457b..0000000 --- a/src/day13.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#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