Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const fs = require("fs")
- const input = fs.readFileSync(__dirname + (process.argv.includes("--test") ? "/test.txt" : "/input.txt"), "utf8")
- const parseInput = (rawInput) =>
- rawInput.split(/\r?\n/).map((line) => {
- const [testValue, numbers] = line.split(":")
- return {
- testValue: Number(testValue),
- numbers: numbers.trim().split(" ").map(Number)
- }
- })
- const recurse = (numbers, target, allowConcat, index = 0, currentResult = numbers[0]) => {
- if (index === numbers.length - 1) {
- return currentResult === target
- }
- const nextNumber = numbers[index + 1]
- const nextIndex = index + 1
- if (currentResult + nextNumber <= target) {
- if (recurse(numbers, target, allowConcat, nextIndex, currentResult + nextNumber)) {
- return true
- }
- }
- if (currentResult * nextNumber <= target) {
- if (recurse(numbers, target, allowConcat, nextIndex, currentResult * nextNumber)) {
- return true
- }
- }
- if (allowConcat) {
- const concatenated = Number(currentResult + "" + nextNumber)
- if (concatenated <= target) {
- if (recurse(numbers, target, allowConcat, nextIndex, concatenated)) {
- return true
- }
- }
- }
- return false
- }
- const solve = (data, allowConcat) =>
- data.reduce((total, { testValue, numbers }) => {
- return total + (recurse(numbers, testValue, allowConcat) ? testValue : 0)
- }, 0)
- const data = parseInput(input)
- console.time("Part 1 Time")
- console.log("Part 1:", solve(data, false))
- console.timeEnd("Part 1 Time")
- console.time("Part 2 Time")
- console.log("Part 2:", solve(data, true))
- console.timeEnd("Part 2 Time")
Advertisement
Add Comment
Please, Sign In to add comment