From 1ebc218487e71d78af3b92b344fd69e9e6efb36f Mon Sep 17 00:00:00 2001 From: Yanick Champoux Date: Fri, 10 Dec 2021 10:25:34 -0500 Subject: [PATCH 1/2] part 1 --- 2021/09/part1.mjs | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 2021/09/part2.mjs | 8 +++++++ 2021/09/sample | 5 +++++ 2021/09/test.mjs | 23 ++++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 2021/09/part1.mjs create mode 100644 2021/09/part2.mjs create mode 100644 2021/09/sample create mode 100644 2021/09/test.mjs diff --git a/2021/09/part1.mjs b/2021/09/part1.mjs new file mode 100644 index 0000000..480dbe5 --- /dev/null +++ b/2021/09/part1.mjs @@ -0,0 +1,54 @@ +import fs from "fs-extra"; +import fp from "lodash/fp.js"; +import _ from "lodash"; + +export const processInput = (filename) => fs.readFile(filename,'utf8').then( + content => content.split("\n").filter(x=>x).map( + lines => lines.split('').map(x => parseInt(x)) + ) +); + +export const genNeighbours = (maxX,maxY) => (x,y) => + [ [-1,0], [1,0], [0,1], [0,-1] ].map( + delta => _.zip(delta,[x,y]).map(_.sum) + ).filter( ([x,y]) => { + if(x<0 || y<0 ) return false; + if( x>= maxX || y>= maxY ) return false; + return true; + } ); + +const genCoords = grid => ([x,y]) => grid[x][y]; + +export function solution(grid) { + const seen = grid.map( () => [] ); + let risk = 0; + + const neighbours = genNeighbours(grid.length,grid[0].length); + const coords = genCoords(grid); + + for( const x of _.range(grid.length) ) { + for( const y of _.range(grid[x].length) ) { + if( seen[x][y] ) continue; + + let lowest = true; + for( const n of neighbours(x,y) ) { + if( coords(n) > grid[x][y] ) { + seen[n[0]][n[1]] = true; + } else if ( coords(n) == grid[x][y] ) { + seen[n[0]][n[1]] = true; + lowest = false; + } else { + lowest = false; + } + } + + if(lowest) { + risk += 1 + grid[x][y]; + } + seen[x][y] = true; + + } + } + + return risk; +} diff --git a/2021/09/part2.mjs b/2021/09/part2.mjs new file mode 100644 index 0000000..4581168 --- /dev/null +++ b/2021/09/part2.mjs @@ -0,0 +1,8 @@ +import fs from "fs-extra"; +import fp from "lodash/fp.js"; +import _ from "lodash"; + +import * as p1 from './part1.mjs'; + +export function solution(input) { +} diff --git a/2021/09/sample b/2021/09/sample new file mode 100644 index 0000000..6dee4a4 --- /dev/null +++ b/2021/09/sample @@ -0,0 +1,5 @@ +2199943210 +3987894921 +9856789892 +8767896789 +9899965678 diff --git a/2021/09/test.mjs b/2021/09/test.mjs new file mode 100644 index 0000000..68da3c2 --- /dev/null +++ b/2021/09/test.mjs @@ -0,0 +1,23 @@ +// https://adventofcode.com/2021/day/09 + +import tap from "tap"; +import fs from "fs-extra"; + +import * as p1 from "./part1.mjs"; +import * as p2 from "./part2.mjs"; + +const sample = p1.processInput("sample"); +const input = p1.processInput("input"); + +tap.test("part1", async (t) => { + t.match(p1.genNeighbours(10,10)(0,0), [ + [1,0],[0,1] +]); + t.equal(p1.solution(await sample), 15); + t.equal(p1.solution(await input), 550); +}); + +tap.test("part2", async (t) => { + /* t.equal(p2.solution(await sample, 256), 26984457539); */ + /* t.equal(p2.solution(await input, 256), 1622533344325); */ +}); From 9870df25fbb4abce884ba5147520ee6a5705ce74 Mon Sep 17 00:00:00 2001 From: Yanick Champoux Date: Fri, 10 Dec 2021 12:16:34 -0500 Subject: [PATCH 2/2] 2021-09 --- 2021/09/part1.mjs | 2 +- 2021/09/part2.mjs | 38 +++++++++++++++++++++++++++++++++++++- 2021/09/test.mjs | 4 ++-- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/2021/09/part1.mjs b/2021/09/part1.mjs index 480dbe5..1ee1073 100644 --- a/2021/09/part1.mjs +++ b/2021/09/part1.mjs @@ -17,7 +17,7 @@ export const genNeighbours = (maxX,maxY) => (x,y) => return true; } ); -const genCoords = grid => ([x,y]) => grid[x][y]; +export const genCoords = grid => ([x,y]) => grid[x][y]; export function solution(grid) { const seen = grid.map( () => [] ); diff --git a/2021/09/part2.mjs b/2021/09/part2.mjs index 4581168..1d49a43 100644 --- a/2021/09/part2.mjs +++ b/2021/09/part2.mjs @@ -4,5 +4,41 @@ import _ from "lodash"; import * as p1 from './part1.mjs'; -export function solution(input) { +function getBasinSize( [x,y], grid, seen ) { + if( seen[x][y] ) return 0; + + seen[x][y] = true; + + if( grid[x][y] == 9 ) return 0; + let size = 1; + + const neighbours = p1.genNeighbours(grid.length,grid[0].length); + const coords = p1.genCoords(grid); + + neighbours(x,y).map( n => getBasinSize(n,grid,seen) ).forEach( + x => size+=x + ); + + return size; +} + +export function solution(grid) { + const seen = grid.map( () => [] ); + let basinSizes = []; + + + for( const x of _.range(grid.length) ) { + for( const y of _.range(grid[x].length) ) { + if( seen[x][y] ) continue; + + if( grid[x][y] == 9 ) { + seen[x][y] = true; + continue; + } + basinSizes.push( getBasinSize([x,y],grid,seen)); + } + } + + basinSizes.sort( (a,b) => a < b ? 1 : -1 ); + return basinSizes.splice(0,3).reduce( (a,b) => a*b ) ; } diff --git a/2021/09/test.mjs b/2021/09/test.mjs index 68da3c2..a0b97b9 100644 --- a/2021/09/test.mjs +++ b/2021/09/test.mjs @@ -18,6 +18,6 @@ tap.test("part1", async (t) => { }); tap.test("part2", async (t) => { - /* t.equal(p2.solution(await sample, 256), 26984457539); */ - /* t.equal(p2.solution(await input, 256), 1622533344325); */ + t.equal(p2.solution(await sample), 1134); + t.equal(p2.solution(await input), 1100682); });