Published
Edited
Dec 4, 2019
Insert cell
Insert cell
input = [278384, 824795]
Insert cell
function* range([min, max]) {
for (let i = min; i <= max; i++) {
const digits = String(i)
.split('')
.map(Number);
if (neverDecrease(digits) && adjacentSame(digits)) yield digits;
}
}
Insert cell
part1 = [...range(input)]
Insert cell
part2 = part1.filter(digits => shortestSame(digits) === 2)
Insert cell
neverDecrease = digits =>
digits.reduce(
(increase, d, i, digits) => increase && (i === 0 || digits[i - 1] <= d),
true
)
Insert cell
adjacentSame = digits =>
digits.some((d, i, digits) => i > 0 && digits[i - 1] === d)
Insert cell
shortestSame = digits => {
let last = digits[0];
let min = Infinity;
let run = 1;
for (let i = 1; i < digits.length; i++) {
if (digits[i] === last) {
run++;
} else {
if (run >= 2) min = Math.min(min, run);
last = digits[i];
run = 1;
}
}
if (run >= 2) min = Math.min(min, run);
return min;
}
Insert cell
shortestSame([1, 1, 2, 2, 3, 3])
Insert cell
shortestSame([1, 2, 3, 4, 4, 4])
Insert cell
shortestSame([1, 1, 1, 1, 2, 2])
Insert cell
shortestSame([3, 3, 3, 4, 4, 7])
Insert cell
adjacentSame([1, 2, 3, 4, 1])
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