Published
Edited
Dec 4, 2021
Insert cell
Insert cell
_ = require("lodash")
Insert cell
Insert cell
parse = (input) => {
const [draws, ...boards] = input.split("\n\n");
return [
draws.split(",").map((n) => parseInt(n)),
boards.map((board) =>
board.split("\n").map((row) =>
row
.split(" ")
.filter((n) => n !== "") // there's probably a regex to split this but /s+/g isn't it
.map((n) => parseInt(n))
)
)
];
}
Insert cell
parse( testInput )
Insert cell
isWinningBoard = (calls, board) => {
if (!board) return false;
const hitMap = board.map((row) => row.map((cell) => calls.includes(cell)));
const horizontals = [...hitMap];
const verticals = [],
diagonals = [[], []];
for (let i = 0; i < hitMap.length; i++) {
const vertical = [];
diagonals[0][i] = hitMap[i][i];
diagonals[1][i] = hitMap[i][hitMap[i].length - i - 1];
for (let j = 0; j < hitMap[i].length; j++) {
vertical[j] = hitMap[j][i];
}
verticals.push(vertical);
}
// return diagonals;
// return verticals;
// return hitMap;
// return [diagonals, verticals, horizontals].flat();
return [...verticals, ...horizontals].some((line) => line.every(_.identity));
return [...diagonals, ...verticals, ...horizontals].some((line) =>
line.every(_.identity)
);
}
Insert cell
isWinningBoard(
[7, 4, 9, 5, 11, 17, 23, 2],
[
[14, 21, 17, 24, 4],
[10, 16, 15, 9, 19],
[18, 8, 23, 26, 20],
[22, 11, 13, 6, 5],
[2, 0, 12, 3, 7]
]
)
Insert cell
sumOfUnmarkedSpaces = (calls, board) => {
return _.sum(
board
.map((row) => row.map((cell) => (calls.includes(cell) ? 0 : cell)))
.flatMap(_.sum)
);
}
Insert cell
play = (input) => {
const [draws, boards] = parse(input);
let winningBoard,
calls = [];
while (!winningBoard && draws.length > 0) {
calls.push(draws.shift());
winningBoard = boards.find((board) => isWinningBoard(calls, board));
}
return {
calls,
winningBoard,
answer: calls[calls.length - 1] * sumOfUnmarkedSpaces(calls, winningBoard)
};
}
Insert cell
play(testInput)
Insert cell
{
const { calls, winningBoard } = play(testInput);
return sumOfUnmarkedSpaces(calls, winningBoard);
}
Insert cell
Insert cell
Insert cell
play(input)
Insert cell
Insert cell
findLastWinningBoard = (input) => {
let [draws, boards] = parse(input);
let winningBoards = [],
calls = [],
newWinningBoards;
while (boards.length && draws.length > 0) {
calls.push(draws.shift());
[newWinningBoards, boards] = _.partition(boards, (b) =>
isWinningBoard(calls, b)
);
winningBoards = winningBoards.concat(newWinningBoards);
}
const losingBoard = winningBoards[winningBoards.length - 1];
return {
calls,
losingBoard,
answer: calls[calls.length - 1] * sumOfUnmarkedSpaces(calls, losingBoard)
};
}
Insert cell
findLastWinningBoard(testInput)
Insert cell
findLastWinningBoard(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