function* simulate(order) {
let cave = "AA";
let t = 1;
let rate = 0;
let released = 0;
yield { cave, t, rate, released };
for (const valve of order) {
const d = distance(cave);
const dt = d.get(valve) + 1;
cave = valve;
t += dt;
released += rate * dt;
if (t >= 30) break;
rate += valves[cave].rate;
yield { cave, t, rate, released };
}
if (t <= 30) released += rate * (31 - t);
yield { cave, t: 30, rate, released };
}