diff --git a/challenges/2021/14.js b/challenges/2021/14.js new file mode 100644 index 0000000..03114db --- /dev/null +++ b/challenges/2021/14.js @@ -0,0 +1,44 @@ +// Part 1 +const solvePuzzle1 = (input) => breedElements(input, 10); + +// Part 2 +const solvePuzzle2 = (input) => breedElements(input, 40); + +const breedElements = (input, steps) => { + input = parseInput(input); + const [template, ...pairs] = input; + const polymerTemplate = template.split(""); + + const pairMap = new Map(pairs.map((l) => l.split(" -> "))); + const pairCounts = new Map(); + + const frequencies = {}; + polymerTemplate.forEach((x) => (frequencies[x] = (frequencies[x] || 0) + 1)); + + for (let j = 0; j < polymerTemplate.length - 1; j++) { + const pair = polymerTemplate[j] + polymerTemplate[j + 1]; + pairCounts.set(pair, (pairCounts.get(pair) || 0) + 1); + } + + for (let i = 0; i < steps; i++) { + const copyOfPairCounts = new Map(pairCounts); + for (let [pair, count] of copyOfPairCounts) { + const midChar = pairMap.get(pair); + const [leftPair, rightPair] = [pair[0] + midChar, midChar + pair[1]]; + + frequencies[midChar] = (frequencies[midChar] || 0) + count; + + pairCounts.set(pair, pairCounts.get(pair) - count); + pairCounts.set(leftPair, (pairCounts.get(leftPair) || 0) + count); + pairCounts.set(rightPair, (pairCounts.get(rightPair) || 0) + count); + } + } + + const sortedFrequencies = Array.from(Object.entries(frequencies)).sort(([_, a], [__, b]) => a - b); + return sortedFrequencies[sortedFrequencies.length - 1][1] - sortedFrequencies[0][1]; +}; + +const parseInput = (input) => input.split("\n").filter((x) => x !== ""); + +require(__dirname + "/../../utils/test.js").test(__filename, __dirname, solvePuzzle1); +require(__dirname + "/../../utils/test.js").test(__filename, __dirname, solvePuzzle2); diff --git a/challenges/2021/inputs/14.txt b/challenges/2021/inputs/14.txt new file mode 100644 index 0000000..37f0e81 --- /dev/null +++ b/challenges/2021/inputs/14.txt @@ -0,0 +1,102 @@ +FSHBKOOPCFSFKONFNFBB + +FO -> K +FF -> H +SN -> C +CC -> S +BB -> V +FK -> H +PC -> P +PH -> N +OB -> O +PV -> C +BH -> B +HO -> C +VF -> H +HB -> O +VO -> N +HK -> N +OF -> V +PF -> C +KS -> H +KV -> F +PO -> B +BF -> P +OO -> B +PS -> S +KC -> P +BV -> K +OC -> B +SH -> C +SF -> P +NH -> C +BS -> C +VH -> F +CH -> S +BC -> B +ON -> K +FH -> O +HN -> O +HS -> C +KK -> V +OK -> K +VC -> H +HV -> F +FS -> H +OV -> P +HF -> F +FB -> O +CK -> O +HP -> C +NN -> V +PP -> F +FC -> O +SK -> N +FN -> K +HH -> F +BP -> O +CP -> K +VV -> S +BO -> N +KN -> S +SB -> B +SC -> H +OS -> S +CF -> K +OP -> P +CO -> C +VK -> C +NB -> K +PB -> S +FV -> B +CS -> C +HC -> P +PK -> V +BK -> P +KF -> V +NS -> P +SO -> C +CV -> P +NP -> V +VB -> F +KO -> C +KP -> F +KH -> N +VN -> S +NO -> P +NF -> K +CB -> H +VS -> V +NK -> N +KB -> C +SV -> F +NC -> H +VP -> K +PN -> H +OH -> K +CN -> N +BN -> F +NV -> K +SP -> S +SS -> K +FP -> S \ No newline at end of file