aboutsummaryrefslogtreecommitdiff
path: root/2024
diff options
context:
space:
mode:
Diffstat (limited to '2024')
-rw-r--r--2024/src/day07-opti.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/2024/src/day07-opti.cpp b/2024/src/day07-opti.cpp
new file mode 100644
index 0000000..7700b63
--- /dev/null
+++ b/2024/src/day07-opti.cpp
@@ -0,0 +1,112 @@
1#include <fstream>
2#include <iostream>
3#include <set>
4#include <sstream>
5#include <string>
6#include <tuple>
7#include <vector>
8using namespace std;
9
10vector<tuple<long, vector<long>>>
11read_file(string_view filename)
12{
13 fstream input{ filename };
14
15 vector<tuple<long, vector<long>>> data;
16 for ( string line; getline(input, line); ) {
17 auto pos = line.find(':');
18
19 stringstream str{ line.substr(pos + 1) };
20 data.emplace_back(stol(line.substr(0, pos)), vector<long>{ istream_iterator<long>{ str }, {} });
21 }
22 return data;
23}
24
25void
26part1(const vector<tuple<long, vector<long>>>& data)
27{
28 auto can_evaluated = [](long first, vector<long> values) -> bool {
29 set<long> candidates = { first };
30
31 while ( values.size() > 1 ) {
32 auto value = values.back();
33 values.pop_back();
34
35 set<long> new_candidates;
36 for ( const auto candidate: candidates ) {
37 if ( candidate % value == 0 ) {
38 new_candidates.insert(candidate / value);
39 }
40 if ( candidate >= value ) {
41 new_candidates.insert(candidate - value);
42 }
43 }
44
45 candidates = new_candidates;
46 }
47
48 return values.size() == 1 && candidates.contains(values.back());
49 };
50
51 long sum = 0;
52 for ( const auto& [first, values]: data ) {
53 if ( can_evaluated(first, values) ) {
54 sum += first;
55 }
56 }
57 cout << sum << endl;
58}
59
60void
61part2(const vector<tuple<long, vector<long>>>& data)
62{
63 auto can_evaluated = [](long first, vector<long> values) -> bool {
64 set<long> candidates = { first };
65
66 while ( values.size() > 1 ) {
67 auto value = values.back();
68 values.pop_back();
69
70 set<long> new_candidates;
71 for ( const auto candidate: candidates ) {
72 if ( candidate % value == 0 ) {
73 new_candidates.insert(candidate / value);
74 }
75 if ( candidate >= value ) {
76 new_candidates.insert(candidate - value);
77 }
78
79 if ( candidate > value ) {
80 auto value_str = to_string(value);
81 auto candidate_str = to_string(candidate);
82
83 if ( candidate_str.ends_with(value_str) ) {
84 candidate_str.erase(candidate_str.length() - value_str.length());
85 new_candidates.insert(stol(candidate_str));
86 }
87 }
88 }
89
90 candidates = new_candidates;
91 }
92
93 return values.size() == 1 && candidates.contains(values.back());
94 };
95
96 long sum = 0;
97 for ( const auto& [first, values]: data ) {
98 if ( can_evaluated(first, values) ) {
99 sum += first;
100 }
101 }
102 cout << sum << endl;
103}
104
105int
106main()
107{
108 auto data = read_file("data/day07.txt");
109
110 part1(data);
111 part2(data);
112}