aoc2021/src/day08/index.js
Joshua Seigler ac0d71598c day 8
2021-12-08 01:31:14 -05:00

124 lines
3.9 KiB
JavaScript

import run from "aocrunner"
const parseInput = (rawInput) =>
rawInput
.split("\n")
.map((x) =>
x
.split(" | ")
.map((x) => x.split(" ").map((x) => [...x].sort().join(""))),
)
const part1 = (rawInput) => {
const input = parseInput(rawInput)
return input.reduce(
(acc, [samples, outputs]) =>
acc + outputs.filter((x) => [2, 4, 3, 7].includes(x.length)).length,
0,
)
}
const part2 = (rawInput) => {
function frequencies(str) {
return str.split("").reduce((total, letter) => {
total[letter] ? total[letter]++ : (total[letter] = 1)
return total
}, {})
}
const input = parseInput(rawInput)
return input.reduce((acc, [samples, outputs]) => {
const freq = Object.entries(frequencies(samples.join("")))
const segments = Array(7)
segments[4] = freq.find((x) => x[1] == 4)[0]
const one = samples.find((x) => x.length == 2)
const four = samples.find((x) => x.length == 4)
const seven = samples.find((x) => x.length == 3)
const eight = samples.find((x) => x.length == 7)
segments[0] = [...seven].filter((x) => one.indexOf(x) < 0)[0]
const two = samples.find(
(x) => x.length == 5 && x.indexOf(segments[4]) >= 0,
)
segments[2] = freq.find((x) => x[1] == 8 && x[0] != segments[0])[0]
const five = samples.find(
(x) => x.length == 5 && x.indexOf(segments[2]) < 0,
)
const three = samples.find((x) => x.length == 5 && x != two && x != five)
const six = samples.find((x) => x.length == 6 && x.indexOf(segments[2]) < 0)
const nine = samples.find(
(x) => x.length == 6 && x.indexOf(segments[4]) < 0,
)
const zero = samples.find((x) => x.length == 6 && x != six && x != nine)
const key = [zero, one, two, three, four, five, six, seven, eight, nine]
return (
acc +
parseInt(
outputs.reduce((acc, digit) => acc + key.indexOf(digit), ""),
10,
)
)
}, 0)
}
run({
part1: {
tests: [
{
input: `be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce`,
expected: 26,
},
],
solution: part1,
},
part2: {
tests: [
{
input: `be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce`,
expected: 61229,
},
],
solution: part2,
},
trimTestInputs: true,
})
/*
number of segments
0: 6
1: 2
2: 5
3: 5
4: 4
5: 5
6: 6
7: 3
8: 7
9: 6
segment # usage count
0: 8
1: 6
2: 8
3: 7
4: 4
5: 9
6: 7
*/