export async function solveTask3part1() { const decoder = new TextDecoder("utf-8"); const inputData = await Deno.readFile('./3/input.txt'); const input = decoder.decode(inputData); // console.log(input) let curStep = 0 let step0Incr = '' let firstNumber:number|undefined = undefined; let secondNumber:number|undefined = undefined; const reset = () => { curStep = 0; step0Incr = ''; firstNumber = undefined; secondNumber = undefined } const validOps = []; for (const char of input) { switch (curStep) { // 0: starts with 'mul(' case 0: { if (char === 'mul('[step0Incr.length]) { step0Incr += char; if (step0Incr.length === 4) { curStep = 1; } } else { reset() } break; } // 1: first number case 1: { if (firstNumber !== undefined && char === ',') { curStep = 2; break; } if ((firstNumber ?? 0).toString().length >= 3) { reset(); break; } const intCurChar = parseInt(char); const firstNumberString = (firstNumber ?? 0).toString() + char; const temp_firstNumber = parseInt(firstNumberString); if (isNaN(intCurChar) || isNaN(temp_firstNumber)) { reset(); break; } firstNumber = temp_firstNumber; break; } // 2: second number case 2: { if (firstNumber === undefined) throw new Error('firstNumber was undefined in Step 2?') if (secondNumber !== undefined && char === ')') { validOps.push({ firstNumber, secondNumber }); reset(); break; } if ((secondNumber ?? 0).toString().length >= 3) { reset(); break; } const intCurChar = parseInt(char); const secondNumberString = (secondNumber ?? 0).toString() + char; const temp_secondNumber = parseInt(secondNumberString); if (isNaN(intCurChar) || isNaN(temp_secondNumber)) { reset(); break; } secondNumber = temp_secondNumber; break; } default: break; } // console.log(char, step0Incr, firstNumber, secondNumber); } // console.log(validOps) const result = validOps .map( op => op.firstNumber * op.secondNumber) .reduce( (prev, cur) => prev + cur, 0) console.log('final result', result) } export async function solveTask3part2() { const decoder = new TextDecoder("utf-8"); const inputData = await Deno.readFile('./3/input.txt'); const input = decoder.decode(inputData); // console.log(input) let enabled = true; let enableIncr = ''; let disableIncr = ''; let curStep = 0 let step0Incr = '' let firstNumber:number|undefined = undefined; let secondNumber:number|undefined = undefined; const reset = () => { curStep = 0; step0Incr = ''; firstNumber = undefined; secondNumber = undefined } const validOps = []; for (const char of input) { if (char === 'do()'[enableIncr.length]) { enableIncr += char; if (enableIncr.length === 4) { enabled = true; enableIncr = ''; } } else { enableIncr = ''; } if (char === "don't()"[disableIncr.length]) { disableIncr += char; if (disableIncr.length === 6) { enabled = false; disableIncr = ''; } } else { disableIncr = ''; } if (!enabled) continue; switch (curStep) { // 0: starts with 'mul(' case 0: { if (char === 'mul('[step0Incr.length]) { step0Incr += char; if (step0Incr.length === 4) { curStep = 1; } } else { reset() } break; } // 1: first number case 1: { if (firstNumber !== undefined && char === ',') { curStep = 2; break; } if ((firstNumber ?? 0).toString().length >= 3) { reset(); break; } const intCurChar = parseInt(char); const firstNumberString = (firstNumber ?? 0).toString() + char; const temp_firstNumber = parseInt(firstNumberString); if (isNaN(intCurChar) || isNaN(temp_firstNumber)) { reset(); break; } firstNumber = temp_firstNumber; break; } // 2: second number case 2: { if (firstNumber === undefined) throw new Error('firstNumber was undefined in Step 2?') if (secondNumber !== undefined && char === ')') { validOps.push({ firstNumber, secondNumber }); reset(); break; } if ((secondNumber ?? 0).toString().length >= 3) { reset(); break; } const intCurChar = parseInt(char); const secondNumberString = (secondNumber ?? 0).toString() + char; const temp_secondNumber = parseInt(secondNumberString); if (isNaN(intCurChar) || isNaN(temp_secondNumber)) { reset(); break; } secondNumber = temp_secondNumber; break; } default: break; } // console.log(char, step0Incr, firstNumber, secondNumber); } console.log(validOps) const result = validOps .map( op => op.firstNumber * op.secondNumber) .reduce( (prev, cur) => prev + cur, 0) console.log('final result', result) }