energized2 = {
await visibility();
const UP = 1 << 0,
DOWN = 1 << 1,
LEFT = 1 << 2,
RIGHT = 1 << 3;
const V = new Float32Array((W + 1) * (W + 1));
const COUNTS = [];
const valid = (d) => !(d < 0 || d >= W * (W + 1) || (1 + d) % (W + 1) === 0);
mutable best = count(W - 1 + 93 * (W + 1), LEFT);
for (let i = 0; i < W; ++i) {
COUNTS.push([...count(i, DOWN)].filter(valid).length);
COUNTS.push([...count(i * (W + 1), RIGHT)].filter(valid).length);
COUNTS.push([...count(i + (W - 1) * (W + 1), UP)].filter(valid).length);
COUNTS.push([...count(W - 1 + i * (W + 1), LEFT)].filter(valid).length);
yield COUNTS;
}
return COUNTS;
function count(i, dir) {
V.fill(0);
const energized = new Set([i]);
V[i] |= dir;
let s;
do {
for (const e of energized) {
if (V[e] & RIGHT) {
switch (input[e]) {
case ".":
case "-":
V[e + 1] |= RIGHT;
energized.add(e + 1);
break;
case "|":
V[e - (W + 1)] |= UP;
V[e + (W + 1)] |= DOWN;
energized.add(e - (W + 1));
energized.add(e + (W + 1));
break;
case "\\":
V[e + (W + 1)] |= DOWN;
energized.add(e + (W + 1));
break;
case "/":
V[e - (W + 1)] |= UP;
energized.add(e - (W + 1));
break;
}
}
if (V[e] & LEFT) {
switch (input[e]) {
case ".":
case "-":
V[e - 1] |= LEFT;
energized.add(e - 1);
break;
case "|":
V[e - (W + 1)] |= UP;
V[e + (W + 1)] |= DOWN;
energized.add(e - (W + 1));
energized.add(e + (W + 1));
break;
case "/":
V[e + (W + 1)] |= DOWN;
energized.add(e + (W + 1));
break;
case "\\":
V[e - (W + 1)] |= UP;
energized.add(e - (W + 1));
break;
}
}
if (V[e] & UP) {
switch (input[e]) {
case ".":
case "|":
V[e - (W + 1)] |= UP;
energized.add(e - (W + 1));
break;
case "-":
V[e - 1] |= LEFT;
V[e + 1] |= RIGHT;
energized.add(e - 1);
energized.add(e + 1);
break;
case "/":
V[e + 1] |= RIGHT;
energized.add(e + 1);
break;
case "\\":
V[e - 1] |= LEFT;
energized.add(e - 1);
break;
}
}
if (V[e] & DOWN) {
switch (input[e]) {
case ".":
case "|":
V[e + (W + 1)] |= DOWN;
energized.add(e + (W + 1));
break;
case "-":
V[e - 1] |= LEFT;
V[e + 1] |= RIGHT;
energized.add(e - 1);
energized.add(e + 1);
break;
case "\\":
V[e + 1] |= RIGHT;
energized.add(e + 1);
break;
case "/":
V[e - 1] |= LEFT;
energized.add(e - 1);
break;
}
}
}
const s0 = d3.sum(V);
if (s0 === s) break;
s = s0;
} while (true);
return energized;
}
}