Oliver Kaup 5b9d612efc day 3
2024-12-11 19:46:12 +01:00

211 lines
6.5 KiB
TypeScript

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