diff --git a/.aocrunner.json b/.aocrunner.json index 1680657..a65854d 100644 --- a/.aocrunner.json +++ b/.aocrunner.json @@ -53,16 +53,16 @@ }, { "part1": { - "solved": false, - "result": null, + "solved": true, + "result": "11536", "attempts": [], - "time": null + "time": 20.05 }, "part2": { - "solved": false, - "result": null, + "solved": true, + "result": "1284", "attempts": [], - "time": null + "time": 55.8 } }, { diff --git a/README.md b/README.md index ab8b8cd..4ee999c 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ [![Day](https://badgen.net/badge/01/%E2%98%85%E2%98%85/green)](src/day01) [![Day](https://badgen.net/badge/02/%E2%98%85%E2%98%85/green)](src/day02) [![Day](https://badgen.net/badge/03/%E2%98%85%E2%98%85/green)](src/day03) -![Day](https://badgen.net/badge/04/%E2%98%86%E2%98%86/gray) +[![Day](https://badgen.net/badge/04/%E2%98%85%E2%98%85/green)](src/day04) ![Day](https://badgen.net/badge/05/%E2%98%86%E2%98%86/gray) ![Day](https://badgen.net/badge/06/%E2%98%86%E2%98%86/gray) ![Day](https://badgen.net/badge/07/%E2%98%86%E2%98%86/gray) @@ -90,9 +90,9 @@ Both parts: 7.29ms ``` Day 04 -Time part 1: - -Time part 2: - -Both parts: - +Time part 1: 20.05ms +Time part 2: 55.8ms +Both parts: 75.85ms ``` ``` @@ -243,8 +243,8 @@ Both parts: - ``` ``` -Total stars: 6/50 -Total time: 13.15ms +Total stars: 8/50 +Total time: 89ms ``` diff --git a/src/day04/README.md b/src/day04/README.md new file mode 100644 index 0000000..a0638c1 --- /dev/null +++ b/src/day04/README.md @@ -0,0 +1,9 @@ +# 🎄 Advent of Code 2021 - day 4 🎄 + +## Info + +Task description: [link](https://adventofcode.com/2021/day/4) + +## Notes + +... \ No newline at end of file diff --git a/src/day04/index.js b/src/day04/index.js new file mode 100644 index 0000000..954d13b --- /dev/null +++ b/src/day04/index.js @@ -0,0 +1,143 @@ +import run from "aocrunner" +import { transpose } from "../utils/index.js" + +function check(board) { + const board2 = transpose(board) + for (let i = 0; i < 5; i++) { + if ( + board[i].every((x) => x === null) || + board2[i].every((x) => x === null) + ) { + return true + } + } + return false +} + +const parseInput = (rawInput) => { + const lines = rawInput.trim().split`\n` + const calls = lines.shift().split`,`.map(Number) + const boards = [] + while (lines.length > 0) { + const nextBoard = [] + lines.shift() //blank line + for (let i = 0; i < 5; i++) { + nextBoard[i] = lines.shift().trim().split(/\s+/).map(Number) + } + boards.push(nextBoard) + } + return { calls, boards } +} + +const part1 = (rawInput) => { + const { calls, boards } = parseInput(rawInput) + const marked = [] + let winningBoard, lastCall + outer: for (const call of calls) { + lastCall = call + for (const board of boards) { + for (const row of board) { + for (let i = 0; i < 5; i++) { + if (row[i] === call) { + row[i] = null + if (check(board)) { + winningBoard = board + break outer + } + } + } + } + } + } + + const sum = winningBoard.reduce( + (acc, row) => acc + row.reduce((acc2, cell) => acc2 + cell, 0), + 0, + ) + return sum * lastCall +} + +const part2 = (rawInput) => { + const { calls, boards } = parseInput(rawInput) + const marked = [] + let winningSum, lastCall + for (const call of calls) { + for (const board of boards) { + for (const row of board) { + for (let i = 0; i < 5; i++) { + if (row[i] === call) { + row[i] = null + if (check(board)) { + lastCall = call + winningSum = board.reduce( + (acc, row) => acc + row.reduce((acc2, cell) => acc2 + cell, 0), + 0, + ) + board.splice(0, 5) + } + } + } + } + } + } + + return winningSum * lastCall +} + +run({ + part1: { + tests: [ + { + input: `7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1 + +22 13 17 11 0 + 8 2 23 4 24 +21 9 14 16 7 + 6 10 3 18 5 + 1 12 20 15 19 + + 3 15 0 2 22 + 9 18 13 17 5 +19 8 7 25 23 +20 11 10 24 4 +14 21 16 12 6 + +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`, + expected: 4512, + }, + ], + solution: part1, + }, + part2: { + tests: [ + { + input: `7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1 + +22 13 17 11 0 + 8 2 23 4 24 +21 9 14 16 7 + 6 10 3 18 5 + 1 12 20 15 19 + + 3 15 0 2 22 + 9 18 13 17 5 +19 8 7 25 23 +20 11 10 24 4 +14 21 16 12 6 + +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`, + expected: 1924, + }, + ], + solution: part2, + }, + trimTestInputs: true, +}) diff --git a/src/utils/index.js b/src/utils/index.js index 70b969c..c847683 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -22,3 +22,6 @@ * import myLib from '../utils/myLib' * import { myUtil } from '../utils' */ +export function transpose(m) { + return m[0].map((x, i) => m.map((x) => x[i])) +}