-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjavascript.js
372 lines (372 loc) · 9.16 KB
/
javascript.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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
const LOCKS_TYPES = ["ss_f", "ss_m", "ss_n", "ss_asc", "ss_con", "ss_colv", "rs_f", "rs_n", "rs_colv", "gs_m"];
const tableauPeriodiqueDesElements = {
1: "H", // Hydrogène
2: "He", // Hélium
3: "Li", // Lithium
4: "Be", // Béryllium
5: "B", // Bore
6: "C", // Carbone
7: "N", // Azote
8: "O", // Oxygène
9: "F", // Fluor
10: "Ne", // Néon
11: "Na", // Sodium
12: "Mg", // Magnésium
13: "Al", // Aluminium
14: "Si", // Silicium
15: "P", // Phosphore
16: "S", // Soufre
17: "Cl", // Chlore
18: "Ar", // Argon
19: "K", // Potassium
20: "Ca", // Calcium
21: "Sc", // Scandium
22: "Ti", // Titane
23: "V", // Vanadium
24: "Cr", // Chrome
25: "Mn", // Manganèse
26: "Fe", // Fer
27: "Co", // Cobalt
28: "Ni", // Nickel
29: "Cu", // Cuivre
30: "Zn", // Zinc
31: "Ga", // Gallium
32: "Ge", // Germanium
33: "As", // Arsenic
34: "Se", // Sélénium
35: "Br", // Brome
36: "Kr", // Krypton
37: "Rb", // Rubidium
38: "Sr", // Strontium
39: "Y", // Yttrium
40: "Zr", // Zirconium
41: "Nb", // Niobium
42: "Mo", // Molybdène
43: "Tc", // Technétium
44: "Ru", // Ruthénium
45: "Rh", // Rhodium
46: "Pd", // Palladium
47: "Ag", // Argent
48: "Cd", // Cadmium
49: "In", // Indium
50: "Sn", // Étain
51: "Sb", // Antimoine
52: "Te", // Tellure
53: "I", // Iode
54: "Xe", // Xénon
55: "Cs", // Césium
56: "Ba", // Baryum
57: "La", // Lanthane
58: "Ce", // Cérium
59: "Pr", // Praséodyme
60: "Nd", // Néodyme
61: "Pm", // Prométhium
62: "Sm", // Samarium
63: "Eu", // Europium
64: "Gd", // Gadolinium
65: "Tb", // Terbium
66: "Dy", // Dysprosium
67: "Ho", // Holmium
68: "Er", // Erbium
69: "Tm", // Thulium
70: "Yb", // Ytterbium
71: "Lu", // Lutécium
72: "Hf", // Hafnium
73: "Ta", // Tantale
74: "W", // Tungstène
75: "Re", // Rhénium
76: "Os", // Osmium
77: "Ir", // Iridium
78: "Pt", // Platine
79: "Au", // Or
80: "Hg", // Mercure
81: "Tl", // Thallium
82: "Pb", // Plomb
83: "Bi", // Bismuth
84: "Po", // Polonium
85: "At", // Astate
86: "Rn", // Radon
87: "Fr", // Francium
88: "Ra", // Radium
89: "Ac", // Actinium
90: "Th", // Thorium
91: "Pa", // Protactinium
92: "U", // Uranium
93: "Np", // Neptunium
94: "Pu", // Plutonium
95: "Am", // Américium
96: "Cm", // Curium
97: "Bk", // Berkélium
98: "Cf", // Californium
99: "Es", // Einsteinium
100: "Fm", // Fermium
101: "Md", // Mendelevium
102: "No", // Nobelium
103: "Lr", // Lawrencium
104: "Rf", // Rutherfordium
105: "Db", // Dubnium
106: "Sg", // Seaborgium
107: "Bh", // Bohrium
108: "Hs", // Hassium
109: "Mt", // Meitnerium
110: "Ds", // Darmstadtium
111: "Rg", // Roentgenium
112: "Cn", // Copernicium
113: "Nh", // Nihonium
114: "Fl", // Flerovium
115: "Mc", // Moscovium
116: "Lv", // Livermorium
117: "Ts", // Tennessine
118: "Og", // Oganesson
};
const digits = [
[" ++++ ", "+ +", "+ +", "+ +", "+ +", " ++++ "],
[" ++++ ", "+++++ ", " +++ ", " +++ ", " +++ ", " +++++"],
[" +++++ ", "++ ++", " + ++ ", " ++ ", " ++ ", "+++++++"],
[" +++++ ", "++ ++", " ++ ", "++ ++", " +++++ ", " "],
[" ++++ ", " ++ ++", " ++ ++", "++++++++", " ++", " ++"],
["++++++", "+ ", "++++ ", " + ", " + ", "+++++ "],
[" +++ ", "+ ", "++++ ", "+ +", "+++ ", " "],
["++++++", " ++", " ++ ", " ++ ", " ++ ", " + "],
[" ++ ", "+ +", " ++ ", "+ +", " ++ ", " "],
[" ++++ ", "+ +", " ++++ ", " + ", " + ", ""], //J'ai enlevé le dernier string car le '+' n'etait pas adhjacent au autre et mon algorithme de detection de contours ne le prennais pas en compte
];
const colors = {
W: "GRAY",
w: "WHITE",
R: "RED",
r: "LIGHT_RED",
G: "GREEN",
g: "LIGHT_GREEN",
B: "BLUE",
b: "LIGHT_BLUE",
y: "YELLOW",
o: "ORANGE",
P: "PINK",
p: "LIGHT_PINK",
V: "VIOLET",
v: "LIGHT_VIOLET",
"?": "CORRUPT",
};
function ss_n(data) {
function fibonacci(n) {
if (n in cache) {
return cache[n];
}
let term = fibonacci(n - 2) + fibonacci(n - 1);
cache[n] = term;
return term;
}
let input = data.match(/\d+/g);
let start = parseInt(input[0]);
let targetTherm = parseInt(input[input.length - 1]);
let cache = { 1: start, 2: start };
return fibonacci(targetTherm + 1);
}
function rs_n(data) {
function arithmetique(terms, n) {
const r = terms[1] - terms[0];
let actualN = terms.length;
let term = terms[actualN - 1];
while (actualN != n) {
term += r;
actualN++;
}
return term;
}
const input = data.match(/\d+/g);
const targetTerm = parseInt(input[input.length - 1]);
const terms = [];
for (let i = 0; i < input.length - 1; i++) {
terms.push(parseInt(input[i]));
}
return arithmetique(terms, targetTerm + 1);
}
function ss_f(data) {
function isLower(char) {
return char == char.toLowerCase();
}
for (let i = 0; i < data.length; i++) {
if (isLower(data[i])) {
return data[i].charCodeAt(0) - "a".charCodeAt(0);
}
}
}
function rs_f(data) {
return data[0].charCodeAt(0) - "a".charCodeAt(0);
}
function gs_m(data) {
const input = data.match(/\d+/g);
return tableauPeriodiqueDesElements[input[0]];
}
function ss_m(data) {
for (const [key, value] of Object.entries(tableauPeriodiqueDesElements)) {
if (value == data) {
return key;
}
}
}
function ss_asc(data) {
function detectionContour(ascii) {
const indexHelper = [
[-1, -1],
[-1, 0],
[-1, 1],
[0, -1],
[0, 1],
[1, -1],
[1, 0],
[1, 1],
];
const contours = [];
const visited = new Array(ascii.length).fill(0).map((i) => new Array(ascii[i].length).fill(false));
function isValid(x, y) {
return y >= 0 && y < ascii.length && x >= 0 && x < ascii[y].length;
}
function dfs(x, y, contour) {
if (!isValid(x, y) || visited[y][x] || ascii[y][x] == " ") {
return;
}
visited[y][x] = true;
contour.push([y, x]);
for (let i = 0; i < indexHelper.length; i++) {
let dy = indexHelper[i][0];
let dx = indexHelper[i][1];
dfs(x + dx, y + dy, contour);
}
}
for (let y = 0; y < ascii.length; y++) {
for (let x = 0; x < ascii[y].length; x++) {
if (!visited[y][x] && ascii[y][x] == "+") {
let c = [];
dfs(x, y, c);
contours.push(c);
}
}
}
return contours;
}
function getMinMaxX(contour) {
let minX = Infinity;
let maxX = -Infinity;
for (let i = 0; i < contour.length; i++) {
const c = contour[i];
const x = c[1];
if (x > maxX) {
maxX = x;
}
if (x < minX) {
minX = x;
}
}
return [minX, maxX];
}
function checkDigit(matrix, digit) {
for (let i = 0; i < matrix.length; i++) {
if (digits[digit][i].trim() != matrix[i].join("").trim()) {
return false;
}
}
return true;
}
const contours = detectionContour(data);
let answer = "";
for (let iContour = 0; iContour < contours.length; iContour++) {
const contour = contours[iContour];
const [minX, maxX] = getMinMaxX(contour);
const matrix = new Array(data.length).fill(0).map(() => new Array(maxX - minX).fill(" "));
for (let i = 0; i < contour.length; i++) {
const y = contour[i][0];
const x = contour[i][1] - minX;
matrix[y][x] = "+";
}
for (let i = 0; i <= 9; i++) {
if (checkDigit(matrix, i)) {
answer += i;
}
}
}
return answer;
}
let last = false;
let count = 0;
function ss_con(data) {
const input = data.match(/¬[^¬]+\.\.\./g);
for (let i = 0; i < input.length; i++) {
if (input[i][1] == "r") {
console.error(i);
if (i == 0) {
if (count != 9) {
count++;
return 1;
} else {
count = 0;
return 0;
}
}
if (i == 5) {
return 0;
}
return i + 1;
}
}
return 0;
}
function ss_colv(data) {
const input = data.match(/¬[A-Za-z]\+/g);
console.error(input);
return colors[input[0][1]];
}
function rs_colv(data) {
return colors[data[1]];
}
while (true) {
const lines = parseInt(readline());
let lockType = null;
let data = [];
for (let i = 0; i < lines; i++) {
const line = readline();
console.error(line);
if (lockType == null) {
for (const _lockType of LOCKS_TYPES) {
if (line.indexOf(_lockType) != -1) {
lockType = _lockType;
}
}
continue;
}
data.push(line);
}
switch (lockType) {
case "ss_n":
console.log(ss_n(data[0]));
break;
case "rs_n":
console.log(rs_n(data[0]));
break;
case "ss_f":
console.log(ss_f(data[0]));
break;
case "rs_f":
console.log(rs_f(data[0]));
break;
case "gs_m":
console.log(gs_m(data[0]));
break;
case "ss_m":
console.log(ss_m(data[0]));
break;
case "ss_asc":
console.log(ss_asc(data));
break;
case "ss_con":
console.log(ss_con(data[0]));
break;
case "ss_colv":
console.log(ss_colv(data[0]));
break;
case "rs_colv":
console.log(rs_colv(data[0]));
break;
}
}