|
| 1 | +function correct(update, rules) { |
| 2 | + for (let i = 0; i < update.length; i++) { |
| 3 | + for (let j = 0; j < i; j++) { |
| 4 | + if (rules.has(`${update[i]}|${update[j]}`)) { |
| 5 | + return () => { |
| 6 | + let tmp = update[i]; |
| 7 | + update[i] = update[j]; |
| 8 | + update[j] = tmp; |
| 9 | + }; |
| 10 | + } |
| 11 | + } |
| 12 | + } |
| 13 | + return true; |
| 14 | +} |
| 15 | + |
1 | 16 | export function part1(input) { |
2 | 17 | let [rules, updates] = input.split("\n\n"); |
3 | 18 | let sum = 0; |
4 | | - rules = rules.split("\n").map(rule => rule.split("|").map(Number)); |
| 19 | + rules = new Set(rules.split("\n")); |
5 | 20 | updates = updates.split("\n").map(update => update.split(",").map(Number)); |
6 | 21 | for (const update of updates) { |
7 | 22 | let middle = update[(update.length - 1) / 2]; |
8 | | - for (let i = 0; i < update.length; i++) { |
9 | | - for (let j = 0; j < i; j++) { |
10 | | - if ( |
11 | | - rules.find(rule => rule[0] === update[i] && rule[1] === update[j]) |
12 | | - ) { |
13 | | - middle = 0; |
14 | | - break; |
15 | | - } |
16 | | - } |
17 | | - if (middle === 0) { |
18 | | - break; |
19 | | - } |
20 | | - } |
21 | | - sum += middle; |
| 23 | + if (correct(update, rules) === true) sum += middle; |
22 | 24 | } |
23 | 25 | return sum; |
24 | 26 | } |
25 | 27 |
|
26 | 28 | export function part2(input) { |
27 | 29 | let [rules, updates] = input.split("\n\n"); |
28 | 30 | let bad = []; |
29 | | - rules = rules.split("\n").map(rule => rule.split("|").map(Number)); |
| 31 | + rules = new Set(rules.split("\n")); |
30 | 32 | updates = updates.split("\n").map(update => update.split(",").map(Number)); |
31 | 33 | for (const update of updates) { |
32 | | - let middle = update[(update.length - 1) / 2]; |
33 | | - for (let i = 0; i < update.length; i++) { |
34 | | - for (let j = 0; j < i; j++) { |
35 | | - if ( |
36 | | - rules.find(rule => rule[0] === update[i] && rule[1] === update[j]) |
37 | | - ) { |
38 | | - bad.push(update); |
39 | | - middle = 0; |
40 | | - break; |
41 | | - } |
42 | | - } |
43 | | - if (middle === 0) { |
44 | | - break; |
45 | | - } |
46 | | - } |
| 34 | + if (correct(update, rules) !== true) bad.push(update); |
47 | 35 | } |
48 | 36 |
|
49 | 37 | let sum = 0; |
50 | 38 | for (const update of bad) { |
51 | | - let good = false; |
52 | | - while (!good) { |
53 | | - good = true; |
54 | | - for (let i = 0; i < update.length; i++) { |
55 | | - for (let j = 0; j < i; j++) { |
56 | | - if ( |
57 | | - rules.find(rule => rule[0] === update[i] && rule[1] === update[j]) |
58 | | - ) { |
59 | | - let tmp = update[i]; |
60 | | - update[i] = update[j]; |
61 | | - update[j] = tmp; |
62 | | - good = false; |
63 | | - } |
64 | | - } |
65 | | - } |
66 | | - } |
67 | | - let middle = update[(update.length - 1) / 2]; |
68 | | - sum += middle; |
| 39 | + let fix; |
| 40 | + do { |
| 41 | + fix = correct(update, rules); |
| 42 | + if (typeof fix === "function") fix(); |
| 43 | + } while (fix !== true); |
| 44 | + sum += update[(update.length - 1) / 2]; |
69 | 45 | } |
70 | 46 | return sum; |
71 | 47 | } |
0 commit comments