From 6727680002519f01d1a20a6a9fdc9270a4c22a5a Mon Sep 17 00:00:00 2001 From: Alex | Kronox Date: Mon, 18 Dec 2023 10:42:36 +0100 Subject: [PATCH] 2023-18 --- 2023/18/runner.ts | 29 ++++++++++++++++ 2023/18/task.ts | 86 +++++++++++++++++++++++++++++++++++++++++++++++ README.md | 3 +- 3 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 2023/18/runner.ts create mode 100644 2023/18/task.ts diff --git a/2023/18/runner.ts b/2023/18/runner.ts new file mode 100644 index 0000000..b72c86b --- /dev/null +++ b/2023/18/runner.ts @@ -0,0 +1,29 @@ +import { readFile } from "fs/promises"; +import { taskOne, taskTwo } from "./task"; + +async function main() { + let lastArgument = process.argv.pop() as string; + let taskNumber = 1; + let isTest = false; + + if (lastArgument === "test") { + isTest = true; + taskNumber = parseInt(process.argv.pop() as string); + } else { + taskNumber = parseInt(lastArgument) + } + + const fileToLoad = isTest ? "test.in" : "solve.in"; + const fileContents = await readFile(fileToLoad, "utf-8") + + const lines = fileContents.split("\n"); + + if (taskNumber === 1) { + await taskOne(lines); + } + if (taskNumber === 2) { + await taskTwo(lines); + } +} + +void main(); \ No newline at end of file diff --git a/2023/18/task.ts b/2023/18/task.ts new file mode 100644 index 0000000..d7283b0 --- /dev/null +++ b/2023/18/task.ts @@ -0,0 +1,86 @@ +export async function taskOne(_input: string[]): Promise { + const input = _input.map(i => i.split(" ")) + const wall: Map> = new Map() + let x = 0 + let y = 0 + wall.set(0, new Set()) + wall.get(0)?.add(0) + for (const line of input) { + const d = line[0] as 'U'|'D'|'L'|'R' + for(let i = 0; i < parseInt(line[1]); i++) { + x += dirX[d] + y+= dirY[d] + if (!wall.has(x)) wall.set(x, new Set()) + wall.get(x)?.add(y) + } + } + let sum = sumMap(wall) + sumMap(fill(wall, [1,1])) + console.log(sum) + +} + +export async function taskTwo(_input: string[]): Promise { + const input = _input.map(i => i.split(" ")) + let x = 0 + let y = 0 + let sum = 0 + let perim = 0 + for (let i = 0; i < input.length; i += 2) { + const xLine = input[i] + const yLine = input[i+1] + const xDir = dirNum[parseInt(xLine[2].charAt(7)) as 0|1|2|3] as 'U'|'D'|'L'|'R' + const yDir = dirNum[parseInt(yLine[2].charAt(7)) as 0|1|2|3] as 'U'|'D'|'L'|'R' + const xLen = parseInt(xLine[2].slice(2, 7), 16) + const yLen = parseInt(yLine[2].slice(2, 7), 16) + + // Add trench + + x = x + xLen*dirX[xDir] + y = y + yLen*dirY[yDir] + const square = (x)*(yLen*dirY[yDir]) + sum += square + perim += xLen + yLen + + } + console.log(sum + perim/2+1) +} + +interface Wall { + rootX: number, + rootY: number, + length: number +} + +function sumMap(m: Map>) { + return Array.from(m.values()).map(i => Array.from(i).length).reduce((a,b)=>a+b,0) +} + +const dirNum = { + 0: 'R', 1: 'D', 2: 'L', 3: 'U' +} + +const dirX= { + 'R': 1, 'L': -1, 'U': 0, 'D': 0 +} +const dirY= { + 'R': 0, 'L': 0, 'U': -1, 'D': 1 +} + +function fill(coords: Map>, start: [number, number]) { + const visited: Map> = new Map() + const Qu: [number, number][] = [start] + + while(Qu.length > 0) { + const q = Qu.shift() as [number,number] + if (visited.has(q[0]) && visited.get(q[0])?.has(q[1])) {continue;} + if (coords.has(q[0]) && coords.get(q[0])?.has(q[1])) continue + if(!visited.has(q[0])) visited.set(q[0], new Set()) + visited.get(q[0])?.add(q[1]) + + Qu.push([q[0],q[1]+1]) + Qu.push([q[0],q[1]-1]) + Qu.push([q[0]+1,q[1]]) + Qu.push([q[0]-1,q[1]]) + } + return visited +} \ No newline at end of file diff --git a/README.md b/README.md index 642b45f..1045e07 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Whatever I feel like today. But it will most likely either be Java, Python, C++,

2023

-![](https://img.shields.io/badge/stars%20⭐-34-yellow) +![](https://img.shields.io/badge/stars%20⭐-36-yellow) |Day|Language| |--|--| @@ -30,6 +30,7 @@ Whatever I feel like today. But it will most likely either be Java, Python, C++, |15|TypeScript| |16|TypeScript| |17|TypeScript| +|18|TypeScript|

2022