prettier
This commit is contained in:
parent
8959352c9b
commit
6bcdb14d26
@ -10,6 +10,12 @@ const readInput = (...args) =>
|
|||||||
.filter((x) => x)
|
.filter((x) => x)
|
||||||
.map((l) => l.split("").map((x) => parseInt(x)));
|
.map((l) => l.split("").map((x) => parseInt(x)));
|
||||||
|
|
||||||
|
export const outOfBound = (size) => (pos) => {
|
||||||
|
if (Math.min(pos.x, pos.y) < 0) return true;
|
||||||
|
if (Math.max(pos.x, pos.y) >= size) return true;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
export function generateVisibilityGrid(forest) {
|
export function generateVisibilityGrid(forest) {
|
||||||
const size = forest.length;
|
const size = forest.length;
|
||||||
const visibility = Array(size)
|
const visibility = Array(size)
|
||||||
@ -47,17 +53,11 @@ export function generateVisibilityGrid(forest) {
|
|||||||
}))
|
}))
|
||||||
);
|
);
|
||||||
|
|
||||||
const outOfBound = (pos) => {
|
|
||||||
if (Math.min(pos.x, pos.y) < 0) return true;
|
|
||||||
if (Math.max(pos.x, pos.y) >= size) return true;
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
while (positions.length) {
|
while (positions.length) {
|
||||||
const pos = positions.shift();
|
const pos = positions.shift();
|
||||||
pos.position.add(pos.inc);
|
pos.position.add(pos.inc);
|
||||||
|
|
||||||
if (outOfBound(pos.position)) continue;
|
if (outOfBound(size)(pos.position)) continue;
|
||||||
|
|
||||||
if (forest[pos.position.x][pos.position.y] > pos.height) {
|
if (forest[pos.position.x][pos.position.y] > pos.height) {
|
||||||
visibility[pos.position.x][pos.position.y] = true;
|
visibility[pos.position.x][pos.position.y] = true;
|
||||||
@ -73,7 +73,7 @@ export function generateVisibilityGrid(forest) {
|
|||||||
export const puzzleInput = readInput(import.meta.url, "input");
|
export const puzzleInput = readInput(import.meta.url, "input");
|
||||||
export const sample = readInput(import.meta.url, "sample");
|
export const sample = readInput(import.meta.url, "sample");
|
||||||
|
|
||||||
function printMap(forest) {
|
export function printMap(forest) {
|
||||||
forest.forEach((line) => console.log(line.join(" ")));
|
forest.forEach((line) => console.log(line.join(" ")));
|
||||||
return forest;
|
return forest;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,50 @@
|
|||||||
import * as R from "remeda";
|
import * as R from "remeda";
|
||||||
|
import memo from "memoizerific";
|
||||||
|
import Victor from "@a-robu/victor";
|
||||||
|
|
||||||
|
import { printMap, outOfBound } from "./part1";
|
||||||
|
|
||||||
export default () => {};
|
const V = (...args) => new Victor(...args);
|
||||||
|
|
||||||
|
function visibility(forest, x, y, dx, dy) {
|
||||||
|
const pos = V(x, y);
|
||||||
|
const inc = V(dx, dy);
|
||||||
|
|
||||||
|
let vis = 0;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
pos.add(inc);
|
||||||
|
if (outOfBound(forest.length)(pos)) return vis;
|
||||||
|
|
||||||
|
if (forest[x][y] <= forest[pos.x][pos.y]) return 1 + vis;
|
||||||
|
vis++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const visibilityAround = (forest) => (x, y) => {
|
||||||
|
return [
|
||||||
|
[0, 1],
|
||||||
|
[0, -1],
|
||||||
|
[1, 0],
|
||||||
|
[-1, 0],
|
||||||
|
]
|
||||||
|
.map((d) => visibility(forest, x, y, ...d))
|
||||||
|
.reduce((a, b) => a * b);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default R.createPipe(
|
||||||
|
(forest) => {
|
||||||
|
const viz = Array(forest.length)
|
||||||
|
.fill(null)
|
||||||
|
.map(() => Array(forest.length).fill(0));
|
||||||
|
|
||||||
|
for (const x of R.range(0, forest.length)) {
|
||||||
|
for (const y of R.range(0, forest.length)) {
|
||||||
|
viz[x][y] = visibilityAround(forest)(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return viz;
|
||||||
|
},
|
||||||
|
R.flatten,
|
||||||
|
R.maxBy(R.identity)
|
||||||
|
);
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
import { test, expect, describe } from "vitest";
|
import { test, expect, describe } from "vitest";
|
||||||
|
|
||||||
import { expectSolution } from "../01/main.js";
|
import { expectSolution } from "../01/main.js";
|
||||||
import part1, { sample, puzzleInput, generateVisibilityGrid } from "./part1.js";
|
import part1, { sample, puzzleInput } from "./part1.js";
|
||||||
import part2 from "./part2.js";
|
import part2 from "./part2.js";
|
||||||
|
|
||||||
describe("part 1", () => {
|
describe("part 1", () => {
|
||||||
test("sample", () => {
|
test("sample", () => {
|
||||||
expect(part1(sample)).toBe(21);
|
expect(part1(sample)).toBe(21);
|
||||||
|
|
||||||
});
|
});
|
||||||
test("solution", () => {
|
test("solution", () => {
|
||||||
expectSolution(part1(puzzleInput)).toEqual(1703);
|
expectSolution(part1(puzzleInput)).toEqual(1703);
|
||||||
@ -15,7 +14,12 @@ describe("part 1", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("part 2", () => {
|
describe("part 2", () => {
|
||||||
test.todo("solution", () => {
|
test("sample", () => {
|
||||||
expectSolution(part2(puzzleInput)).toEqual("TODO");
|
expect(part2(sample)).toBe(8);
|
||||||
|
});
|
||||||
|
test("solution", () => {
|
||||||
|
const solution = part2(puzzleInput);
|
||||||
|
expect(solution).toBeGreaterThan(160);
|
||||||
|
expectSolution(solution).toEqual(496650);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user