Published
Edited
Dec 11, 2020
Insert cell
Insert cell
Insert cell
parse = input => input.split('\n').map(r => r.split(''))
Insert cell
adjacentSeatsForGrid = grid => (r, c) => {
const seats = [];
if (grid[r - 1]) {
seats.push(grid[r - 1][c - 1], grid[r - 1][c], grid[r - 1][c + 1]);
}
seats.push(grid[r][c - 1], grid[r][c + 1]);
if (grid[r + 1]) {
seats.push(grid[r + 1][c - 1], grid[r + 1][c], grid[r + 1][c + 1]);
}
return seats.filter(s => s);
}
Insert cell
adjacentSeatsForGrid(parse(testInput))(0, 0)
Insert cell
adjacentSeatsForGrid(parse(testInput))(2, 1)
Insert cell
step = grid => {
const adjacentSeatsFor = adjacentSeatsForGrid(grid);
const newGrid = [];
for (let i = 0; i < grid.length; i++) {
newGrid.push([]);
for (let j = 0; j < grid[i].length; j++) {
const seat = grid[i][j];
const adjacentSeats = adjacentSeatsFor(i, j);
if (seat === 'L' && adjacentSeats.every(s => s !== '#')) {
newGrid[i].push('#');
} else if (
seat === '#' &&
adjacentSeats.filter(s => s === '#').length >= 4
) {
newGrid[i].push('L');
} else {
newGrid[i].push(seat);
}
}
}
return newGrid;
}
Insert cell
output = grid => md`\`\`\`
${grid.map(row => row.join('')).join('\n')}
\`\`\``
Insert cell
output(parse(testInput))
Insert cell
output(step(parse(testInput)))
Insert cell
iterate = (grid, steps) => {
let newGrid = grid;
for (let i = 0; i < steps; i++) {
newGrid = step(newGrid);
}
return newGrid;
}
Insert cell
output(iterate(parse(testInput), 5))
Insert cell
{
const grid = step(parse(testInput));
const adjacentSeatsFor = adjacentSeatsForGrid(grid);
return adjacentSeatsFor(0, 2);
return output(grid);
}
Insert cell
Insert cell
_ = require('lodash')
Insert cell
_.isEqual(iterate(parse(testInput), 6), iterate(parse(testInput), 5))
Insert cell
part1 = input => {
const MAX_STEPS = 1000;
let grid = parse(input);
let oldGrid;
let newGrid = grid;
let steps = 0;
while (!_.isEqual(oldGrid, newGrid) && ++steps < MAX_STEPS) {
oldGrid = newGrid;
newGrid = step(newGrid);
}
if (steps >= MAX_STEPS) {
throw 'Too many steps';
}

return newGrid.flat().filter(s => s === '#').length;
}
Insert cell
part1(testInput)
Insert cell
Insert cell
//part1(input)
Insert cell
Insert cell
Insert cell
visibleSeatsForGrid = grid => (r, c) => {
const seats = [
search(r, c, -1, 0, grid), // N
search(r, c, -1, 1, grid), // NE
search(r, c, 0, 1, grid), // E
search(r, c, 1, 1, grid), // SE
search(r, c, 1, 0, grid), // S
search(r, c, 1, -1, grid), // SW
search(r, c, 0, -1, grid), // W
search(r, c, -1, -1, grid) // NW
];
// return seats;
return seats.filter(s => s);
}
Insert cell
visibleSeatsForGrid(
parse(`.......#.
...#.....
.#.......
.........
..#L....#
....#....
.........
#........
...#.....`)
)(4, 3)
Insert cell
parse(`.......#.
...#.....
.#.......
.........
..#L....#
....#....
.........
#........
...#.....`)[0][7]
Insert cell
visibleSeatsForGrid(
parse(`.............
.L.L.#.#.#.#.
.............
`)
)(1, 3)
Insert cell
step2 = grid => {
const adjacentSeatsFor = visibleSeatsForGrid(grid);
const newGrid = [];
for (let i = 0; i < grid.length; i++) {
newGrid.push([]);
for (let j = 0; j < grid[i].length; j++) {
const seat = grid[i][j];
const adjacentSeats = adjacentSeatsFor(i, j);
if (seat === 'L' && adjacentSeats.every(s => s !== '#')) {
newGrid[i].push('#');
} else if (
seat === '#' &&
adjacentSeats.filter(s => s === '#').length >= 5
) {
newGrid[i].push('L');
} else {
newGrid[i].push(seat);
}
}
}
return newGrid;
}
Insert cell
output(step2(parse(testInput)))
Insert cell
iterate2 = (grid, steps) => {
let newGrid = grid;
for (let i = 0; i < steps; i++) {
newGrid = step2(newGrid);
}
return newGrid;
}
Insert cell
output(iterate2(parse(testInput), 7))
Insert cell
part2 = input => {
const MAX_STEPS = 1000;
let grid = parse(input);
let oldGrid;
let newGrid = grid;
let steps = 0;
while (!_.isEqual(oldGrid, newGrid) && ++steps < MAX_STEPS) {
oldGrid = newGrid;
newGrid = step2(newGrid);
}
if (steps >= MAX_STEPS) {
throw 'Too many steps';
}

return newGrid.flat().filter(s => s === '#').length;
}
Insert cell
part2(testInput)
Insert cell
part2(input)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more