day 8 done
This commit is contained in:
		
							
								
								
									
										144
									
								
								08/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								08/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,144 @@
 | 
				
			|||||||
 | 
					import fs from "node:fs";
 | 
				
			||||||
 | 
					import { printTime, now } from "../util";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Coord = [number, number];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const test = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const data = fs.readFileSync(
 | 
				
			||||||
 | 
					  test ? "./inputs/testinput" : "./inputs/input",
 | 
				
			||||||
 | 
					  "utf8"
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let timer = now.instant();
 | 
				
			||||||
 | 
					console.log(
 | 
				
			||||||
 | 
					  "part one:",
 | 
				
			||||||
 | 
					  Object.entries(
 | 
				
			||||||
 | 
					    data
 | 
				
			||||||
 | 
					      .split("\n")
 | 
				
			||||||
 | 
					      .slice(0, -1)
 | 
				
			||||||
 | 
					      .reduce((m, curr, row) => {
 | 
				
			||||||
 | 
					        curr.split("").forEach((v, col) => {
 | 
				
			||||||
 | 
					          if (v !== ".") {
 | 
				
			||||||
 | 
					            m[v] = m[v] ? [...m[v], [row, col]] : [[row, col]];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        return m;
 | 
				
			||||||
 | 
					      }, {} as Record<string, Array<Coord>>)
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					    .map(([_, locations]) => {
 | 
				
			||||||
 | 
					      return locations.reduce((antinodes, curr, i, array) => {
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					          ...antinodes,
 | 
				
			||||||
 | 
					          ...array.slice(i + 1).reduce((total, next) => {
 | 
				
			||||||
 | 
					            return [
 | 
				
			||||||
 | 
					              ...total,
 | 
				
			||||||
 | 
					              [
 | 
				
			||||||
 | 
					                curr[0] - Math.abs(curr[0] - next[0]),
 | 
				
			||||||
 | 
					                curr[1] > next[1]
 | 
				
			||||||
 | 
					                  ? curr[1] + Math.abs(curr[1] - next[1])
 | 
				
			||||||
 | 
					                  : curr[1] - Math.abs(curr[1] - next[1]),
 | 
				
			||||||
 | 
					              ] as Coord,
 | 
				
			||||||
 | 
					              [
 | 
				
			||||||
 | 
					                next[0] + Math.abs(curr[0] - next[0]),
 | 
				
			||||||
 | 
					                curr[1] < next[1]
 | 
				
			||||||
 | 
					                  ? next[1] + Math.abs(curr[1] - next[1])
 | 
				
			||||||
 | 
					                  : next[1] - Math.abs(curr[1] - next[1]),
 | 
				
			||||||
 | 
					              ] as Coord,
 | 
				
			||||||
 | 
					            ];
 | 
				
			||||||
 | 
					          }, [] as Array<Coord>),
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }, [] as Array<Coord>);
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    .map((antinodes) => {
 | 
				
			||||||
 | 
					      return antinodes.filter((antinode) => {
 | 
				
			||||||
 | 
					        let maxWidth = test ? 12 : 50;
 | 
				
			||||||
 | 
					        return !(
 | 
				
			||||||
 | 
					          antinode[0] < 0 ||
 | 
				
			||||||
 | 
					          antinode[1] < 0 ||
 | 
				
			||||||
 | 
					          antinode[0] >= maxWidth ||
 | 
				
			||||||
 | 
					          antinode[1] >= maxWidth
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    .flat() // merge the frequencies
 | 
				
			||||||
 | 
					    // because arrays are not comparable, we need to filter out duplicates after strigifying them
 | 
				
			||||||
 | 
					    .map((v) => JSON.stringify(v))
 | 
				
			||||||
 | 
					    .reduce((total, v, i, a) => {
 | 
				
			||||||
 | 
					      return a.indexOf(v) === i ? total + 1 : total;
 | 
				
			||||||
 | 
					    }, 0),
 | 
				
			||||||
 | 
					  printTime(now.instant().since(timer))
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					timer = now.instant();
 | 
				
			||||||
 | 
					console.log(
 | 
				
			||||||
 | 
					  "part two:",
 | 
				
			||||||
 | 
					  Object.entries(
 | 
				
			||||||
 | 
					    data
 | 
				
			||||||
 | 
					      .split("\n")
 | 
				
			||||||
 | 
					      .slice(0, -1)
 | 
				
			||||||
 | 
					      .reduce((m, curr, row) => {
 | 
				
			||||||
 | 
					        curr.split("").forEach((v, col) => {
 | 
				
			||||||
 | 
					          if (v !== ".") {
 | 
				
			||||||
 | 
					            m[v] = m[v] ? [...m[v], [row, col]] : [[row, col]];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        return m;
 | 
				
			||||||
 | 
					      }, {} as Record<string, Array<Coord>>)
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					    .map(([_, locations]) => {
 | 
				
			||||||
 | 
					      return locations.reduce((antinodes, curr, i, array) => {
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					          ...antinodes,
 | 
				
			||||||
 | 
					          curr, // include the antennas themselves
 | 
				
			||||||
 | 
					          ...array.slice(i + 1).reduce((total, next) => {
 | 
				
			||||||
 | 
					            // draw the line north...
 | 
				
			||||||
 | 
					            let localCurr = curr;
 | 
				
			||||||
 | 
					            while (localCurr[0] > 0 && localCurr[1] > 0) {
 | 
				
			||||||
 | 
					              let k = total.push([
 | 
				
			||||||
 | 
					                localCurr[0] - Math.abs(localCurr[0] - next[0]),
 | 
				
			||||||
 | 
					                localCurr[1] > next[1]
 | 
				
			||||||
 | 
					                  ? localCurr[1] + Math.abs(localCurr[1] - next[1])
 | 
				
			||||||
 | 
					                  : localCurr[1] - Math.abs(localCurr[1] - next[1]),
 | 
				
			||||||
 | 
					              ]);
 | 
				
			||||||
 | 
					              next = localCurr;
 | 
				
			||||||
 | 
					              localCurr = total[k - 1];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return total;
 | 
				
			||||||
 | 
					          }, [] as Array<Coord>),
 | 
				
			||||||
 | 
					          ...array.slice(i + 1).reduce((total, next) => {
 | 
				
			||||||
 | 
					            // ...and south
 | 
				
			||||||
 | 
					            let localCurr = curr;
 | 
				
			||||||
 | 
					            while (next[0] < (test ? 12 : 50) && next[1] < (test ? 12 : 50)) {
 | 
				
			||||||
 | 
					              let k = total.push([
 | 
				
			||||||
 | 
					                next[0] + Math.abs(localCurr[0] - next[0]),
 | 
				
			||||||
 | 
					                localCurr[1] < next[1]
 | 
				
			||||||
 | 
					                  ? next[1] + Math.abs(localCurr[1] - next[1])
 | 
				
			||||||
 | 
					                  : next[1] - Math.abs(localCurr[1] - next[1]),
 | 
				
			||||||
 | 
					              ]);
 | 
				
			||||||
 | 
					              localCurr = next;
 | 
				
			||||||
 | 
					              next = total[k - 1];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return total;
 | 
				
			||||||
 | 
					          }, [] as Array<Coord>),
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }, [] as Array<Coord>);
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    .map((antinodes) => {
 | 
				
			||||||
 | 
					      return antinodes.filter((antinode) => {
 | 
				
			||||||
 | 
					        let maxWidth = test ? 12 : 50;
 | 
				
			||||||
 | 
					        return !(
 | 
				
			||||||
 | 
					          antinode[0] < 0 ||
 | 
				
			||||||
 | 
					          antinode[1] < 0 ||
 | 
				
			||||||
 | 
					          antinode[0] >= maxWidth ||
 | 
				
			||||||
 | 
					          antinode[1] >= maxWidth
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					    .flat()
 | 
				
			||||||
 | 
					    .map((v) => JSON.stringify(v))
 | 
				
			||||||
 | 
					    .reduce((total, v, i, a) => {
 | 
				
			||||||
 | 
					      return a.indexOf(v) === i ? total + 1 : total;
 | 
				
			||||||
 | 
					    }, 0),
 | 
				
			||||||
 | 
					  printTime(now.instant().since(timer))
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
		Reference in New Issue
	
	Block a user