-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
137 lines (114 loc) · 2.72 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
/*
L'entrée représente une liste de chaînes de caractères, comme on les représenterait dans du code, c'est-à-dire avec
des '"' au début et des caractères d'échappement '\'.
Pour la partie 1, l'objectif est de calculer la différence de taille entre la chaîne encodée pour être écrite dans
du code et la taille en mémoire.
Pour la partie 2, l'objectif est le même que pour la partie 1, sauf que l'on doit encoder la chaîne en lui ajoutant
des '"' et des caractères d'espacement.
Le calcul de la taille se fait au nombre de caractères.
*/
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <Utils/MeasureExecutionTime.cpp>
using namespace std;
vector<string> input;
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 << '\n';
return 1;
}
string line;
while (getline(file, line))
{
input.push_back(line);
}
file.close();
return 0;
}
// Fonction pour obtenir la taille en mémoire d'une chaîne donnée.
int getMemorySize(string &s)
{
int n = 0;
for (size_t i = 1; i < s.size() - 1; i++)
{
if (s[i] == '\\')
{
char nextChar = s[i + 1];
if (nextChar == '\\' || nextChar == '\"')
{
i++;
}
else if (nextChar == 'x')
{
i += 3;
}
}
n++;
}
return n;
}
// Fonction pour obtenir la taille de la chaîne encodée.
int sizeStringEncoded(string &s)
{
string newString = "\"";
for (char c : s)
{
if (c == '\\')
{
newString += "\\\\";
}
else if (c == '"')
{
newString += "\\\"";
}
else
{
newString += c;
}
}
newString += '"';
return newString.size();
}
int processPart1()
{
MEASURE_FUNCTION_EXECUTION_TIME
int codeSize = 0;
int memorySize = 0;
for (string s : input)
{
codeSize += s.size();
memorySize += getMemorySize(s);
}
return codeSize - memorySize;
}
int processPart2()
{
MEASURE_FUNCTION_EXECUTION_TIME
int codeSize = 0;
int memorySize = 0;
for (string s : input)
{
codeSize += sizeStringEncoded(s);
memorySize += s.size();
}
return codeSize - memorySize;
}
int main()
{
if (parseInput() == 1)
{
return 1;
}
int part1 = processPart1();
int part2 = processPart2();
cout << "\nPart1: " << part1 << '\n';
cout << "Part2: " << part2 << '\n';
return 0;
}