-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday4.cpp
91 lines (84 loc) · 2.04 KB
/
day4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <array>
#include <numeric>
#include <sstream>
#include "AOC_Solver.h"
uint64_t aoc::day4::part_1(const std::vector<std::string>& input)
{
std::vector<std::array<int,25>>boards{};
for (size_t i = 2; i < input.size(); i += 6){
std::array<int, 25>board{};
for (int j = 0; j < 5; ++j){
std::stringstream stream(input[i + j]);
for (int k,x=0; stream >> k;){
board[j*5+(x++)]=k;
}
}
boards.push_back(board);
}
std::stringstream stream(input[0]);
for (int i; stream >> i;)
{
if (stream.peek() == ',')
stream.ignore();
for (auto& j : boards){
if (auto it = std::ranges::find(j, i); it != j.end())
*it = 0;
for (int k = 0; k < 5; ++k){
if (j[k * 5 + k])continue;
int sum_hor{ 0 };
int sum_ver{ 0 };
for (int x = 0; x < 5; ++x){
sum_hor += j[k * 5 + x];
sum_ver += j[5 * x + k];
}
if (!sum_hor || !sum_ver)
return std::accumulate(j.begin(), j.end(), 0ll) * i;
}
}
}
return 0;
}
uint64_t aoc::day4::part_2(const std::vector<std::string>& input)
{
std::vector<std::array<int, 25>>boards{};
for (size_t i = 2; i < input.size(); i += 6){
std::array<int, 25>board{};
for (int j = 0; j < 5; ++j){
std::stringstream stream(input[i + j]);
for (int k,x=0; stream >> k;){
board[j*5+(x++)]=k;
}
}
boards.push_back(board);
}
std::stringstream stream(input[0]);
for (int i; stream >> i;){
if (stream.peek() == ',')
stream.ignore();
for (auto it = boards.begin(); it != boards.end();){
if (auto it_1 = std::ranges::find((*it), i); it_1 != (*it).end())
*it_1 = 0;
bool winner = false;
for (int k = 0; k < 5; ++k){
if ((*it)[k * 5 + k])continue;
int sum_hor = 0;
int sum_ver = 0;
for (int x = 0; x < 5; ++x){
sum_hor += (*it)[k * 5 + x];
sum_ver += (*it)[5 * x + k];
}
if (!sum_hor || !sum_ver){
winner = true;
break;
}
}
if (winner && boards.size() > 1)
it = boards.erase(it);
else if (winner)
return std::accumulate((*it).begin(), (*it).end(), 0ll) * i;
else
++it;
}
}
return 0;
}