From ce66d4d5a7b67cc5a36dd4dc1a85e0c7129ea5d6 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Mon, 2 Dec 2024 19:07:29 +0100 Subject: aoc 2024, day2 --- 2024/src/day02.cpp | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 2024/src/day02.cpp diff --git a/2024/src/day02.cpp b/2024/src/day02.cpp new file mode 100644 index 0000000..c8ca66f --- /dev/null +++ b/2024/src/day02.cpp @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +#include +using namespace std; + +vector> +read_file(string_view filename) +{ + fstream input{ filename }; + vector> lines; + + auto split = [](const string& str) { + stringstream sstr{ str }; + vector values; + + for ( long value = 0; sstr >> value; ) { + values.emplace_back(value); + } + return values; + }; + + for ( string line; getline(input, line); ) { + lines.emplace_back(split(line)); + } + + return lines; +} + +bool +is_safe(const vector& values) +{ + vector diffs; + for ( size_t i = 1; i < values.size(); ++i ) { + diffs.emplace_back(values.at(i) - values.at(i - 1)); + } + + auto all_negative = ranges::all_of(diffs, [](auto diff) { return diff >= -3 && diff < 0; }); + auto all_positive = ranges::all_of(diffs, [](auto diff) { return diff <= 3 && diff > 0; }); + + return all_positive || all_negative; +} + +void +part1(const vector>& lines) +{ + cout << ranges::count_if(lines, is_safe) << endl; +} + +void +part2(const vector>& lines) +{ + long safe_count = 0; + for ( const auto& line: lines ) { + auto safe = false; + for ( size_t i = 0; i != line.size(); ++i ) { + auto copy = line; + copy.erase(copy.begin() + ptrdiff_t(i)); + safe |= is_safe(copy); + } + if ( safe ) { + ++safe_count; + } + } + cout << safe_count << endl; +} + +int +main() +{ + auto lines = read_file("data/day02.txt"); + part1(lines); + part2(lines); +} -- cgit v1.3