mirror of
https://github.com/seigler/aoc2021
synced 2025-07-27 01:16:09 +00:00
124 lines
3.9 KiB
JavaScript
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
|
|
*/
|