(Browser-based) Javascript
I got lazy for part 1 and stuffed the beam head's coordinates into a string instead of reusing my implementation that puts them into an int, gambling on part 1 not needing that extra bit of speed.
I did a similar mistake for part 2 as I did on day 6; I wrote a(n overkill) solution for keeping track of the entire path each beam/split follows - which involved cloning each array-storing-a-beam's-path at each split. Whereas on day 6 I got an "out of memory" error, this time I locked up my computer ๐ช ๐ฅ (Control+C doesn't exist in the browser console, and Control+W to close the tab wasn't getting through). Was very disappointed to realize we only need to keep track of the number of beams present at each position/index/abscissa without caring about which path they took to reach said index.
Code
function part1(inputText) {
let beams = new Set([inputText.indexOf('S')]);
const beamSplits = new Set();
const lines = inputText.trimEnd().split('\n');
for (let y = 1; y < lines.length; y++) {
const nextBeams = new Set();
for (const beamX of beams) {
if (lines[y][beamX] === '.') {
nextBeams.add(beamX);
} else if (lines[y][beamX]) {
beamSplits.add([beamX, y].toString());
nextBeams.add(beamX + 1);
nextBeams.add(beamX - 1);
}
}
beams = nextBeams;
}
return beamSplits.size;
}
{
const start = performance.now();
const result = part1(document.body.textContent);
const end = performance.now();
console.info({ day: 7, part: 1, time: end - start, result });
}
function part2(inputText) {
let beams = new Map([
[inputText.indexOf('S'), 1]
]);
const lines = inputText.trimEnd().split('\n');
for (let y = 1; y < lines.length; y++) {
// console.debug({ y, beams })
const nextBeams = new Map();
for (const [beamHeadX, beamCount] of beams) {
if (lines[y][beamHeadX] === '.') {
nextBeams.set(beamHeadX, (nextBeams.get(beamHeadX) ?? 0) + beamCount);
} else if (lines[y][beamHeadX] === '^') {
nextBeams.set(beamHeadX + 1, (nextBeams.get(beamHeadX + 1) ?? 0) + beamCount);
nextBeams.set(beamHeadX - 1, (nextBeams.get(beamHeadX - 1) ?? 0) + beamCount);
}
}
beams = nextBeams;
}
return beams.entries().reduce((accu, [_, count]) => accu + count, 0);
}
{
const start = performance.now();
const result = part2(document.body.textContent);
const end = performance.now();
console.info({
day: 7,
part: 2,
time: end - start,
result
})
}