import { readFileSync } from 'node:fs'; let sampleMode = false; let usedArray = []; const sampleArray = readFileSync('sample.txt').toString().split("\n"); const inputArray = readFileSync('input.txt').toString().split("\n"); if (sampleMode) { usedArray = sampleArray; } else { usedArray = inputArray; } // Part One console.time("part1"); let total = 0; const problems = []; for (const row of usedArray) { const contents = row.trim().split(/\s+/); for (let i = 0; i < contents.length; i++) { const element = contents[i]; if (!problems[i]) { problems[i] = []; } problems[i].push(element); } } for (let problem of problems) { problem = problem.reverse(); const operator = problem.shift(); let answer = operator === '+' ? 0 : 1; for (const number of problem) { if (operator === '+') { answer += Number.parseInt(number); } else { answer *= Number.parseInt(number); } } total += answer; } console.timeEnd("part1"); console.log(total); // Part Two console.time("part2"); let total2 = 0; let newInput = JSON.parse(JSON.stringify(usedArray)); for (let rowIndex = 0; rowIndex < newInput.length; rowIndex++) { const row = newInput[rowIndex]; newInput[rowIndex] = row.split(""); } const problemStarts = []; const operatorRowArray = newInput[usedArray.length - 1]; for (let i = 0; i < operatorRowArray.length; i++) { if (["*", "+"].includes(operatorRowArray[i])) { problemStarts.push(i); } } for (let rowIndex = 0; rowIndex < usedArray.length; rowIndex++) { const row = usedArray[rowIndex]; for (let i = 0; i < row.length; i++) { const char = row[i]; if (char === " " && !problemStarts.includes(i + 1)) { newInput[rowIndex][i] = '#'; } } } for (let rowIndex = 0; rowIndex < newInput.length; rowIndex++) { const row = newInput[rowIndex]; newInput[rowIndex] = row.join(""); } const problems2 = []; for (const row of newInput) { const contents = row.trim().split(/\s+/); for (let i = 0; i < contents.length; i++) { const element = contents[i]; if (!problems2[i]) { problems2[i] = []; } problems2[i].push(element); } } let problemsVertical = []; for (let i = 0; i < problems2.length; i++) { const problem = problems2[i]; let vertProblem = []; for (let j = 0; j < problem.length - 1; j++) { const newElement = (problem[0] && problem[0][j] && problem[0][j] !== '#' ? problem[0][j] : '') + (problem[1] && problem[1][j] && problem[1][j] !== '#' ? problem[1][j] : '') + (problem[2] && problem[2][j] && problem[2][j] !== '#' ? problem[2][j] : '') + (problem[3] && problem[3][j] && problem[3][j] !== '#' ? problem[3][j] : '') + (problem[4] && problem[4][j] && problem[4][j] !== '#' ? problem[4][j] : ''); if (Number.parseInt(newElement)) { vertProblem.push(Number.parseInt(newElement)); } } vertProblem.push(problem[problem.length - 1]); problemsVertical.push(vertProblem); } for (let problem of problemsVertical) { problem = problem.reverse(); const operator = problem.shift(); let answer = operator.includes('+') ? 0 : 1; for (const number of problem) { if (operator.includes('+')) { answer += Number.parseInt(number); } else { answer *= Number.parseInt(number); } } total2 += answer; } console.timeEnd("part2"); console.log(total2); // functions