48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import { open } from 'node:fs/promises';
|
|
|
|
const file = await open('./inputs/3');
|
|
let sum = 0
|
|
let input = (await file.readFile()).toString().split('\n')
|
|
let numbers : {value: number, indices: number[]}[][] = []
|
|
|
|
input.forEach((line, index) => {
|
|
const regex1 = (/\d+/gmd);
|
|
let match;
|
|
numbers.push([])
|
|
while ((match = regex1.exec(line)) !== null) {
|
|
if(match.indices == undefined) throw new Error('no indices')
|
|
numbers[index].push({value:Number(match['0']),indices:match.indices[0]})
|
|
}
|
|
})
|
|
|
|
input.forEach((line, index) => {
|
|
const regex1 = (/\*/gm);
|
|
let match: RegExpExecArray | null;
|
|
while ((match = regex1.exec(line)) !== null) {
|
|
const partNumbers = []
|
|
if( match === null) throw new Error('match is null')
|
|
|
|
let part = numbers[index].find(e=>e.indices[1] == match!.index)
|
|
if(part !== undefined) partNumbers.push(part)
|
|
|
|
part = numbers[index].find(e=>e.indices[0] == match!.index+1)
|
|
if(part !== undefined) partNumbers.push(part)
|
|
|
|
if(index > 0){
|
|
const parts = numbers[index-1].filter(e=>e.indices[0] <= match!.index+1 && e.indices[1] >= match!.index)
|
|
partNumbers.push(...parts)
|
|
}
|
|
|
|
if(index < input.length -1){
|
|
const parts = numbers[index+1].filter(e=>e.indices[0] <= match!.index+1 && e.indices[1] >= match!.index)
|
|
partNumbers.push(...parts)
|
|
}
|
|
|
|
|
|
if(partNumbers.length == 2){
|
|
sum += partNumbers[0].value * partNumbers[1].value
|
|
}
|
|
}
|
|
})
|
|
console.log(sum)
|