function tick(state) {
const nextState = {},
counts = {}
for (const [key, type] of Object.entries(state)) {
for (const n of neighbors(key.split(',').map(Number))) {
if (n[0] < 0 || n[0] >= length || n[1] < 0 || n[1] >= length)
continue
const c = counts[n] = counts[n] || {}
c[type] = (c[type] || 0) + 1
}
}
for (const [key, c] of Object.entries(counts)) {
switch (state[key]) {
case undefined:
if (c['|'] >= 3)
nextState[key] = '|'
break
case '|':
nextState[key] = c['#'] >= 3 ? '#' : '|'
break
case '#':
if (c['#'] >= 1 && c['|'] >= 1)
nextState[key] = '#'
break
}
}
return nextState
}