-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay19.js
40 lines (33 loc) · 1.11 KB
/
Day19.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
const fs = require('node:fs');
const data = fs.readFileSync('input.txt').toString();
const [piecesRaw, resultsRaw] = data.split('\r\n\r\n')
const pieces = piecesRaw.split(', ');
const results = resultsRaw.split('\r\n');
let score = 0;
const pieceSet = {}
pieces.forEach((piece) => {
pieceSet[piece] = true; // can use that piece
});
results.forEach((result) => {
const subItems = [result];
let itemToScan = result;
const visited = {}; // from how many places this result can be reached
visited[result] = 1;
while (subItems.length) {
itemToScan = subItems.shift();
pieces.forEach((piece) => {
if (itemToScan.startsWith(piece)) {
const newItem = itemToScan.slice(piece.length);
if (visited[newItem]) {
visited[newItem] += visited[itemToScan];
} else {
subItems.push(newItem);
visited[newItem] = visited[itemToScan];
}
}
})
subItems.sort((a, b) => b.length - a.length);
}
score += visited[''] || 0;
});
console.log(score);