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

  • Jayjader
    link
    fedilink
    arrow-up
    2
    ·
    8 months ago

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