-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday7.js
113 lines (104 loc) · 3.54 KB
/
day7.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
const fs = require("fs");
fs.readFile('day7data.txt', (err, data) => {
const rules = data.toString().split("\r\n");
// let bagTypes = [];
let bagInners= {}; // bag inners
let bagOuters = {}; // bag outers
const parseString = (s) => {
const [outer, inner] = s.split(' bags contain ');
// console.log(outer, ":", inner);
if (inner === 'no other bags.') {
return [outer, []];
}
let contains = inner.split(', ');
contains = contains.map((c) => {
const [num, c1, c2, bag] = c.split(' ');
return [c1, c2].join(' ');
})
return [outer, contains];
}
//first outermost layer
rules.forEach((r) => {
const [outer, inner] = parseString(r);
// console.log(outer, inner);
bagInners[outer] = inner;
// inner.forEach((b) => {
// bagOuters[b] = bagOuters[b] || [];
// bagOuters[b].push(outer);
// })
});
// go through and add all sublayers
rules.forEach((r) => {
const [outer, inner] = parseString(r);
// console.log(outer, inner);
let bagSuperInners = inner;
// console.log("superinners1 for", outer, bagSuperInners);
while (bagSuperInners.length > 0) {
const b = bagSuperInners.shift();
bagOuters[b] = bagOuters[b] || [];
if (!bagOuters[b].includes(outer)) {bagOuters[b].push(outer)};
bagSuperInners.push(...bagInners[b]);
// console.log("superinners2 for", outer, bagSuperInners);
}
// console.log("bagOuters", bagOuters);
if (bagOuters['shiny gold']) {console.log(bagOuters['shiny gold'], bagOuters['shiny gold'].length)};
});
});
fs.readFile('day7data.txt', (err, data) => {
const rules = data.toString().split("\r\n");
// let bagTypes = [];
let bagInners= {}; // bag inners
let bagOuters = {}; // bag outers
const parseString = (s) => {
const [outer, inner] = s.split(' bags contain ');
// console.log(outer, ":", inner);
if (inner === 'no other bags.') {
return [outer, []];
}
let contains = inner.split(', ');
contains = contains.map((c) => {
const [num, c1, c2, bag] = c.split(' ');
return [[c1, c2].join(' '), num];
})
return [outer, contains];
}
//first outermost layer
rules.forEach((r) => {
const [outer, inner] = parseString(r);
// console.log(outer, inner);
bagInners[outer] = inner;
// inner.forEach((b) => {
// bagOuters[b] = bagOuters[b] || [];
// bagOuters[b].push(outer);
// })
});
let counts = {};
// go through and add all sublayers
// rules.forEach((r) => {
// const [outer, inner] = parseString(r);
// console.log(outer, inner);
outer = 'shiny gold';
inner = bagInners[outer];
let bagSuperInners = inner;
// console.log("superinners1 for", outer, bagSuperInners);
while (bagSuperInners.length > 0) {
const b = bagSuperInners.shift();
// bagOuters[b] = bagOuters[b] || [];
// if (!bagOuters[b].includes(outer)) {
// bagOuters[b].push(outer);
// counts[b] +=
// };
// console.log("b", b);
counts[outer] = counts[outer] || 0;
const iter = parseInt(b[1]);
// console.log(iter);
counts[outer] += iter;
// console.log(Array(iter).fill(bagInners[b[0]]));
bagSuperInners.push(...Array(iter).fill(bagInners[b[0]]).flat());
console.log("superinners2 for", outer, bagSuperInners);
}
// console.log("bagOuters", bagOuters);
// if (bagOuters['shiny gold']) {console.log(bagOuters['shiny gold'], bagOuters['shiny gold'].length)};
if (counts['shiny gold']) {console.log("counts", counts['shiny gold'])};
// });
});