mirror of
https://github.com/peter-tanner/advent-of-code-2023.git
synced 2024-11-30 14:00:16 +08:00
Day 3 solutions 😀
This commit is contained in:
parent
60cbaac7df
commit
c15fe9f069
78
day_3/parser.ts
Normal file
78
day_3/parser.ts
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
enum PARSER_STATE {
|
||||||
|
EMPTY,
|
||||||
|
NUMBER,
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Point {
|
||||||
|
i: number;
|
||||||
|
j: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const iterPoint = (p: Point) => {
|
||||||
|
const adjacent_points: Point[] = [
|
||||||
|
{ i: p.i + 1, j: p.j + 1 },
|
||||||
|
{ i: p.i + 1, j: p.j + 0 },
|
||||||
|
{ i: p.i + 1, j: p.j + -1 },
|
||||||
|
{ i: p.i + 0, j: p.j + 1 },
|
||||||
|
// {i: p.i + 0, j: p.j + 0},
|
||||||
|
{ i: p.i + 0, j: p.j + -1 },
|
||||||
|
{ i: p.i + -1, j: p.j + 1 },
|
||||||
|
{ i: p.i + -1, j: p.j + 0 },
|
||||||
|
{ i: p.i + -1, j: p.j + -1 },
|
||||||
|
];
|
||||||
|
return adjacent_points;
|
||||||
|
};
|
||||||
|
|
||||||
|
export interface Symbol {
|
||||||
|
p: Point;
|
||||||
|
symbol: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const point_2_string = (p: Point) => `${p.i},${p.j}`;
|
||||||
|
|
||||||
|
export const parse_file = (input: string) => {
|
||||||
|
const grid = input.split("\n").map((row) => row.split(""));
|
||||||
|
|
||||||
|
var parser_state = PARSER_STATE.EMPTY;
|
||||||
|
const part_numbers: number[] = [];
|
||||||
|
const part_number_cells: Map<string, number> = new Map();
|
||||||
|
const symbols: Symbol[] = [];
|
||||||
|
|
||||||
|
for (const j in grid) {
|
||||||
|
const row = grid[j];
|
||||||
|
|
||||||
|
// Numbers do not go down rows.
|
||||||
|
parser_state = parser_state = PARSER_STATE.EMPTY;
|
||||||
|
var number_buf = "";
|
||||||
|
|
||||||
|
for (const i in row) {
|
||||||
|
const cell = row[i];
|
||||||
|
const point: Point = { i: parseInt(i), j: parseInt(j) };
|
||||||
|
if (["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"].includes(cell)) {
|
||||||
|
parser_state = PARSER_STATE.NUMBER;
|
||||||
|
number_buf += cell;
|
||||||
|
part_number_cells.set(point_2_string(point), part_numbers.length);
|
||||||
|
} else {
|
||||||
|
if (parser_state === PARSER_STATE.NUMBER) {
|
||||||
|
part_numbers.push(parseInt(number_buf));
|
||||||
|
number_buf = "";
|
||||||
|
}
|
||||||
|
if (cell !== ".") {
|
||||||
|
symbols.push({ p: point, symbol: cell });
|
||||||
|
}
|
||||||
|
parser_state = PARSER_STATE.EMPTY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cleanup at end of file.
|
||||||
|
if (parser_state === PARSER_STATE.NUMBER) {
|
||||||
|
part_numbers.push(parseInt(number_buf));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
part_numbers: part_numbers,
|
||||||
|
part_number_cells: part_number_cells,
|
||||||
|
symbols: symbols,
|
||||||
|
};
|
||||||
|
};
|
25
day_3/part_1.ts
Normal file
25
day_3/part_1.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import * as fs from "fs";
|
||||||
|
import { iterPoint, parse_file, point_2_string } from "./parser";
|
||||||
|
|
||||||
|
const input = fs.readFileSync("input", "utf8");
|
||||||
|
const { part_numbers, part_number_cells, symbols } = parse_file(input);
|
||||||
|
|
||||||
|
const valid_part_number_indices: Set<number> = new Set();
|
||||||
|
|
||||||
|
symbols.forEach((e) => {
|
||||||
|
iterPoint(e.p)
|
||||||
|
.map((e) => point_2_string(e))
|
||||||
|
.forEach((adjP) => {
|
||||||
|
const part_number_index = part_number_cells.get(adjP);
|
||||||
|
|
||||||
|
if (part_number_index !== undefined) {
|
||||||
|
valid_part_number_indices.add(part_number_index);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
[...valid_part_number_indices]
|
||||||
|
.map((i) => part_numbers[i])
|
||||||
|
.reduce((sum, v) => sum + v, 0)
|
||||||
|
);
|
40
day_3/part_2.ts
Normal file
40
day_3/part_2.ts
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
import * as fs from "fs";
|
||||||
|
import { iterPoint, parse_file, point_2_string } from "./parser";
|
||||||
|
|
||||||
|
const input = fs.readFileSync("input", "utf8");
|
||||||
|
const { part_numbers, part_number_cells, symbols } = parse_file(input);
|
||||||
|
|
||||||
|
interface GearPair {
|
||||||
|
g1: number;
|
||||||
|
g2: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const gear_pairs: Set<GearPair> = new Set();
|
||||||
|
|
||||||
|
symbols.forEach((e) => {
|
||||||
|
if (e.symbol === "*") {
|
||||||
|
const gears: Set<number> = new Set();
|
||||||
|
iterPoint(e.p)
|
||||||
|
.map((e) => point_2_string(e))
|
||||||
|
.forEach((adjP) => {
|
||||||
|
const part_number_index = part_number_cells.get(adjP);
|
||||||
|
|
||||||
|
if (part_number_index !== undefined) {
|
||||||
|
gears.add(part_number_index);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (gears.size === 2) {
|
||||||
|
const gear_pair: GearPair = {
|
||||||
|
g1: [...gears][0],
|
||||||
|
g2: [...gears][1],
|
||||||
|
};
|
||||||
|
gear_pairs.add(gear_pair);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
[...gear_pairs]
|
||||||
|
.map((pair) => part_numbers[pair.g1] * part_numbers[pair.g2])
|
||||||
|
.reduce((sum, v) => sum + v, 0)
|
||||||
|
);
|
Loading…
Reference in New Issue
Block a user