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];
}
}