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); */ +});