211 lines
6.5 KiB
TypeScript
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)
|
|
} |