aboutsummaryrefslogtreecommitdiff
path: root/2015/src/day17.cpp
diff options
context:
space:
mode:
authorThomas Schmucker <ts@its1.de>2024-11-17 15:54:02 +0100
committerThomas Schmucker <ts@its1.de>2024-11-17 15:54:02 +0100
commitccf0e4ab6360b0038ed9a8c44dad840f5979230e (patch)
treebc0b1cc850cf96773b1bf679f8015db0277ff1b5 /2015/src/day17.cpp
parentf619033995b385168c01f645b4b85b9703d66f02 (diff)
downloadadvent-of-code-ccf0e4ab6360b0038ed9a8c44dad840f5979230e.tar.gz
advent-of-code-ccf0e4ab6360b0038ed9a8c44dad840f5979230e.tar.bz2
advent-of-code-ccf0e4ab6360b0038ed9a8c44dad840f5979230e.zip
aoc 2015, day 17
Diffstat (limited to '2015/src/day17.cpp')
-rw-r--r--2015/src/day17.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/2015/src/day17.cpp b/2015/src/day17.cpp
new file mode 100644
index 0000000..df70a31
--- /dev/null
+++ b/2015/src/day17.cpp
@@ -0,0 +1,118 @@
1#include <algorithm>
2#include <fstream>
3#include <iostream>
4#include <set>
5#include <vector>
6using namespace std;
7
8auto
9read_file(string_view filename)
10{
11 fstream input{ filename };
12 vector<long> records;
13
14 for ( long value{}; input >> value; ) {
15 records.emplace_back(value);
16 }
17 return records;
18}
19
20// https://stackoverflow.com/a/1617797
21template<typename Iterator>
22bool
23next_combination(const Iterator first, Iterator k, const Iterator last)
24{
25 if ( (first == last) || (first == k) || (last == k) )
26 return false;
27 Iterator i1 = first;
28 Iterator i2 = last;
29 ++i1;
30 if ( last == i1 )
31 return false;
32 i1 = last;
33 --i1;
34 i1 = k;
35 --i2;
36 while ( first != i1 ) {
37 if ( *--i1 < *i2 ) {
38 Iterator j = k;
39 while ( !(*i1 < *j) )
40 ++j;
41 std::iter_swap(i1, j);
42 ++i1;
43 ++j;
44 i2 = k;
45 std::rotate(i1, j, last);
46 while ( last != j ) {
47 ++j;
48 ++i2;
49 }
50 std::rotate(k, i2, last);
51 return true;
52 }
53 }
54 std::rotate(first, k, last);
55 return false;
56}
57
58void
59part1(const vector<long>& values)
60{
61 vector<size_t> indicies;
62 for ( size_t idx = 0; idx != values.size(); ++idx ) {
63 indicies.emplace_back(idx);
64 }
65
66 long count = 0;
67 for ( size_t comp_size = 1; comp_size != values.size(); ++comp_size ) {
68 sort(indicies.begin(), indicies.end());
69
70 do {
71 long sum = 0;
72 for ( size_t idx = 0; idx != comp_size; ++idx ) {
73 sum += values[indicies[idx]];
74 }
75 if ( sum == 150 ) {
76 count++;
77 }
78 } while ( next_combination(indicies.begin(), indicies.begin() + (long) comp_size, indicies.end()) );
79 }
80 cout << count << endl;
81}
82
83void
84part2(const vector<long>& values)
85{
86 vector<size_t> indicies;
87 for ( size_t idx = 0; idx != values.size(); ++idx ) {
88 indicies.emplace_back(idx);
89 }
90
91 long count = 0;
92 for ( size_t comp_size = 1; comp_size != values.size(); ++comp_size ) {
93 sort(indicies.begin(), indicies.end());
94
95 do {
96 long sum = 0;
97 for ( size_t idx = 0; idx != comp_size; ++idx ) {
98 sum += values[indicies[idx]];
99 }
100 if ( sum == 150 ) {
101 count++;
102 }
103 } while ( next_combination(indicies.begin(), indicies.begin() + (long) comp_size, indicies.end()) );
104
105 if ( count != 0 ) {
106 cout << count << endl;
107 return;
108 }
109 }
110}
111
112int
113main()
114{
115 auto records = read_file("data/day17.txt");
116 part1(records);
117 part2(records);
118}