-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
169 lines (152 loc) · 5.31 KB
/
main.js
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
/*
L'input représente une liste de paires de paquets sous forme de tableau, chaque paire est séparée par une ligne vide.
Dans la partie 1, le but est de comparer les paires pour déterminer si elles sont dans le bon ordre.
Le processus de comparaison des paires est le suivant: On parcourt le tableau des paires en comparant les valeurs comme suit:
- Si les deux valeurs sont des nombres:
- Si le nombre1 est supérieur à nombre2, les entrées ne sont pas dans le bon ordre.
- Si le nombre1 est égal à nombre2, on passe à l'index suivant.
- Si le nombre1 est inférieur à nombre2, les entrées sont dans le bon ordre.
- Si les deux valeurs sont des listes:
- On compare les deux listes en suivant la même procédure que décrite ci-dessus.
- Si, pendant le parcours, la liste1 manque d'éléments en premier, les entrées sont dans le bon ordre.
- Si la liste de droite manque d'éléments en premier, les entrées ne sont pas dans le bon ordre.
- Si une seule valeur est un tableau, transformez la valeur qui ne l'est pas en tableau. Par exemple: "[0,0,0] et 2" devient "[0,0,0] et [2]".
La réponse attendue est la somme des indices des paires qui sont dans le bon ordre.
Dans la partie 2, nous devons ajouter deux paquets "[[2]]" et "[[6]]" et trier l'intégralité des paquets par rapport à la comparaison décrite ci-dessus.
Le résultat attendu est le produit des indices des deux paquets que nous venons d'ajouter dans la liste triée.
*/
const fs = require("fs");
const readline = require("readline");
const path = "input.txt";
let sum = 0;
let indexPair = 1;
const packetList = [];
let PAIR1 = "";
let PAIR2 = "";
const lectureInterface = readline.createInterface({
input: fs.createReadStream(path),
output: process.stdout,
terminal: false,
});
lectureInterface.on("line", (ligne) => {
if (PAIR1.length == 0) {
PAIR1 = ligne;
} else if (PAIR2.length == 0) {
PAIR2 = ligne;
processPair(PAIR1, PAIR2);
packetList.push(PAIR1, PAIR2);
} else {
PAIR1 = "";
PAIR2 = "";
}
});
lectureInterface.on("close", () => {
console.log("Part1:", sum);
packetList.push("[[2]]", "[[6]]");
packetList.sort((a, b) => {
const value = processPair(a, b);
if (value) {
return -1;
}
return 1;
});
const index1 = packetList.indexOf("[[2]]") + 1;
const index2 = packetList.indexOf("[[6]]") + 1;
console.log("Part2:", index1 * index2);
});
function processPair(pair1, pair2) {
const arr1 = parseString(pair1)[0];
const arr2 = parseString(pair2)[0];
const value = compareArray(arr1, arr2);
if (value) {
sum += indexPair;
}
indexPair++;
return value;
}
function compareArray(arr1, arr2) {
//Parcourir les 2 tableaux jusqu'à arr1.length
for (let i = 0; i < arr1.length; i++) {
//Si arr1 est plus grand qu'arr2, return false
if (arr2.length > i) {
//Si les deux valeurs sont des nombres
if (!Array.isArray(arr1[i]) && !Array.isArray(arr2[i])) {
//Continuer si les deux valeurs sont les mêmes
if (arr1[i] == arr2[i]) {
continue;
}
//Si arr1[i] est inférieur à arr2[i], alors le paquet est dans le bon ordre
else if (arr1[i] < arr2[i]) {
return true;
}
//Sinon le paquet n'est pas dans le bon ordre
return false;
}
//L'un des deux est une liste
else {
//Transformez en liste si l'une des valeurs n'est pas un tableau
if (!Array.isArray(arr2[i])) {
arr2[i] = [arr2[i]];
} else if (!Array.isArray(arr1[i])) {
arr1[i] = [arr1[i]];
}
const value = compareArray(arr1[i], arr2[i]);
if (value == null) {
continue;
}
return value;
}
} else {
return false;
}
}
//Les tableaux sont les mêmes car nous sommes sortis de la boucle de comparaison et leur longeur sont égale.
if (arr1.length == arr2.length) {
return null;
}
//arr1 est plus petit qu'arr2
return true;
}
function parseString(s) {
const arr = [];
let index = 0;
//Parcourir la chaine
while (index < s.length) {
//Si le caractère est une ouverture de crochet
if (s[index] == "[") {
let count = 1;
let indexEnd = index + 1;
//Chercher la fermeture des crochets
while (count > 0) {
if (s[indexEnd] == "[") {
count++;
} else if (s[indexEnd] == "]") {
count--;
}
indexEnd++;
}
_s = s.substring(index + 1, indexEnd - 1);
arr.push(parseString(_s)); //Appel récursif de la fonction avec la sous chaine trouvée au dessus et ajout du résultat a l'array
index = indexEnd + 1;
} /* Si on trouve une virgule, on skip */ else if (s[index] == ",") {
index++;
} /* On a trouvé un nombre */ else {
const commaIndex = s.indexOf(",", index);
//Si plus de virgule dans la chaine, nous sommes à la fin, on ajoute le nombre a l'array
if (commaIndex == -1) {
const number = parseInt(s.substring(index, s.length));
if (!isNaN(number)) {
arr.push(number);
}
break;
}
//Sinon on ajoute le nombre a l'array et on continue
else {
const number = parseInt(s.substring(index, commaIndex));
arr.push(number);
index = commaIndex + 1;
}
}
}
return arr;
}