main
Yanick Champoux 2021-12-13 11:03:28 -05:00
parent 1e65e39123
commit 360fc700b1
3 changed files with 69 additions and 70 deletions

View File

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

View File

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

View File

@ -6,23 +6,25 @@ import fs from "fs-extra";
import * as p1 from "./part1.mjs"; import * as p1 from "./part1.mjs";
import * as p2 from "./part2.mjs"; import * as p2 from "./part2.mjs";
const sample = p1.processInput('sample'); const sample = p1.processInput("sample");
const input = p1.processInput('input'); const input = p1.processInput("input");
tap.test("part1", async (t) => { tap.test("part1", async (t) => {
const x = await sample; const x = await sample;
t.equal(p1.solution(x), 17); t.equal(p1.solution(x), 17);
t.equal(p1.solution(x), 16); t.equal(p1.solution(x), 16);
t.equal(p1.solution(await input), 745); t.equal(p1.solution(await input), 745);
}); });
tap.test("part2", async (t) => { tap.test("part2", async (t) => {
// t.equal(p2.solution(await sample), 0); // t.equal(p2.solution(await sample), 0);
t.equal(p2.solution(await input), t.equal(
`.##..###..#..#...##.####.###...##...##.. p2.solution(await input),
`.##..###..#..#...##.####.###...##...##..
#..#.#..#.#.#.....#.#....#..#.#..#.#..#. #..#.#..#.#.#.....#.#....#..#.#..#.#..#.
#..#.###..##......#.###..###..#....#.... #..#.###..##......#.###..###..#....#....
####.#..#.#.#.....#.#....#..#.#.##.#.... ####.#..#.#.#.....#.#....#..#.#.##.#....
#..#.#..#.#.#..#..#.#....#..#.#..#.#..#. #..#.#..#.#.#..#..#.#....#..#.#..#.#..#.
#..#.###..#..#..##..#....###...###..##..`); #..#.###..#..#..##..#....###...###..##..`
);
}); });