-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
191 lines (166 loc) · 5.81 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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/*
L'entrée représente le "schéma technique" d'une télécabine.
Dans la première partie, l'objectif est de calculer la somme des numéros des pièces de la machine.
Pour trouver une pièce dans le schéma, il faut respecter les conditions suivantes:
- Tout nombre adjacent à un symbole est un numéro de pièce.
- Un '.' n'est pas un symbole mais une case vide.
Pour la deuxième partie, l'objectif est de calculer la somme du "rapport de démultiplication" des engrenages.
Un engrenage doit respecter les conditions suivantes :
- Un engrenage a pour symbole '*'.
- Il doit avoir exactement 2 nombres adjacents au symbole.
Le "rapport de démultiplication" d'un engrenage est le produit des 2 nombres adjacents.
*/
#include <algorithm>
#include <array>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <Utils/MeasureExecutionTime.cpp>
using namespace std;
struct Point
{
int x, y;
bool operator==(const Point &p) const
{
return x == p.x && y == p.y;
}
};
vector<string> schematic;
vector<Point> dir = {{-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1}};
int parseInput()
{
MEASURE_FUNCTION_EXECUTION_TIME
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))
{
schematic.push_back(line);
}
file.close();
return 0;
}
int processPart1()
{
MEASURE_FUNCTION_EXECUTION_TIME
int maxY = schematic.size();
int maxX = schematic[0].size();
int sum = 0;
// Parcourir les lignes du schéma
for (int y = 0; y < maxY; y++)
{
// Parcourir les colonnes du schéma
for (int x = 0; x < maxX; x++)
{
// Si le caractère à la position (x, y) est un chiffre
if (isdigit(schematic[y][x]))
{
// Recherche de la fin du nombre
int endX = x;
while (endX < maxX && isdigit(schematic[y][endX]))
{
endX++;
}
// Vérification de l'adjacence avec un caractère autre que '.'
bool isValid = false;
for (int _x = x; _x < endX; _x++)
{
for (const Point &d : dir)
{
int adjX = _x + d.x;
int adjY = y + d.y;
if (adjX >= 0 && adjX < maxX && adjY >= 0 && adjY < maxY && !isdigit(schematic[adjY][adjX]) &&
schematic[adjY][adjX] != '.')
{
isValid = true;
break;
}
}
}
// Ajout du nombre à la somme si les conditions sont remplies
if (isValid)
{
sum += stoi(schematic[y].substr(x, endX - x));
}
// Mise à jour de la position x pour éviter de traiter à nouveau le même nombre
x = endX;
}
}
}
return sum;
}
int processPart2()
{
MEASURE_FUNCTION_EXECUTION_TIME
int maxY = schematic.size();
int maxX = schematic[0].size();
int sum = 0;
// Parcourir les lignes du schéma
for (int y = 0; y < maxY; y++)
{
// Parcourir les colonnes du schéma
for (int x = 0; x < maxX; x++)
{
// Si le caractère à la position (x, y) est '*'
if (schematic[y][x] == '*')
{
vector<Point> pointIsInNumbers; // Liste des points qui sont dans des nombres adjacents deja trouvé
vector<int> numbers; // Liste des nombres adjacents
// Parcourir les cases adjacentes
for (Point d : dir)
{
Point p = {x + d.x, y + d.y};
// Vérifier si la case adjacente contient un nombre
if (p.x >= 0 && p.x < maxX && p.y >= 0 && p.y < maxY && isdigit(schematic[p.y][p.x]))
{
// On vérifie que le nombre trouvé n'a pas déjà été trouvé avant
if (find(pointIsInNumbers.begin(), pointIsInNumbers.end(), p) == pointIsInNumbers.end())
{
// Récupérer le nombre
string number = "";
int _x = p.x;
while (_x >= 0 && isdigit(schematic[p.y][_x]))
{
number = schematic[p.y][_x] + number;
pointIsInNumbers.push_back({_x, p.y});
_x--;
}
_x = p.x + 1;
while (_x < maxX && isdigit(schematic[p.y][_x]))
{
number += schematic[p.y][_x];
pointIsInNumbers.push_back({_x, p.y});
_x++;
}
numbers.push_back(stoi(number));
}
}
}
// Si il y a exactement 2 nombres, ajouter le produit de ces nombres à la somme
if (numbers.size() == 2)
{
sum += numbers[0] * numbers[1];
}
}
}
}
return sum;
}
int main()
{
if (parseInput() == 1)
{
return 1;
}
int part1 = processPart1();
int part2 = processPart2();
cout << "\nPart1: " << part1 << '\n';
cout << "Part2: " << part2 << '\n';
return 0;
}