solve Day03 in TS
This commit is contained in:
parent
c446269aeb
commit
b4f79f1cbf
97
Day03/ts/solution.ts
Normal file
97
Day03/ts/solution.ts
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
import { readFileSync } from 'fs';
|
||||||
|
import { resolve } from 'path';
|
||||||
|
|
||||||
|
function parseSchematic(filePath: string): string[] {
|
||||||
|
try {
|
||||||
|
const data = readFileSync(filePath, 'utf8');
|
||||||
|
return data.split('\n').map(line => line.trim());
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(`Error reading file: ${filePath}, ${(err as Error).message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAdjacentPositions(rows: number, cols: number, row: number, col: number): [number, number][] {
|
||||||
|
const positions: [number, number][] = [];
|
||||||
|
for (let i = Math.max(0, row - 1); i <= Math.min(rows - 1, row + 1); i++) {
|
||||||
|
for (let j = Math.max(0, col - 1); j <= Math.min(cols - 1, col + 1); j++) {
|
||||||
|
if (i !== row || j !== col) {
|
||||||
|
positions.push([i, j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return positions;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findStartOfNumber(schematic: string[], row: number, col: number): number {
|
||||||
|
while (col > 0 && /\d/.test(schematic[row][col - 1])) {
|
||||||
|
col--;
|
||||||
|
}
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractFullNumber(schematic: string[], startRow: number, startCol: number): number {
|
||||||
|
let col = findStartOfNumber(schematic, startRow, startCol);
|
||||||
|
let number = '';
|
||||||
|
|
||||||
|
while (col < schematic[startRow].length && /\d/.test(schematic[startRow][col])) {
|
||||||
|
number += schematic[startRow][col];
|
||||||
|
schematic[startRow] = schematic[startRow].substring(0, col) + '.' + schematic[startRow].substring(col + 1);
|
||||||
|
col++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parseInt(number, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
function findGearsAndCalculateRatios(schematic: string[]): number {
|
||||||
|
const rows = schematic.length;
|
||||||
|
const cols = schematic[0].length;
|
||||||
|
let totalRatioSum = 0;
|
||||||
|
|
||||||
|
for (let row = 0; row < rows; row++) {
|
||||||
|
for (let col = 0; col < cols; col++) {
|
||||||
|
if (schematic[row][col] === '*') {
|
||||||
|
const partNumbers: number[] = [];
|
||||||
|
for (const [i, j] of getAdjacentPositions(rows, cols, row, col)) {
|
||||||
|
if (/\d/.test(schematic[i][j])) {
|
||||||
|
const partNumber = extractFullNumber(schematic, i, j);
|
||||||
|
if (!partNumbers.includes(partNumber)) {
|
||||||
|
partNumbers.push(partNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (partNumbers.length === 2) {
|
||||||
|
const gearRatio = partNumbers[0] * partNumbers[1];
|
||||||
|
totalRatioSum += gearRatio;
|
||||||
|
console.log(`Found gear at line ${row + 1} with ratio ${gearRatio}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return totalRatioSum;
|
||||||
|
}
|
||||||
|
|
||||||
|
function runTest() {
|
||||||
|
const testFilePath = resolve(__dirname, '../test.txt');
|
||||||
|
const testSchematic = parseSchematic(testFilePath);
|
||||||
|
const testResult = findGearsAndCalculateRatios(testSchematic);
|
||||||
|
console.log(`Test Result: ${testResult}`);
|
||||||
|
console.assert(testResult === 467835, `Test failed: Expected 467835, got ${testResult}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
try {
|
||||||
|
runTest();
|
||||||
|
console.log("Test passed successfully.");
|
||||||
|
|
||||||
|
const inputFilePath = resolve(__dirname, '../input.txt');
|
||||||
|
const inputSchematic = parseSchematic(inputFilePath);
|
||||||
|
const totalRatioSum = findGearsAndCalculateRatios(inputSchematic);
|
||||||
|
console.log(`Total sum of gear ratios: ${totalRatioSum}`);
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
Loading…
Reference in New Issue
Block a user