Published
Edited
Dec 12, 2018
2 stars
Insert cell
Insert cell
Insert cell
function* evolve () {
let offset = 0;
let state = startState;

while (true) {
state = '.....' + state + '.....';
offset += 3;
let nextState = [];

for (let i = 2; i < state.length - 2; i++) {
let window = state.slice(i-2, i+3);
nextState.push(rules[window] || state[i]);
}

while (nextState[0] === '.') {
nextState = nextState.slice(1);
offset -= 1;
}

while (nextState[nextState.length - 1] === '.') {
nextState = nextState.slice(0, -1);
}

state = nextState.join('');
yield [state, offset];
}
}
Insert cell
function sumPotIndices (state, offset) {
let out = 0;
for (let i = 0; i < state.length; i++) {
if (state[i] === '#') {
out += (i - offset);
}
}
return out;
}
Insert cell
part1Sum = {
const gen = evolve();
let state, offset;

for (let g = 1; g <= 20; g++) {
[state, offset] = gen.next().value;
}
return sumPotIndices(state, offset);
}
Insert cell
Insert cell
Insert cell
Insert cell
part2Sum = {
const gen = evolve();
const numGenerations = 50000000000;

let prevSum = 0;
let prevDifference;
let repeatCount = 0;
for (let g = 1; g <= numGenerations; g += 1) {
const sum = sumPotIndices(...gen.next().value);

if (sum - prevSum === prevDifference) {
repeatCount++;
if (repeatCount > 10) {
return (sum + (numGenerations - g) * prevDifference);
}
} else {
prevDifference = sum - prevSum;
prevSum = sum;
}
}
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
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