Skip to content

Instantly share code, notes, and snippets.

@pengx17
Created December 14, 2021 17:06
Show Gist options
  • Select an option

  • Save pengx17/af069dfdf2b40856800f9b05b6755aa6 to your computer and use it in GitHub Desktop.

Select an option

Save pengx17/af069dfdf2b40856800f9b05b6755aa6 to your computer and use it in GitHub Desktop.
const input = `NNCB
CH -> B
HH -> N
CB -> H
NH -> C
HB -> C
HC -> B
HN -> C
NN -> C
BH -> H
NC -> B
NB -> B
BN -> B
BB -> N
BC -> B
CC -> N
CN -> C`;
function run() {
let [original, rest] = input.split("\n\n");
let mapping = rest.split("\n").reduce((acc, line) => {
let [from, to] = line.split(" -> ");
acc[from] = to;
return acc;
}, {});
let pairs = new Map();
let lastTwo = original.slice(-2)
for (let i = 0; i < original.length - 1; i++) {
const pair = original[i] + original[i + 1];
pairs.set(pair, pairs.has(pair) ? pairs.get(pair) + 1 : 1);
}
function step(pairs) {
const newPairs = new Map();
for (let [pair, count] of pairs) {
const [l, r] = pair;
const c = mapping[pair];
if (c) {
[l + c, c + r].forEach((newPair) => {
newPairs.set(
newPair,
newPairs.has(newPair) ? newPairs.get(newPair) + count : count
);
});
} else {
newPairs.set(pair, count);
}
}
return newPairs;
}
for (let i = 0; i < 40; i++) {
pairs = step(pairs);
}
const score = Object.entries(
Array.from(pairs).reduce((acc, [pair, count]) => {
acc[pair[0]] = (acc[pair[0]] ?? 0) + count;
if (pair === lastTwo) {
acc[pair[1]] = (acc[pair[1]] ?? 0) + 1;
}
return acc;
}, {})
);
score.sort((a, b) => b[1] - a[1]);
console.log(score, score[0][1] - score[score.length - 1][1]);
}
run();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment