4 changed files with 79 additions and 30 deletions
@ -1,4 +1,50 @@
@@ -1,4 +1,50 @@
|
||||
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,21 +1,25 @@
@@ -1,21 +1,25 @@
|
||||
import { test, expect, describe } from "vitest"; |
||||
|
||||
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"; |
||||
|
||||
describe("part 1", () => { |
||||
test( "sample", () => { |
||||
expect( part1(sample) ).toBe(21); |
||||
|
||||
}); |
||||
test("sample", () => { |
||||
expect(part1(sample)).toBe(21); |
||||
}); |
||||
test("solution", () => { |
||||
expectSolution(part1(puzzleInput)).toEqual(1703); |
||||
}); |
||||
}); |
||||
|
||||
describe("part 2", () => { |
||||
test.todo("solution", () => { |
||||
expectSolution(part2(puzzleInput)).toEqual("TODO"); |
||||
test("sample", () => { |
||||
expect(part2(sample)).toBe(8); |
||||
}); |
||||
test("solution", () => { |
||||
const solution = part2(puzzleInput); |
||||
expect(solution).toBeGreaterThan(160); |
||||
expectSolution(solution).toEqual(496650); |
||||
}); |
||||
}); |
||||
|
Loading…
Reference in new issue