(Browser-based) Javascript
For part 2, I eagerly wrote a nice, clean, generic, functional depth-first search, only to get an out of memory error ๐ญ. Note the top-level code blocks: they scope the variables declared inside them, allowing me to run the whole script repeatedly in the console without getting "redeclared variable name" errors.
function part1(inputText) {
let totalOutputJoltage = 0;
for (const batteryBankDef of inputText.split('\n')) {
let bestBankJoltage = 0;
const previousDigits = [];
for (const character of batteryBankDef) {
const currentDigit = Number.parseInt(character, 10);
for (const previousDigit of previousDigits) {
const possibleVoltage = 10 * previousDigit + currentDigit;
if (possibleVoltage > bestBankJoltage) {
bestBankJoltage = possibleVoltage;
}
}
previousDigits.push(currentDigit);
}
totalOutputJoltage += bestBankJoltage;
}
return totalOutputJoltage;
}
{
const start = performance.now();
const result = part1(document.body.textContent)
const end = performance.now();
console.info({day: 3, part: 1, result, time: end - start})
}
function findNthDigitForSequence(bankDef, n, startIndex) {
let digit = 9;
while (digit > 0) {
for (let i = startIndex; i < bankDef.length - 11 + n; i++) {
if (bankDef[i] === digit.toString()) {
return [digit, i]
}
}
digit--;
}
return undefined;
}
function findBestJoltageForBank(bankDef) {
const digits = [];
let previousFoundDigitIndex = -1;
for (let i = 0; i < 12; i++) {
const digitFound = findNthDigitForSequence(bankDef, i, previousFoundDigitIndex + 1);
if (digitFound === undefined) {
debugger;
return undefined;
}
const [digit, index] = digitFound;
digits.push(digit);
previousFoundDigitIndex = index;
}
return Number.parseInt(digits.join(''), 10);
}
function part2(inputText) {
let totalOutputJoltage = 0;
for (const batteryBankDef of inputText.trim().split('\n')) {
totalOutputJoltage += findBestJoltageForBank(batteryBankDef) ?? 0;
}
return totalOutputJoltage;
}
{
const start = performance.now();
const result = part2(document.body.textContent);
const end = performance.now();
console.info({ day: 3, part: 2, time: end - start, result });
}