Merge branch '2021-13'

main
Yanick Champoux 2021-12-13 11:05:08 -05:00
commit 11e36510a1
4 changed files with 131 additions and 0 deletions

69
2021/13/part1.mjs Normal file
View File

@ -0,0 +1,69 @@
import fs from "fs-extra";
import fp from "lodash/fp.js";
import _ from "lodash";
export const processInput = (input) =>
fs.readFile(input, "utf8").then((content) => {
let [coords, instructions] = content.split("\n\n");
let grid = [];
for (const [y, x] of coords
.split("\n")
.map((line) => line.split(",").map((x) => parseInt(x)))) {
if (!grid[x]) grid[x] = [];
grid[x][y] = true;
}
grid = [...grid].map((x) => (x ? [...x] : []));
instructions = instructions
.split("\n")
.filter((x) => x)
.map((line) => line.match(/([xy])=(\d+)/))
.map(([_, direction, level]) => [direction, parseInt(level)]);
return {
grid,
instructions,
};
});
export function foldGrid(grid, direction, level) {
if (direction === "x") {
for (const row of grid) {
if (!row) continue;
const folded = row.splice(level);
folded.forEach((v, i) => {
if (i === 0) return;
if (!v) return;
row[level - i] = v;
});
}
return grid;
}
const folded = grid.splice(level);
folded.forEach((v, i) => {
if (i === 0) return;
if (!v) return;
grid[level - i] = _.range(
_.max([grid[level - i].length, folded[i].length])
).map((j) => grid[level - i][j] || folded[i][j]);
});
return grid;
}
export function printGrid(grid) {
return grid
.map((line) => (line || []).map((x) => (x ? "#" : ".")).join(""))
.join("\n");
}
export function solution({ grid, instructions }) {
foldGrid(grid, ...instructions.shift());
return _.sum(grid.flat());
}

11
2021/13/part2.mjs Normal file
View File

@ -0,0 +1,11 @@
import fs from "fs-extra";
import fp from "lodash/fp.js";
import _ from "lodash";
import * as p1 from "./part1.mjs";
export function solution({ grid, instructions }) {
instructions.forEach((i) => p1.foldGrid(grid, ...i));
return p1.printGrid(grid);
}

21
2021/13/sample Normal file
View File

@ -0,0 +1,21 @@
6,10
0,14
9,10
0,3
10,4
4,11
6,0
6,12
4,1
0,13
10,12
3,4
3,0
8,4
1,10
2,14
8,10
9,0
fold along y=7
fold along x=5

30
2021/13/test.mjs Normal file
View File

@ -0,0 +1,30 @@
// https://adventofcode.com/2021/day/13
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) => {
const x = await sample;
t.equal(p1.solution(x), 17);
t.equal(p1.solution(x), 16);
t.equal(p1.solution(await input), 745);
});
tap.test("part2", async (t) => {
// t.equal(p2.solution(await sample), 0);
t.equal(
p2.solution(await input),
`.##..###..#..#...##.####.###...##...##..
#..#.#..#.#.#.....#.#....#..#.#..#.#..#.
#..#.###..##......#.###..###..#....#....
####.#..#.#.#.....#.#....#..#.#.##.#....
#..#.#..#.#.#..#..#.#....#..#.#..#.#..#.
#..#.###..#..#..##..#....###...###..##..`
);
});