Published
Edited
Dec 8, 2021
1 star
Insert cell
Insert cell
Insert cell
parse = (input) => {
return input
.split("\n")
.map((line) => line.split(" | "))
.map(([signals, output]) => [signals.split(" "), output.split(" ")]);
}
Insert cell
parse(testInput)
Insert cell
Insert cell
part1 = (input) => {
const lines = parse(input);
return lines.reduce((acc, [signals, output]) => {
return (
acc +
output.filter(
(digit) =>
digit.length === 2 ||
digit.length === 3 ||
digit.length === 4 ||
digit.length === 7
).length
);
}, 0);
}
Insert cell
part1(testInput)
Insert cell
Insert cell
part1(input)
Insert cell
Insert cell
signalDiff = (a, b) => {
const aArr = a.split(""),
bArr = b.split("");
if (aArr.length > bArr.length) return aArr.find((c) => !bArr.includes(c));
else return bArr.find((c) => !aArr.includes(c));
}
Insert cell
signalDiff("dab", "ba")
Insert cell
findSignalWithExtraSegment = ( known, signals ) => {
const requiredChars = known.split('');
return signals.find( s => {
if ( s.length !== known.length + 1 ) return false;
return requiredChars.every( c => s.includes( c ) );
})
}
Insert cell
findSignalWithExtraSegment("eafbd", [
"acedgfb",
"cdfbe",
"gcdfa",
"fbcad",
"dab",
"cefabd",
"cdfgeb",
"eafb",
"cagedb",
"ab"
])
Insert cell
decodeSignals = (signals) => {
const one = signals.find((s) => s.length === 2);
const seven = signals.find((s) => s.length === 3);
const four = signals.find((s) => s.length === 4);
const eight = signals.find((s) => s.length === 7);
const top = signalDiff(seven, one);
const nine = findSignalWithExtraSegment(four + top, signals);
const bottom = signalDiff(nine, four + top);
const three = findSignalWithExtraSegment(one + top + bottom, signals);
const middle = signalDiff(three, one + top + bottom);
const zero = signals.find((s) => s.length === 6 && !s.includes(middle));
const six = signals.find((s) => s.length === 6 && s !== zero && s !== nine);
const twoOrFive = signals.filter(
(s) => ![zero, one, three, four, six, seven, eight, nine].includes(s)
);
const five = findSignalWithExtraSegment(twoOrFive[0], [six])
? twoOrFive[0]
: twoOrFive[1];
const two = findSignalWithExtraSegment(twoOrFive[0], [six])
? twoOrFive[1]
: twoOrFive[0];

return [zero, one, two, three, four, five, six, seven, eight, nine];
}
Insert cell
decodeSignals(
"acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab".split(" ")
)
Insert cell
decodeOutput = (signals) => {
const sortedSignals = signals.map((s) => s.split("").sort().join(""));
return (digit) => sortedSignals.indexOf(digit.split("").sort().join(""));
}
Insert cell
decodeOutput(
decodeSignals(
"acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab".split(" ")
)
)("cdfeb")
Insert cell
part2 = (input) => {
const lines = parse(input);
return lines.map(([signals, digits]) => {
const decoder = decodeOutput(decodeSignals(signals));
return parseInt(digits.map(decoder).join(""));
});
}
Insert cell
part2(testInput)
Insert cell
part2(input).reduce((acc, n) => acc + n, 0)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more