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()); }