mosredna

AoC 2024 day 7 recursive

Dec 7th, 2024
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 1.75 KB | Source Code | 0 0
  1. const fs = require("fs")
  2.  
  3. const input = fs.readFileSync(__dirname + (process.argv.includes("--test") ? "/test.txt" : "/input.txt"), "utf8")
  4.  
  5. const parseInput = (rawInput) =>
  6.     rawInput.split(/\r?\n/).map((line) => {
  7.         const [testValue, numbers] = line.split(":")
  8.         return {
  9.             testValue: Number(testValue),
  10.             numbers: numbers.trim().split(" ").map(Number)
  11.         }
  12.     })
  13.  
  14. const recurse = (numbers, target, allowConcat, index = 0, currentResult = numbers[0]) => {
  15.     if (index === numbers.length - 1) {
  16.         return currentResult === target
  17.     }
  18.  
  19.     const nextNumber = numbers[index + 1]
  20.     const nextIndex = index + 1
  21.  
  22.     if (currentResult + nextNumber <= target) {
  23.         if (recurse(numbers, target, allowConcat, nextIndex, currentResult + nextNumber)) {
  24.             return true
  25.         }
  26.     }
  27.  
  28.     if (currentResult * nextNumber <= target) {
  29.         if (recurse(numbers, target, allowConcat, nextIndex, currentResult * nextNumber)) {
  30.             return true
  31.         }
  32.     }
  33.  
  34.     if (allowConcat) {
  35.         const concatenated = Number(currentResult + "" + nextNumber)
  36.         if (concatenated <= target) {
  37.             if (recurse(numbers, target, allowConcat, nextIndex, concatenated)) {
  38.                 return true
  39.             }
  40.         }
  41.     }
  42.  
  43.     return false
  44. }
  45.  
  46. const solve = (data, allowConcat) =>
  47.     data.reduce((total, { testValue, numbers }) => {
  48.         return total + (recurse(numbers, testValue, allowConcat) ? testValue : 0)
  49.     }, 0)
  50.  
  51. const data = parseInput(input)
  52.  
  53. console.time("Part 1 Time")
  54. console.log("Part 1:", solve(data, false))
  55. console.timeEnd("Part 1 Time")
  56.  
  57. console.time("Part 2 Time")
  58. console.log("Part 2:", solve(data, true))
  59. console.timeEnd("Part 2 Time")
  60.  
Advertisement
Add Comment
Please, Sign In to add comment