136 lines
3.7 KiB
TypeScript
136 lines
3.7 KiB
TypeScript
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()); |