Day 3: Lobby
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465


(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 }); }