import { readLines } from "https://deno.land/std@0.177.1/io/read_lines.ts"; interface Vent { xFrom: number, yFrom: number, xTo: number, yTo: number } async function Part1() { const file = await Deno.open("./Day5/input.txt"); const lines = readLines(file); let maxX = 0; let maxY = 0; const Vents: Vent[] = []; for await (const line of lines) { const [Start,End] = line.split(" -> "); const [xFrom,yFrom] = Start.split(","); const [xEnd,yEnd] = End.split(","); if ((xFrom != xEnd) && (yFrom != yEnd)) { continue; } maxX = Math.max(+xFrom,+xEnd,maxX); maxY = Math.max(+yFrom,+yEnd,+maxY); const vent = {xFrom: Math.min(+xFrom,+xEnd),yFrom: Math.min(+yFrom,+yEnd),xTo: Math.max(+xFrom,+xEnd), yTo: Math.max(+yFrom,+yEnd)}; Vents.push(vent); } const field: number[][] = new Array(maxX+1).fill([]); for (const i in field) { field[i] = new Array(maxY + 1); field[i].fill(0); } for (const v of Vents) { if (v.xFrom == v.xTo) { for (let i = v.yFrom; i <= v.yTo; i++) { field[v.xFrom][i]++; } } else { for (let i = v.xFrom; i <= v.xTo; i++) { field[i][v.yFrom]++; } } } let overlap = 0; for (const i in field) { for (const j in field[i]) { if (field[i][j] > 1) { overlap++; } } } return overlap; } async function Part2() { const file = await Deno.open("./Day5/input.txt"); const lines = readLines(file); let maxX = 0; let maxY = 0; const Vents: Vent[] = []; for await (const line of lines) { const [Start,End] = line.split(" -> "); const [xFrom,yFrom] = Start.split(","); const [xEnd,yEnd] = End.split(","); maxX = Math.max(+xFrom,+xEnd,maxX); maxY = Math.max(+yFrom,+yEnd,+maxY); const vent = {xFrom: +xFrom, yFrom: +yFrom, xTo: +xEnd, yTo: +yEnd}; Vents.push(vent); } const field: number[][] = new Array(maxX+1).fill([]); for (const i in field) { field[i] = new Array(maxY + 1); field[i].fill(0); } for (const v of Vents) { if (v.xFrom == v.xTo) { for (let i = Math.min(v.yFrom,v.yTo); i <= Math.max(v.yTo,v.yFrom); i++) { field[v.xFrom][i]++; } } else if (v.yFrom == v.yTo) { for (let i = Math.min(v.xFrom,v.xTo); i <= Math.max(v.xTo,v.xFrom); i++) { field[i][v.yFrom]++; } } else { if (v.xFrom < v.xTo) { if (v.yFrom < v.yTo) { for (let i = 0; i <= v.xTo - v.xFrom; i++) { field[v.xFrom + i][v.yFrom + i]++; } } else { for (let i = 0; i <= v.xTo - v.xFrom; i++) { field[v.xFrom + i][v.yFrom - i]++; } } } else { if (v.yFrom < v.yTo) { for (let i = 0; i <= v.xFrom - v.xTo; i++) { field[v.xFrom - i][v.yFrom + i]++; } } else { for (let i = 0; i <= v.xFrom - v.xTo; i++) { field[v.xFrom - i][v.yFrom - i]++; } } } } } let overlap = 0; for (const i in field) { for (const j in field[i]) { if (field[i][j] > 1) { overlap++; } } } return overlap; } console.log("Part1: " + await Part1()); console.log("Part1: " + await Part2());