function* q2(input) {
let { ids, expected } = input;
if (!expected) expected = undefined;
ids = ids
.map((val, offset) => ({
val: Number.isNaN(val) ? 0 : BigInt(val),
offset: BigInt(offset)
}))
.filter(({ val, offset }) => val);
let { val: v1, offset: o1 } = ids[0];
let n1 = v1;
let steps = [{ v1, n1 }];
for (let i = 1; i < ids.length; i++) {
let { val: v2, offset: o2 } = ids[i];
let n2 = 0n;
while ((n1 + o2) % v2 !== 0n) {
n1 += v1;
yield { n1, v1, o1, n2, v2, o2 };
}
steps.push({ n1, v1, n2, v2, o2 });
yield steps;
v1 = v1 * v2;
}
yield { steps, answer: n1, expected };
}