From ff4203a58fe6e69f334af77c07260b23a41946ef Mon Sep 17 00:00:00 2001 From: Yanick Champoux Date: Thu, 8 Dec 2022 11:15:24 -0500 Subject: [PATCH] part 1 --- 2022/08/part1.js | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ 2022/08/part2.js | 4 +++ 2022/08/sample | 5 +++ 2022/08/test.js | 21 ++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 2022/08/part1.js create mode 100644 2022/08/part2.js create mode 100644 2022/08/sample create mode 100644 2022/08/test.js diff --git a/2022/08/part1.js b/2022/08/part1.js new file mode 100644 index 0000000..5d9cffd --- /dev/null +++ b/2022/08/part1.js @@ -0,0 +1,87 @@ +import * as R from "remeda"; +import { readFile } from "../05/part1.js"; +import Victor from '@a-robu/victor'; + +const V = (...args) => new Victor(...args); + +const readInput = (...args) => + readFile(...args) + .split("\n") + .filter((x) => 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) + ); + + // 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), + }) ) + ); + + 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 ); + + if( outOfBound( pos.position ) ) continue; + + 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]; + } + + 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; +} + +export default R.createPipe( + printMap, + generateVisibilityGrid, + printMap, + R.flatten, + R.countBy(R.identity) +); diff --git a/2022/08/part2.js b/2022/08/part2.js new file mode 100644 index 0000000..10fc179 --- /dev/null +++ b/2022/08/part2.js @@ -0,0 +1,4 @@ +import * as R from "remeda"; + + +export default () => {}; diff --git a/2022/08/sample b/2022/08/sample new file mode 100644 index 0000000..16d6fbd --- /dev/null +++ b/2022/08/sample @@ -0,0 +1,5 @@ +30373 +25512 +65332 +33549 +35390 diff --git a/2022/08/test.js b/2022/08/test.js new file mode 100644 index 0000000..f1b2b98 --- /dev/null +++ b/2022/08/test.js @@ -0,0 +1,21 @@ +import { test, expect, describe } from "vitest"; + +import { expectSolution } from "../01/main.js"; +import part1, { sample, puzzleInput, generateVisibilityGrid } from "./part1.js"; +import part2 from "./part2.js"; + +describe("part 1", () => { + 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"); + }); +});