-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
157 lines (140 loc) · 3.78 KB
/
main.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
Chaque ligne de l'entrée représente les composants d'un jeu:
- L'identifiant de la partie est fourni.
- Chaque séquence, séparée par un ';', représente un tour de la partie.
- Pour chaque tour, le nombre de cubes de chaque couleur est spécifié.
Dans la partie 1, l'objectif est de déterminer le nombre de parties valides, sachant que le nombre initial de cubes
est le suivant:
- 14 cubes bleus.
- 13 cubes verts.
- 12 cubes rouges.
Ensuite, il faut retourner la somme des identifiants des parties valides.
Dans la partie 2, l'objectif est de trouver, pour chaque partie, le nombre minimum de cubes de chaque couleur
nécessaire pour qu'elle soit valide.
Ensuite, il faut calculer le produit des nombres minimums pour chaque couleur.
La sortie attendue est la somme de ces produits.
*/
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
const int MAX_BLUE = 14;
const int MAX_GREEN = 13;
const int MAX_RED = 12;
vector<string> splitString(const string &input, const string &delimiter)
{
vector<string> tokens;
size_t start = 0, end = 0;
while ((end = input.find(delimiter, start)) != string::npos)
{
if (end != start)
{
tokens.push_back(input.substr(start, end - start));
}
start = end + delimiter.length();
}
if (start < input.length())
{
tokens.push_back(input.substr(start));
}
return tokens;
}
struct Sequence
{
int blue = 0;
int red = 0;
int green = 0;
};
class Input
{
public:
int id;
vector<Sequence> sequences;
Input(string s)
{
this->s = s;
getID();
getSequence();
}
private:
string s;
void getID()
{
size_t index = s.find(':');
string id = s.substr(0, index);
this->s = s.substr(index + 1);
this->id = stoi(id.substr(5));
}
void getSequence()
{
vector<string> seqs = splitString(s, ";");
for (string seqStr : seqs)
{
vector<string> colors = splitString(seqStr, ",");
Sequence seq;
for (string c : colors)
{
size_t _index = c.find(' ', 1);
int value = stoi(c.substr(1, _index));
if (c.find("blue") != string::npos)
{
seq.blue = value;
}
else if (c.find("red") != string::npos)
{
seq.red = value;
}
else if (c.find("green") != string::npos)
{
seq.green = value;
}
else
{
cerr << "Error Parsing" << seqStr << " Color: " << c << '\n';
}
}
sequences.push_back(seq);
}
}
};
int main()
{
int part1 = 0;
int part2 = 0;
string filename = "input.txt";
ifstream file(filename);
if (!file.is_open())
{
cerr << "Erreur : impossible d'ouvrir le fichier " << filename;
return 1;
}
string line;
while (getline(file, line))
{
Input i = {line};
bool valid = true;
int maxBlue = 0;
int maxRed = 0;
int maxGreen = 0;
for (Sequence s : i.sequences)
{
if (s.blue > MAX_BLUE || s.green > MAX_GREEN || s.red > MAX_RED)
{
valid = false;
}
maxBlue = max(maxBlue, s.blue);
maxRed = max(maxRed, s.red);
maxGreen = max(maxGreen, s.green);
}
if (valid)
{
part1 += i.id;
}
part2 += maxBlue * maxRed * maxGreen;
}
file.close();
cout << "Part1: " << part1 << '\n';
cout << "Part2: " << part2 << '\n';
return 0;
}