Day Ten, Part One
This commit is contained in:
parent
14efab3450
commit
ad781d6a6b
24
src/day_ten.test.ts
Normal file
24
src/day_ten.test.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import {getFurthestDistance} from "./day_ten";
|
||||
|
||||
describe('Day Ten', () => {
|
||||
it.each([
|
||||
[`.....
|
||||
.S-7.
|
||||
.|.|.
|
||||
.L-J.
|
||||
.....`, 4], [
|
||||
`-L|F7
|
||||
7S-7|
|
||||
L|7||
|
||||
-L-J|
|
||||
L|-JF`, 4],
|
||||
[`..F7.
|
||||
.FJ|.
|
||||
SJ.L7
|
||||
|F--J
|
||||
LJ...`, 8]
|
||||
])('should calculate the number of steps to the exit', (input, expected) => {
|
||||
const result = getFurthestDistance(input);
|
||||
expect(result).toEqual(expected);
|
||||
});
|
||||
});
|
108
src/day_ten.ts
Normal file
108
src/day_ten.ts
Normal file
@ -0,0 +1,108 @@
|
||||
import fs from "fs";
|
||||
|
||||
type Grid = Tile[][];
|
||||
type Cell = [number, number];
|
||||
type Tile = 'S' | 'F' | 'J' | 'L' | '7' | '-' | '|' | '.';
|
||||
|
||||
const isTile = (value: string): value is Tile => {
|
||||
return ['S', 'F', 'J', 'L', '7', '-', '|', '.'].includes(value);
|
||||
}
|
||||
|
||||
const toString = (cell: Cell): string => {
|
||||
return cell.toString();
|
||||
}
|
||||
|
||||
const getStart = (grid: Grid): Cell => {
|
||||
const row = grid.findIndex(row => row.includes('S'));
|
||||
const col = grid[row].findIndex(cell => cell === 'S');
|
||||
return [row, col];
|
||||
}
|
||||
|
||||
const getSurrounding = (grid: Grid, [row, col]: Cell): Cell[] => {
|
||||
return ([
|
||||
[row - 1, col],
|
||||
[row + 1, col],
|
||||
[row, col - 1],
|
||||
[row, col + 1],
|
||||
[row - 1, col - 1],
|
||||
[row - 1, col + 1],
|
||||
[row + 1, col - 1],
|
||||
[row + 1, col + 1],
|
||||
] as Cell[]).filter((cell) => {
|
||||
const valid = isValid(grid, cell);
|
||||
const neighbour = neighbours(grid, cell).map(toString);
|
||||
|
||||
return valid && neighbour.includes([row, col].toString());
|
||||
});
|
||||
}
|
||||
|
||||
const neighbours = (grid: Grid, [row, col]: Cell): Cell[] => {
|
||||
const value = grid[row][col];
|
||||
switch (value) {
|
||||
case 'F':
|
||||
return [
|
||||
[row, col + 1],
|
||||
[row + 1, col],
|
||||
];
|
||||
case 'J':
|
||||
return [
|
||||
[row - 1, col],
|
||||
[row, col - 1]
|
||||
];
|
||||
case 'L':
|
||||
return [
|
||||
[row, col + 1],
|
||||
[row - 1, col]
|
||||
];
|
||||
case '7':
|
||||
return [
|
||||
[row + 1, col],
|
||||
[row, col - 1]
|
||||
];
|
||||
case '-':
|
||||
return [
|
||||
[row, col + 1],
|
||||
[row, col - 1]
|
||||
];
|
||||
case '|':
|
||||
return [
|
||||
[row - 1, col],
|
||||
[row + 1, col]
|
||||
];
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
const isValid = (grid: Grid, [row, col]: Cell): boolean => {
|
||||
return row >= 0 && row < grid.length && col >= 0 && col < grid[row].length && grid[row][col] !== '.';
|
||||
}
|
||||
|
||||
export const getFurthestDistance = (input: string): number => {
|
||||
const grid = input.split('\n').map(line => line.split('').filter(isTile));
|
||||
|
||||
const start = getStart(grid);
|
||||
const queue = getSurrounding(grid, start);
|
||||
console.log(start, queue);
|
||||
const visited = new Set<string>([start.toString()]);
|
||||
|
||||
while (queue.length > 0) {
|
||||
const current = queue.shift()!;
|
||||
const next = neighbours(grid, current);
|
||||
|
||||
next.forEach(cell => {
|
||||
if (!visited.has(cell.toString()) && isValid(grid, cell)) {
|
||||
queue.push(cell);
|
||||
visited.add(cell.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return visited.size / 2;
|
||||
}
|
||||
|
||||
export const runDayTen = () => {
|
||||
const input = fs.readFileSync('./inputs/day_ten_input.txt', 'utf8').trimEnd();
|
||||
const result = getFurthestDistance(input);
|
||||
console.log(`Day Ten: ${result}`);
|
||||
}
|
Loading…
Reference in New Issue
Block a user