function runStep(octopusesIn) {
let octopuses = new Map(Array.from(octopusesIn.entries()))
let hasFlashed = new Map()
octopuses.forEach( (val, key) => {
hasFlashed.set(key, false)
octopuses.set(key, val + 1)
})
let canFlash = false
octopuses.forEach( (val, key) => {
if (val > 9 && !hasFlashed.get(key))
canFlash = true
})
while (canFlash) {
octopuses.forEach( (val, key, map) => {
let [x, y] = key.split(" ").map(parseFloat)
if (val > 9 && !hasFlashed.get(key)) {
hasFlashed.set(key, true)
if (x > 0) {
octopuses.set(`${x - 1} ${y}`, octopuses.get(`${x - 1} ${y}`) + 1)
if (y > 0)
octopuses.set(`${x - 1} ${y - 1}`, octopuses.get(`${x - 1} ${y - 1}`) + 1)
if (y < Math.sqrt(map.size) - 1)
octopuses.set(`${x - 1} ${y + 1}`, octopuses.get(`${x - 1} ${y + 1}`) + 1)
}
if (x < Math.sqrt(map.size) - 1) {
octopuses.set(`${x + 1} ${y}`, octopuses.get(`${x + 1} ${y}`) + 1)
if (y > 0)
octopuses.set(`${x + 1} ${y - 1}`, octopuses.get(`${x + 1} ${y - 1}`) + 1)
if (y < Math.sqrt(map.size) - 1)
octopuses.set(`${x + 1} ${y + 1}`, octopuses.get(`${x + 1} ${y + 1}`) + 1)
}
if (y > 0)
octopuses.set(`${x} ${y - 1}`, octopuses.get(`${x} ${y - 1}`) + 1)
if (y < Math.sqrt(map.size) - 1)
octopuses.set(`${x} ${y + 1}`, octopuses.get(`${x} ${y + 1}`) + 1)
}
})
canFlash = false
octopuses.forEach( (val, key) => {
if (val > 9 && !hasFlashed.get(key))
canFlash = true
})
}
hasFlashed.forEach( (val, key) => {
if (val)
octopuses.set(key, 0)
})
return [octopuses, hasFlashed]
}