|
|
|
@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
|
|
|
|
|
import * as R from "remeda"; |
|
|
|
|
import { readFile } from "../05/part1.js"; |
|
|
|
|
import Victor from '@a-robu/victor'; |
|
|
|
|
import Victor from "@a-robu/victor"; |
|
|
|
|
|
|
|
|
|
const V = (...args) => new Victor(...args); |
|
|
|
|
|
|
|
|
@ -8,80 +8,80 @@ const readInput = (...args) =>
@@ -8,80 +8,80 @@ const readInput = (...args) =>
|
|
|
|
|
readFile(...args) |
|
|
|
|
.split("\n") |
|
|
|
|
.filter((x) => x) |
|
|
|
|
.map( l => l.split('').map( x => parseInt(x) ) ); |
|
|
|
|
.map((l) => l.split("").map((x) => parseInt(x))); |
|
|
|
|
|
|
|
|
|
export function generateVisibilityGrid(forest) { |
|
|
|
|
const size = forest.length; |
|
|
|
|
const visibility = Array(size).fill(null).map( |
|
|
|
|
() => Array(size).fill(false) |
|
|
|
|
); |
|
|
|
|
const size = forest.length; |
|
|
|
|
const visibility = Array(size) |
|
|
|
|
.fill(null) |
|
|
|
|
.map(() => Array(size).fill(false)); |
|
|
|
|
|
|
|
|
|
// top
|
|
|
|
|
const positions = R.range(size)(0).map( x => ({ |
|
|
|
|
height: -1, |
|
|
|
|
position: V(x,-1), |
|
|
|
|
inc: V(0,1), |
|
|
|
|
}) ); |
|
|
|
|
// top
|
|
|
|
|
const positions = R.range(size)(0).map((x) => ({ |
|
|
|
|
height: -1, |
|
|
|
|
position: V(x, -1), |
|
|
|
|
inc: V(0, 1), |
|
|
|
|
})); |
|
|
|
|
|
|
|
|
|
// bottom
|
|
|
|
|
positions.push( |
|
|
|
|
...R.range(size)(0).map( x => ({ |
|
|
|
|
height: -1, |
|
|
|
|
position: V(x,size), |
|
|
|
|
inc: V(0,-1), |
|
|
|
|
}) ) |
|
|
|
|
); |
|
|
|
|
// bottom
|
|
|
|
|
positions.push( |
|
|
|
|
...R.range(size)(0).map((x) => ({ |
|
|
|
|
height: -1, |
|
|
|
|
position: V(x, size), |
|
|
|
|
inc: V(0, -1), |
|
|
|
|
})) |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
positions.push( |
|
|
|
|
...R.range(size)(0).map( x => ({ |
|
|
|
|
height: -1, |
|
|
|
|
position: V(-1,x), |
|
|
|
|
inc: V(1,0), |
|
|
|
|
}) ) |
|
|
|
|
); |
|
|
|
|
positions.push( |
|
|
|
|
...R.range(size)(0).map( x => ({ |
|
|
|
|
height: -1, |
|
|
|
|
position: V(size,x), |
|
|
|
|
inc: V(-1,0), |
|
|
|
|
}) ) |
|
|
|
|
); |
|
|
|
|
positions.push( |
|
|
|
|
...R.range(size)(0).map((x) => ({ |
|
|
|
|
height: -1, |
|
|
|
|
position: V(-1, x), |
|
|
|
|
inc: V(1, 0), |
|
|
|
|
})) |
|
|
|
|
); |
|
|
|
|
positions.push( |
|
|
|
|
...R.range(size)(0).map((x) => ({ |
|
|
|
|
height: -1, |
|
|
|
|
position: V(size, x), |
|
|
|
|
inc: V(-1, 0), |
|
|
|
|
})) |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
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 ) { |
|
|
|
|
const pos = positions.shift(); |
|
|
|
|
pos.position.add( pos.inc ); |
|
|
|
|
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; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
if( outOfBound( pos.position ) ) continue; |
|
|
|
|
while (positions.length) { |
|
|
|
|
const pos = positions.shift(); |
|
|
|
|
pos.position.add(pos.inc); |
|
|
|
|
|
|
|
|
|
if( forest[pos.position.x][pos.position.y] > pos.height ) { |
|
|
|
|
visibility[pos.position.x][pos.position.y] = true; |
|
|
|
|
pos.height = forest[pos.position.x][pos.position.y]; |
|
|
|
|
} |
|
|
|
|
if (outOfBound(pos.position)) continue; |
|
|
|
|
|
|
|
|
|
positions.push(pos); |
|
|
|
|
if (forest[pos.position.x][pos.position.y] > pos.height) { |
|
|
|
|
visibility[pos.position.x][pos.position.y] = true; |
|
|
|
|
pos.height = forest[pos.position.x][pos.position.y]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return visibility; |
|
|
|
|
positions.push(pos); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return visibility; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export const puzzleInput = readInput(import.meta.url, "input"); |
|
|
|
|
export const sample = readInput(import.meta.url, "sample"); |
|
|
|
|
|
|
|
|
|
function printMap( forest ) { |
|
|
|
|
forest.forEach( line => console.log(line.join(' ')) ); |
|
|
|
|
return forest; |
|
|
|
|
function printMap(forest) { |
|
|
|
|
forest.forEach((line) => console.log(line.join(" "))); |
|
|
|
|
return forest; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export default R.createPipe( |
|
|
|
|
printMap, |
|
|
|
|
generateVisibilityGrid, |
|
|
|
|
printMap, |
|
|
|
|
R.flatten, |
|
|
|
|
R.countBy(R.identity) |
|
|
|
|
printMap, |
|
|
|
|
generateVisibilityGrid, |
|
|
|
|
printMap, |
|
|
|
|
R.flatten, |
|
|
|
|
R.countBy(R.identity) |
|
|
|
|
); |
|
|
|
|