71 lines
1.7 KiB
JavaScript
71 lines
1.7 KiB
JavaScript
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];
|
|
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());
|
|
|
|
|
|
}
|