From 3400a3a1b406b3fb9d5cce525b8a99234d2cf6ab Mon Sep 17 00:00:00 2001 From: amclin Date: Wed, 6 Dec 2023 06:12:41 +0000 Subject: [PATCH 01/28] docs: Update badges [skip ci] --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8c09184..1798931 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-5-blue) -![](https://img.shields.io/badge/stars%20⭐-1-yellow) -![](https://img.shields.io/badge/days%20completed-0-red) +![](https://img.shields.io/badge/day%20📅-6-blue) +![](https://img.shields.io/badge/stars%20⭐-2-yellow) +![](https://img.shields.io/badge/days%20completed-1-red) ## Run the currently configured default day `npm start` From d043c01a63425e683b934e946fd1a03f841de292 Mon Sep 17 00:00:00 2001 From: amclin Date: Thu, 7 Dec 2023 06:12:58 +0000 Subject: [PATCH 02/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1798931..a7108aa 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-6-blue) +![](https://img.shields.io/badge/day%20📅-7-blue) ![](https://img.shields.io/badge/stars%20⭐-2-yellow) ![](https://img.shields.io/badge/days%20completed-1-red) From 1a458178a1aa769c162fe74898dd3b3276722841 Mon Sep 17 00:00:00 2001 From: amclin Date: Fri, 8 Dec 2023 06:12:41 +0000 Subject: [PATCH 03/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a7108aa..116f5db 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-7-blue) +![](https://img.shields.io/badge/day%20📅-8-blue) ![](https://img.shields.io/badge/stars%20⭐-2-yellow) ![](https://img.shields.io/badge/days%20completed-1-red) From c19402541158807d7aaa6c373e3b5b488a4070de Mon Sep 17 00:00:00 2001 From: amclin Date: Sat, 9 Dec 2023 06:11:38 +0000 Subject: [PATCH 04/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 116f5db..41bbf15 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-8-blue) +![](https://img.shields.io/badge/day%20📅-9-blue) ![](https://img.shields.io/badge/stars%20⭐-2-yellow) ![](https://img.shields.io/badge/days%20completed-1-red) From 5b1ef0596444bd1cb0ffed248ec9ad199797fbea Mon Sep 17 00:00:00 2001 From: amclin Date: Sun, 10 Dec 2023 06:11:38 +0000 Subject: [PATCH 05/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 41bbf15..cc2c67c 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-9-blue) +![](https://img.shields.io/badge/day%20📅-10-blue) ![](https://img.shields.io/badge/stars%20⭐-2-yellow) ![](https://img.shields.io/badge/days%20completed-1-red) From ecae7c532029629462a399d5db8ffe6fd9d4645c Mon Sep 17 00:00:00 2001 From: amclin Date: Mon, 11 Dec 2023 06:13:19 +0000 Subject: [PATCH 06/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cc2c67c..bceb2fd 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-10-blue) +![](https://img.shields.io/badge/day%20📅-11-blue) ![](https://img.shields.io/badge/stars%20⭐-2-yellow) ![](https://img.shields.io/badge/days%20completed-1-red) From 9bd0ce0786a3ab6ea110d9eb0750644d69e58071 Mon Sep 17 00:00:00 2001 From: amclin Date: Tue, 12 Dec 2023 06:12:39 +0000 Subject: [PATCH 07/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bceb2fd..789ae98 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-11-blue) +![](https://img.shields.io/badge/day%20📅-12-blue) ![](https://img.shields.io/badge/stars%20⭐-2-yellow) ![](https://img.shields.io/badge/days%20completed-1-red) From 12ab3b26166b8a30f79cd489993269418d4c30cf Mon Sep 17 00:00:00 2001 From: amclin Date: Wed, 13 Dec 2023 06:13:05 +0000 Subject: [PATCH 08/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 789ae98..47cf7a6 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-12-blue) +![](https://img.shields.io/badge/day%20📅-13-blue) ![](https://img.shields.io/badge/stars%20⭐-2-yellow) ![](https://img.shields.io/badge/days%20completed-1-red) From be075d5fb14d9b14062654372ceb18b7662e44b7 Mon Sep 17 00:00:00 2001 From: amclin Date: Thu, 14 Dec 2023 06:13:09 +0000 Subject: [PATCH 09/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 47cf7a6..c2dcf15 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-13-blue) +![](https://img.shields.io/badge/day%20📅-14-blue) ![](https://img.shields.io/badge/stars%20⭐-2-yellow) ![](https://img.shields.io/badge/days%20completed-1-red) From e17ca18a9e81c463135215eb69b247a57bac88e3 Mon Sep 17 00:00:00 2001 From: Anthony McLin Date: Thu, 14 Dec 2023 18:30:38 -0800 Subject: [PATCH 10/28] feat(2023-02): parse game draw data --- 2023/day-02/game.js | 28 +++++++++++++++++++ 2023/day-02/game.test.js | 60 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 2023/day-02/game.js create mode 100644 2023/day-02/game.test.js diff --git a/2023/day-02/game.js b/2023/day-02/game.js new file mode 100644 index 0000000..e985fa1 --- /dev/null +++ b/2023/day-02/game.js @@ -0,0 +1,28 @@ +const parseGame = (gameString) => { + const data = gameString.split(':') + const id = parseInt( + data[0].match(/\d+/)[0] // find the game number + ) + const draws = data[1].split(';') // split the game into draws + .map((draw) => { + const result = ['red', 'green', 'blue'] + .map((color) => { // extract count for each color + const reg = new RegExp(`\\d+(?= ${color})`) + console.debug(reg) + const val = draw.match(reg) || [0] + console.debug(`${color} ${val}`) + return parseInt(val).toString(16).padStart(2, '0') // convert to hex + }) + + return result.join('') // combine into a RGB hex color string + }) + + return { + id, + draws + } +} + +module.exports = { + parseGame +} diff --git a/2023/day-02/game.test.js b/2023/day-02/game.test.js new file mode 100644 index 0000000..33987d1 --- /dev/null +++ b/2023/day-02/game.test.js @@ -0,0 +1,60 @@ +/* eslint-env mocha */ +const { expect } = require('chai') +const { parseGame } = require('./game') + +describe('--- Day 2: Cube Conundrum ---', () => { + describe('Part 1', () => { + describe('parseGame', () => { + it('extracts a game string into a data object with RGB hex values for draws', () => { + const data = [ + 'Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green', + 'Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue', + 'Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red', + 'Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red', + 'Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green' + ] + const result = [ + { + id: 1, + draws: [ + '040003', + '010206', + '000200' + ] + }, { + id: 2, + draws: [ + '000201', + '010304', + '000101' + ] + }, { + id: 3, + draws: [ + '140806', + '040d05', + '010500' + ] + }, { + id: 4, + draws: [ + '030106', + '060300', + '0e030f' + ] + }, { + id: 5, + draws: [ + '060301', + '010202' + ] + } + ] + + data.forEach((game, idx) => { + expect(parseGame(game)).to.deep.equal(result[idx]) + }) + }) + }) + }) +}) From cff0f915c3cc407a41c9c79dfd29bb32c22be9ca Mon Sep 17 00:00:00 2001 From: Anthony McLin Date: Thu, 14 Dec 2023 18:37:56 -0800 Subject: [PATCH 11/28] test(2023-02): validate game against limits --- 2023/day-02/game.js | 7 +++++- 2023/day-02/game.test.js | 49 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/2023/day-02/game.js b/2023/day-02/game.js index e985fa1..b6593de 100644 --- a/2023/day-02/game.js +++ b/2023/day-02/game.js @@ -23,6 +23,11 @@ const parseGame = (gameString) => { } } +const validateGame = () => { + +} + module.exports = { - parseGame + parseGame, + validateGame } diff --git a/2023/day-02/game.test.js b/2023/day-02/game.test.js index 33987d1..57adae9 100644 --- a/2023/day-02/game.test.js +++ b/2023/day-02/game.test.js @@ -1,6 +1,6 @@ /* eslint-env mocha */ const { expect } = require('chai') -const { parseGame } = require('./game') +const { parseGame, validateGame } = require('./game') describe('--- Day 2: Cube Conundrum ---', () => { describe('Part 1', () => { @@ -56,5 +56,52 @@ describe('--- Day 2: Cube Conundrum ---', () => { }) }) }) + + describe('validateGame', () => { + it.only('checks if the game is valid given the limits', () => { + const limits = '0c0d0e' // 12 red cubes, 13 green cubes, and 14 blue cubes + const data = [ + { + id: 1, + draws: [ + '040003', + '010206', + '000200' + ] + }, { + id: 2, + draws: [ + '000201', + '010304', + '000101' + ] + }, { + id: 3, + draws: [ + '140806', + '040d05', + '010500' + ] + }, { + id: 4, + draws: [ + '030106', + '060300', + '0e030f' + ] + }, { + id: 5, + draws: [ + '060301', + '010202' + ] + } + ] + const result = [true, true, false, false, true] + data.forEach((game, idx) => { + expect(validateGame(game, limits)).to.equal(result[idx]) + }) + }) + }) }) }) From a86014f8ff798854001bd0839feb6034d997a621 Mon Sep 17 00:00:00 2001 From: Anthony McLin Date: Thu, 14 Dec 2023 18:54:58 -0800 Subject: [PATCH 12/28] feat(2023-03): validate cube game against limits --- 2023/day-02/game.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/2023/day-02/game.js b/2023/day-02/game.js index b6593de..9d1e0ad 100644 --- a/2023/day-02/game.js +++ b/2023/day-02/game.js @@ -23,8 +23,27 @@ const parseGame = (gameString) => { } } -const validateGame = () => { +const parseHex = (hex) => { + return { + r: parseInt(hex.substring(0, 2), 16), + g: parseInt(hex.substring(2, 4), 16), + b: parseInt(hex.substring(4, 6), 16) + } +} + +const validateGame = (game, limit) => { + const lim = parseHex(limit) + + const tally = game.draws.reduce((acc, draw) => { + const drawData = parseHex(draw) + return { + r: acc.r + drawData.r, + g: acc.g + drawData.g, + b: acc.b + drawData.b + } + }, { r: 0, g: 0, b: 0 }) + return (tally.r <= lim.r && tally.g <= lim.g && tally.b <= lim.b) } module.exports = { From f69ddc5226b06fc7c1e4ebe3c12d5a18db7f399c Mon Sep 17 00:00:00 2001 From: Anthony McLin Date: Thu, 14 Dec 2023 19:01:25 -0800 Subject: [PATCH 13/28] feat(2023-02): checksum a set of games produces a checksum of a set of games by tallying the IDs of games that are valid --- 2023/day-02/game.js | 10 +++++++- 2023/day-02/game.test.js | 49 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/2023/day-02/game.js b/2023/day-02/game.js index 9d1e0ad..c2f4c8f 100644 --- a/2023/day-02/game.js +++ b/2023/day-02/game.js @@ -46,7 +46,15 @@ const validateGame = (game, limit) => { return (tally.r <= lim.r && tally.g <= lim.g && tally.b <= lim.b) } +const checksumGameSet = (games, limit) => { + // tally the IDs of valid games + return games.reduce((acc, game) => { + return validateGame(game, limit) ? acc + game.id : acc + }, 0) +} + module.exports = { parseGame, - validateGame + validateGame, + checksumGameSet } diff --git a/2023/day-02/game.test.js b/2023/day-02/game.test.js index 57adae9..c3ebd48 100644 --- a/2023/day-02/game.test.js +++ b/2023/day-02/game.test.js @@ -1,6 +1,6 @@ /* eslint-env mocha */ const { expect } = require('chai') -const { parseGame, validateGame } = require('./game') +const { parseGame, validateGame, checksumGameSet } = require('./game') describe('--- Day 2: Cube Conundrum ---', () => { describe('Part 1', () => { @@ -58,7 +58,7 @@ describe('--- Day 2: Cube Conundrum ---', () => { }) describe('validateGame', () => { - it.only('checks if the game is valid given the limits', () => { + it('checks if the game is valid given the limits', () => { const limits = '0c0d0e' // 12 red cubes, 13 green cubes, and 14 blue cubes const data = [ { @@ -103,5 +103,50 @@ describe('--- Day 2: Cube Conundrum ---', () => { }) }) }) + + describe('checksumGameSet', () => { + it('tallies the IDs of valid games', () => { + const limits = '0c0d0e' // 12 red cubes, 13 green cubes, and 14 blue cubes + const data = [ + { + id: 1, + draws: [ + '040003', + '010206', + '000200' + ] + }, { + id: 2, + draws: [ + '000201', + '010304', + '000101' + ] + }, { + id: 3, + draws: [ + '140806', + '040d05', + '010500' + ] + }, { + id: 4, + draws: [ + '030106', + '060300', + '0e030f' + ] + }, { + id: 5, + draws: [ + '060301', + '010202' + ] + } + ] + + expect(checksumGameSet(data, limits)).to.equal(8) + }) + }) }) }) From 97069a3ca1a41912272075153a52b7a81f114c7a Mon Sep 17 00:00:00 2001 From: Anthony McLin Date: Thu, 14 Dec 2023 19:19:12 -0800 Subject: [PATCH 14/28] test(2023-02): day 1 result is larger than 1452 --- 2023/day-02/game.test.js | 26 ++++++++++ 2023/day-02/input.txt | 100 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 2023/day-02/input.txt diff --git a/2023/day-02/game.test.js b/2023/day-02/game.test.js index c3ebd48..5556eae 100644 --- a/2023/day-02/game.test.js +++ b/2023/day-02/game.test.js @@ -1,6 +1,10 @@ /* eslint-env mocha */ const { expect } = require('chai') const { parseGame, validateGame, checksumGameSet } = require('./game') +const { linesToArray } = require('../../2018/inputParser') +const fs = require('fs') +const path = require('path') +const filePath = path.join(__dirname, 'input.txt') describe('--- Day 2: Cube Conundrum ---', () => { describe('Part 1', () => { @@ -148,5 +152,27 @@ describe('--- Day 2: Cube Conundrum ---', () => { expect(checksumGameSet(data, limits)).to.equal(8) }) }) + + describe('integration test', () => { + let initData + before((done) => { + fs.readFile(filePath, { encoding: 'utf8' }, (err, rawData) => { + if (err) throw err + initData = linesToArray(rawData.trim()).map(parseGame) + // Deep copy to ensure we aren't mutating the original data + // data = JSON.parse(JSON.stringify(initData)) + done() + }) + }) + + it('result is larger than 1452', () => { + const limit = [12, 13, 14] // 12 red, 13 green, 14 blue + .map((num) => parseInt(num, 16)) + .join('') + + // Solution set for + expect(checksumGameSet(initData, limit)).to.be.gt(1452) + }) + }) }) }) diff --git a/2023/day-02/input.txt b/2023/day-02/input.txt new file mode 100644 index 0000000..e25a721 --- /dev/null +++ b/2023/day-02/input.txt @@ -0,0 +1,100 @@ +Game 1: 13 red, 18 green; 5 green, 3 red, 5 blue; 5 green, 9 red, 6 blue; 3 blue, 3 green +Game 2: 2 green, 3 blue, 5 red; 9 green, 4 red, 2 blue; 4 green, 3 blue; 2 blue, 3 red; 5 red, 3 blue, 9 green; 9 green, 5 red, 2 blue +Game 3: 12 green, 3 red, 3 blue; 2 blue, 5 green, 2 red; 2 red, 3 blue, 11 green; 2 red, 8 green, 7 blue +Game 4: 1 green, 2 blue; 7 green, 13 red; 2 blue, 5 green, 7 red; 6 green, 2 red +Game 5: 6 blue, 4 green; 8 blue, 7 green; 1 red, 10 blue +Game 6: 4 red, 4 blue, 2 green; 8 green, 1 blue, 8 red; 9 green, 1 red, 3 blue +Game 7: 3 red, 12 green, 4 blue; 1 blue, 3 red, 6 green; 4 blue, 3 red, 15 green; 11 green, 2 blue, 2 red +Game 8: 13 blue, 7 green, 8 red; 5 green, 8 blue, 2 red; 5 red, 6 blue, 7 green; 6 green, 6 red, 3 blue; 7 blue, 8 red, 6 green +Game 9: 4 blue, 1 green, 4 red; 16 red, 1 green, 7 blue; 11 red, 3 green, 7 blue +Game 10: 5 green, 1 red; 5 green, 3 blue; 1 red, 7 green, 3 blue; 1 blue, 6 green; 2 green, 4 blue +Game 11: 10 green, 2 blue, 2 red; 14 green, 1 blue, 3 red; 13 green; 3 green, 2 red; 3 red, 1 blue, 2 green; 1 red, 10 green, 2 blue +Game 12: 9 green, 2 blue; 11 green, 1 blue; 2 red, 1 blue; 1 blue, 2 red, 3 green; 1 blue, 2 red, 3 green +Game 13: 11 blue, 3 red, 8 green; 9 red, 7 blue; 7 blue, 4 red +Game 14: 17 blue, 2 red; 1 green, 13 blue, 1 red; 4 blue, 1 red, 4 green; 2 blue, 5 red, 13 green; 3 blue, 4 green, 6 red; 9 green, 14 blue, 6 red +Game 15: 7 green, 2 blue, 3 red; 4 red, 18 green; 8 green, 1 blue; 3 red, 15 green, 2 blue; 1 red, 15 green; 9 green, 3 red, 1 blue +Game 16: 10 red, 19 blue, 5 green; 12 red, 5 blue; 6 red, 3 green, 14 blue; 8 red, 10 blue, 6 green; 7 green, 10 red, 17 blue +Game 17: 3 green, 3 red, 1 blue; 3 blue, 1 green, 2 red; 4 green, 3 red, 2 blue +Game 18: 1 red, 2 blue; 1 green, 4 blue; 1 blue; 5 blue; 1 green, 3 red, 6 blue +Game 19: 3 blue, 5 red, 8 green; 10 red, 6 blue, 11 green; 5 blue, 7 red, 8 green; 9 blue, 6 green, 5 red; 8 red, 12 green, 8 blue; 1 blue, 5 green, 10 red +Game 20: 16 blue, 2 green; 10 green, 1 red, 4 blue; 13 green, 5 red, 9 blue +Game 21: 1 blue, 1 green, 14 red; 2 blue; 5 green, 1 blue; 2 green, 11 red; 2 red, 4 green; 2 green, 16 red +Game 22: 1 green, 10 red, 4 blue; 1 green, 4 blue, 8 red; 2 blue, 8 red; 4 green, 14 red; 1 blue, 5 red, 2 green +Game 23: 17 green, 3 red, 16 blue; 9 green, 15 red; 3 red, 8 blue, 15 green +Game 24: 1 green, 1 blue; 2 blue, 1 green, 2 red; 3 green, 1 blue, 1 red; 3 blue, 1 red; 2 green, 5 blue +Game 25: 11 red, 2 green; 7 red, 6 green; 10 red, 1 blue, 8 green; 8 green, 4 red; 6 green, 10 red; 2 blue, 7 red +Game 26: 2 green, 2 blue, 8 red; 1 blue, 1 red, 6 green; 9 red, 6 green, 2 blue +Game 27: 5 red, 7 blue, 3 green; 3 blue, 1 red; 1 green, 1 red, 9 blue +Game 28: 17 red, 5 green, 10 blue; 3 red, 14 blue, 1 green; 11 blue, 11 green +Game 29: 16 red, 4 green, 4 blue; 3 green, 5 blue, 11 red; 7 blue, 8 red, 1 green; 1 green, 10 red, 4 blue; 2 green, 4 blue, 8 red +Game 30: 3 green, 6 blue; 18 green, 3 blue; 14 green, 11 blue; 7 blue, 2 red, 17 green; 1 red, 12 green, 7 blue +Game 31: 11 red, 2 green, 3 blue; 10 green, 11 blue, 15 red; 12 green, 17 blue, 5 red; 5 green, 2 red, 12 blue; 13 blue, 13 green, 4 red +Game 32: 4 red, 2 blue, 5 green; 7 blue, 15 red; 11 blue, 4 green, 8 red +Game 33: 18 blue, 3 green, 3 red; 3 green, 6 red; 2 blue, 4 red, 1 green; 3 green, 5 red, 3 blue +Game 34: 5 red, 2 blue, 16 green; 9 red, 10 blue, 3 green; 8 red, 10 green, 13 blue +Game 35: 7 blue, 5 red; 3 red, 1 blue; 4 blue, 7 red, 1 green; 4 red, 4 blue, 1 green; 3 blue, 7 red; 4 red, 1 green, 3 blue +Game 36: 14 blue; 10 blue, 1 green; 10 blue, 4 green; 4 blue, 1 green, 1 red; 1 red, 6 blue, 4 green; 1 green, 1 red, 11 blue +Game 37: 8 red, 13 green, 5 blue; 11 red, 16 green, 8 blue; 2 green, 10 blue, 11 red +Game 38: 2 red, 1 blue, 10 green; 7 red, 6 blue, 14 green; 18 red, 1 blue, 5 green; 5 green, 5 blue, 13 red; 14 red, 5 green; 15 green, 13 red, 2 blue +Game 39: 1 blue, 5 red; 9 red, 9 green; 4 blue, 10 green, 4 red; 3 green, 11 red, 1 blue; 2 green, 11 red, 4 blue +Game 40: 9 blue, 4 green; 12 green, 1 red; 2 red, 15 green, 10 blue +Game 41: 1 blue, 14 red, 12 green; 16 green, 2 blue, 3 red; 6 green, 9 red +Game 42: 4 green, 13 red, 9 blue; 9 green, 9 red, 4 blue; 7 blue, 10 red, 9 green; 4 green, 18 blue, 14 red; 9 blue, 7 green, 2 red +Game 43: 7 red, 6 blue; 4 green; 3 red, 6 green; 7 blue, 6 green, 8 red; 9 green, 7 blue, 7 red; 5 blue, 5 green, 6 red +Game 44: 5 red, 8 blue; 2 red, 5 green; 6 green, 11 blue, 2 red; 1 green, 1 blue, 2 red +Game 45: 3 blue, 7 green, 1 red; 5 red, 1 blue; 2 blue, 3 red; 8 green, 5 red +Game 46: 4 red, 4 blue, 17 green; 1 blue, 5 green, 1 red; 1 red, 1 blue, 7 green; 18 green, 7 blue +Game 47: 14 red, 3 green, 2 blue; 4 green, 4 red, 2 blue; 13 red, 1 blue +Game 48: 5 red, 12 blue, 2 green; 3 blue, 1 red, 2 green; 10 blue, 7 red +Game 49: 6 blue, 11 red; 11 red, 17 blue, 11 green; 16 blue, 12 green, 6 red +Game 50: 12 blue, 3 green, 1 red; 3 green, 10 blue, 3 red; 11 blue, 3 red +Game 51: 12 green, 1 blue, 8 red; 6 blue, 1 green, 9 red; 17 red, 5 blue; 7 blue, 9 green, 9 red; 13 green, 10 red, 2 blue +Game 52: 5 blue, 1 green; 1 red, 1 green, 3 blue; 8 blue, 1 green; 1 green, 7 blue; 3 blue; 1 red, 6 blue +Game 53: 11 green, 5 red; 16 green, 6 blue; 4 red, 19 green, 4 blue +Game 54: 6 green, 4 blue, 8 red; 7 red, 6 green, 5 blue; 5 blue, 4 red; 5 blue, 14 red +Game 55: 11 blue, 1 green; 2 red, 5 blue, 1 green; 10 blue, 1 green; 11 blue; 2 green, 2 red, 5 blue +Game 56: 1 red, 9 blue, 1 green; 2 red, 8 blue; 1 green, 9 blue, 10 red; 5 blue, 1 green; 15 blue, 1 red; 12 blue, 4 red +Game 57: 1 green, 17 blue; 10 blue, 2 green; 2 red, 16 blue; 6 green, 15 blue; 5 green; 2 red, 1 green +Game 58: 2 blue, 4 green, 2 red; 5 blue; 5 red, 3 green, 2 blue; 5 red, 2 green, 5 blue; 7 green, 3 red, 4 blue; 4 red +Game 59: 8 blue, 2 red, 2 green; 15 blue, 1 green, 4 red; 9 blue, 1 red; 3 green, 5 red, 5 blue +Game 60: 3 red, 2 blue, 6 green; 1 red, 5 green; 2 blue, 10 green; 6 green, 2 red +Game 61: 6 green, 4 blue; 1 red, 4 blue, 15 green; 1 blue, 16 green, 3 red; 6 red, 12 green, 2 blue; 3 red, 14 green, 1 blue; 3 red, 2 blue, 9 green +Game 62: 1 green, 2 red; 4 red; 1 green, 4 red, 1 blue; 1 red, 1 blue, 1 green +Game 63: 8 green, 4 red, 4 blue; 5 red, 4 blue, 8 green; 3 green, 1 blue +Game 64: 5 blue, 2 green, 5 red; 3 green, 2 blue, 1 red; 6 blue, 2 red, 1 green; 2 green, 2 blue, 3 red; 3 blue, 1 red +Game 65: 2 red, 7 green, 5 blue; 8 blue, 3 green, 4 red; 1 red, 6 green, 1 blue +Game 66: 1 green, 6 red; 5 red, 1 green, 1 blue; 4 red, 1 blue, 1 green; 1 blue, 2 red, 1 green; 1 blue, 5 red; 1 blue, 8 red +Game 67: 6 red, 8 blue, 8 green; 5 green, 2 red, 10 blue; 4 red, 1 green; 7 blue, 2 green +Game 68: 7 green, 9 red, 15 blue; 4 green, 6 red, 3 blue; 1 blue, 5 green, 4 red; 9 green, 14 red, 6 blue; 8 blue, 15 red, 4 green; 7 green, 14 blue, 6 red +Game 69: 4 green; 2 blue; 4 green, 8 blue, 11 red; 3 green, 9 red, 4 blue; 1 red, 2 blue; 2 green, 5 blue, 11 red +Game 70: 6 blue, 16 green, 4 red; 6 green, 13 red, 2 blue; 7 green, 1 red, 2 blue; 8 green, 4 blue, 1 red; 10 red, 11 green +Game 71: 6 blue, 7 red; 10 blue, 2 green, 4 red; 12 red, 10 blue, 1 green +Game 72: 13 red, 13 blue; 6 red, 10 blue, 7 green; 3 blue, 5 green, 4 red; 8 green, 9 blue +Game 73: 1 red, 1 green, 8 blue; 1 green, 8 blue; 2 green, 6 blue; 2 blue; 1 red, 12 blue; 12 blue, 3 green +Game 74: 2 blue, 1 green, 1 red; 3 blue, 1 red, 1 green; 3 blue, 2 red; 3 blue, 1 red; 1 green +Game 75: 10 red, 1 green, 4 blue; 12 red, 11 blue, 9 green; 18 green, 14 red, 5 blue +Game 76: 4 blue, 3 green, 11 red; 4 blue, 1 green, 12 red; 11 blue, 2 green, 4 red; 2 blue, 2 green, 11 red; 12 red, 1 blue; 4 red, 2 green, 15 blue +Game 77: 2 red, 10 blue, 6 green; 6 blue, 2 red, 8 green; 1 red, 9 green, 7 blue +Game 78: 3 green, 10 red; 2 blue, 4 red, 3 green; 8 red, 3 blue, 4 green; 1 blue, 7 red +Game 79: 4 green, 2 red; 2 red, 14 green; 1 blue, 5 green, 8 red; 4 red, 20 green; 3 green, 1 blue, 8 red; 4 green, 1 blue +Game 80: 2 green; 3 green, 13 red, 10 blue; 6 blue, 10 red, 1 green; 10 green, 12 red, 3 blue; 10 blue, 17 red, 5 green; 8 red, 2 blue, 6 green +Game 81: 4 green, 2 blue, 4 red; 16 red, 1 blue, 20 green; 7 blue, 10 red, 9 green; 7 blue, 2 green, 14 red +Game 82: 4 blue, 8 green, 5 red; 14 red, 8 blue, 1 green; 11 red, 13 green +Game 83: 2 blue, 2 green, 10 red; 10 green, 4 red, 3 blue; 11 green, 14 red, 4 blue; 2 blue, 11 red; 3 blue, 1 green, 4 red +Game 84: 12 blue, 9 green, 10 red; 1 red, 6 green, 4 blue; 7 red, 3 green, 16 blue; 3 green, 3 blue +Game 85: 2 red, 4 blue; 4 blue, 1 green, 6 red; 9 blue, 1 red; 1 green, 4 blue, 10 red; 5 green, 7 red, 17 blue +Game 86: 2 red, 3 blue, 1 green; 2 blue, 2 red, 2 green; 10 blue, 2 green; 5 green, 4 red, 6 blue +Game 87: 1 red, 7 blue, 9 green; 3 green, 2 blue; 1 red, 4 blue, 10 green; 10 green, 7 blue, 1 red; 6 blue, 9 green; 9 blue, 7 green, 1 red +Game 88: 1 blue, 14 red, 9 green; 4 green, 9 red; 8 green, 1 blue, 10 red +Game 89: 13 red, 1 green; 2 blue, 10 red; 1 green, 3 blue, 13 red; 1 green, 14 red, 3 blue; 2 green, 6 red; 1 green, 12 red +Game 90: 1 red, 2 blue, 9 green; 1 blue, 3 red, 2 green; 10 green, 9 red; 1 red, 9 green, 4 blue; 3 blue, 13 green, 13 red +Game 91: 2 red, 8 green, 8 blue; 3 green, 2 red, 6 blue; 5 green, 4 red +Game 92: 8 green, 12 blue, 4 red; 7 red, 4 green; 4 blue, 7 green, 7 red; 7 blue, 5 green +Game 93: 1 green, 1 red, 2 blue; 3 green, 1 red, 3 blue; 1 red, 8 blue; 1 green, 13 blue; 1 red, 4 blue, 4 green +Game 94: 2 blue, 7 red, 17 green; 2 green, 1 blue, 5 red; 3 blue, 7 green, 1 red; 6 red, 1 blue, 1 green; 1 green, 1 blue, 1 red +Game 95: 4 blue, 3 green, 4 red; 17 red, 2 blue; 6 blue, 16 green, 15 red; 7 blue, 17 green; 1 red, 3 green, 3 blue; 7 red, 14 green, 4 blue +Game 96: 6 red, 3 blue; 7 green, 5 blue, 10 red; 9 green, 1 blue; 6 blue, 1 red, 12 green; 3 blue, 10 green +Game 97: 3 green, 1 red, 13 blue; 1 red, 8 green, 2 blue; 1 green, 2 blue, 2 red; 1 red, 4 green, 9 blue +Game 98: 1 green, 8 red, 7 blue; 8 blue, 8 red, 3 green; 1 blue, 2 red; 4 red, 7 blue; 3 green, 3 blue, 3 red +Game 99: 9 blue, 14 red; 3 blue, 10 red, 5 green; 3 blue, 3 green, 6 red +Game 100: 12 blue, 2 green; 2 green, 4 red, 13 blue; 9 blue, 1 red, 2 green; 2 green, 3 red, 1 blue \ No newline at end of file From 5416c66aa91aa466fe8e26f4da503636a9caab61 Mon Sep 17 00:00:00 2001 From: Anthony McLin Date: Thu, 14 Dec 2023 19:56:25 -0800 Subject: [PATCH 15/28] fix(2023-02): validate games correctly cubes stay out of the bag after each draw --- 2023/day-02/game.js | 38 +++++++++++++++++++++++++++----------- 2023/day-02/game.test.js | 21 ++++++++++++++++----- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/2023/day-02/game.js b/2023/day-02/game.js index c2f4c8f..361d16c 100644 --- a/2023/day-02/game.js +++ b/2023/day-02/game.js @@ -31,19 +31,34 @@ const parseHex = (hex) => { } } -const validateGame = (game, limit) => { +const validateDraw = (draw, limit) => { + const data = parseHex(draw) const lim = parseHex(limit) + return (data.r <= lim.r && data.g <= lim.g && data.b <= lim.b) +} + +const validateGame = (game, limit) => { + // const lim = parseHex(limit) + // const tally = game.draws.reduce((acc, draw) => { + // const drawData = parseHex(draw) + // return { + // r: acc.r + drawData.r, + // g: acc.g + drawData.g, + // b: acc.b + drawData.b + // } + // }, { r: 0, g: 0, b: 0 }) - const tally = game.draws.reduce((acc, draw) => { - const drawData = parseHex(draw) - return { - r: acc.r + drawData.r, - g: acc.g + drawData.g, - b: acc.b + drawData.b - } - }, { r: 0, g: 0, b: 0 }) + // const result = (tally.r <= lim.r && tally.g <= lim.g && tally.b <= lim.b) + // console.debug(`Game ${game.id} ${(result) ? 'passes' : 'fails'}`) + // if (!result) { + // console.debug(tally) + // } - return (tally.r <= lim.r && tally.g <= lim.g && tally.b <= lim.b) + // If any draw fails, the full game fails + const result = game.draws.reduce((res, draw) => { + return (res && validateDraw(draw, limit)) + }, true) + return result } const checksumGameSet = (games, limit) => { @@ -56,5 +71,6 @@ const checksumGameSet = (games, limit) => { module.exports = { parseGame, validateGame, - checksumGameSet + checksumGameSet, + validateDraw } diff --git a/2023/day-02/game.test.js b/2023/day-02/game.test.js index 5556eae..fd13d0b 100644 --- a/2023/day-02/game.test.js +++ b/2023/day-02/game.test.js @@ -1,6 +1,6 @@ /* eslint-env mocha */ const { expect } = require('chai') -const { parseGame, validateGame, checksumGameSet } = require('./game') +const { parseGame, validateGame, checksumGameSet, validateDraw } = require('./game') const { linesToArray } = require('../../2018/inputParser') const fs = require('fs') const path = require('path') @@ -153,6 +153,17 @@ describe('--- Day 2: Cube Conundrum ---', () => { }) }) + describe('validateDraw', () => { + it('validates an individual draw is within limits', () => { + const limit = '0c0d0e' + expect(validateDraw('010206', limit)).to.equal(true) + expect(validateDraw('060301', limit)).to.equal(true) + expect(validateDraw('040d05', limit)).to.equal(true) + expect(validateDraw('140806', limit)).to.equal(false) // game 3 draw 1 has 20 reds + expect(validateDraw('0e030f', limit)).to.equal(false) // game 4 draw 3 has 15 blues + }) + }) + describe('integration test', () => { let initData before((done) => { @@ -165,13 +176,13 @@ describe('--- Day 2: Cube Conundrum ---', () => { }) }) - it('result is larger than 1452', () => { + it('result matches what we know about the answer', () => { const limit = [12, 13, 14] // 12 red, 13 green, 14 blue - .map((num) => parseInt(num, 16)) + .map((num) => num.toString(16).padStart(2, '0')) .join('') - // Solution set for - expect(checksumGameSet(initData, limit)).to.be.gt(1452) + expect(checksumGameSet(initData, limit)).to.be.gt(177) // 177 is too low + expect(checksumGameSet(initData, limit)).to.be.gt(1452) // 1452 (from creating the limit in hex wrong, and assuming cubes are not returned to the bag after each draw) is too low }) }) }) From 4e3f60cfa9c2f9771b67f529685a044b6be44fb4 Mon Sep 17 00:00:00 2001 From: Anthony McLin Date: Thu, 14 Dec 2023 19:56:56 -0800 Subject: [PATCH 16/28] feat(2023-02): solution for day 2 part 1 --- 2023/day-02/index.js | 3 +++ 2023/day-02/solution.js | 41 +++++++++++++++++++++++++++++++++++++++++ index.js | 2 +- 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 2023/day-02/index.js create mode 100644 2023/day-02/solution.js diff --git a/2023/day-02/index.js b/2023/day-02/index.js new file mode 100644 index 0000000..af7e035 --- /dev/null +++ b/2023/day-02/index.js @@ -0,0 +1,3 @@ +// eslint-disable-next-line no-unused-vars +const console = require('../helpers') +require('./solution') diff --git a/2023/day-02/solution.js b/2023/day-02/solution.js new file mode 100644 index 0000000..c2213a9 --- /dev/null +++ b/2023/day-02/solution.js @@ -0,0 +1,41 @@ +const fs = require('fs') +const path = require('path') +const filePath = path.join(__dirname, 'input.txt') +const { linesToArray } = require('../../2018/inputParser') +const { parseGame, checksumGameSet } = require('./game') + +fs.readFile(filePath, { encoding: 'utf8' }, (err, initData) => { + if (err) throw err + + initData = linesToArray(initData.trim()) + + const resetInput = () => { + // Deep copy to ensure we aren't mutating the original data + return JSON.parse(JSON.stringify(initData)) + } + + const part1 = () => { + const data = resetInput() + .map(parseGame) + const limit = [12, 13, 14] // 12 red, 13 green, 14 blue + .map((num) => num.toString(16).padStart(2, '0')) + .join('') + console.debug(`limit is ${limit}`) + + return checksumGameSet(data, limit) + } + + const part2 = () => { + const data = resetInput() + console.debug(data) + return 'No answer yet' + } + const answers = [] + answers.push(part1()) + answers.push(part2()) + + answers.forEach((ans, idx) => { + console.info(`-- Part ${idx + 1} --`) + console.info(`Answer: ${ans}`) + }) +}) diff --git a/index.js b/index.js index a1611a7..557add4 100644 --- a/index.js +++ b/index.js @@ -1 +1 @@ -require('./2023/day-01/solution') +require('./2023/day-02/solution') From a3205bc19d73b4ca830c29b51e572ecccb097726 Mon Sep 17 00:00:00 2001 From: Anthony McLin Date: Thu, 14 Dec 2023 20:15:22 -0800 Subject: [PATCH 17/28] feat(2023-02): solution for part 2 --- 2023/day-02/game.js | 22 +++++++++++++++++++- 2023/day-02/game.test.js | 43 ++++++++++++++++++++++++++++++++++++++-- 2023/day-02/solution.js | 9 ++++++--- 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/2023/day-02/game.js b/2023/day-02/game.js index 361d16c..37ea786 100644 --- a/2023/day-02/game.js +++ b/2023/day-02/game.js @@ -68,9 +68,29 @@ const checksumGameSet = (games, limit) => { }, 0) } +const countCubesNeeded = (game) => { + const max = game.draws.reduce((acc, draw) => { + const drawData = parseHex(draw) + return { + r: Math.max(acc.r, drawData.r), + g: Math.max(acc.g, drawData.g), + b: Math.max(acc.b, drawData.b) + } + }, { r: 0, g: 0, b: 0 }) + + return max +} + +const power = (game) => { + const needed = countCubesNeeded(game) + return needed.r * needed.g * needed.b +} + module.exports = { parseGame, validateGame, checksumGameSet, - validateDraw + validateDraw, + countCubesNeeded, + power } diff --git a/2023/day-02/game.test.js b/2023/day-02/game.test.js index fd13d0b..f989d93 100644 --- a/2023/day-02/game.test.js +++ b/2023/day-02/game.test.js @@ -1,6 +1,6 @@ /* eslint-env mocha */ const { expect } = require('chai') -const { parseGame, validateGame, checksumGameSet, validateDraw } = require('./game') +const { parseGame, validateGame, checksumGameSet, validateDraw, countCubesNeeded, power } = require('./game') const { linesToArray } = require('../../2018/inputParser') const fs = require('fs') const path = require('path') @@ -164,7 +164,7 @@ describe('--- Day 2: Cube Conundrum ---', () => { }) }) - describe('integration test', () => { + describe.skip('integration test', () => { let initData before((done) => { fs.readFile(filePath, { encoding: 'utf8' }, (err, rawData) => { @@ -186,4 +186,43 @@ describe('--- Day 2: Cube Conundrum ---', () => { }) }) }) + + describe('Part 2', () => { + describe('countCubesNeeded', () => { + it('counts how many cubes are needed for a game', () => { + const data = [ + 'Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green', + 'Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue', + 'Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red', + 'Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red', + 'Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green' + ] + const result = [ + { r: 4, g: 2, b: 6 }, + { r: 1, g: 3, b: 4 }, + { r: 20, g: 13, b: 6 }, + { r: 14, g: 3, b: 15 }, + { r: 6, g: 3, b: 2 } + ] + data.forEach((game, idx) => { + expect(countCubesNeeded(parseGame(game))).to.deep.equal(result[idx]) + }) + }) + }) + describe('power', () => { + it('calculates the power for a game', () => { + const data = [ + 'Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green', + 'Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue', + 'Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red', + 'Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red', + 'Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green' + ] + const result = [48, 12, 1560, 630, 36] + data.forEach((game, idx) => { + expect(power(parseGame(game))).to.equal(result[idx]) + }) + }) + }) + }) }) diff --git a/2023/day-02/solution.js b/2023/day-02/solution.js index c2213a9..01a6c04 100644 --- a/2023/day-02/solution.js +++ b/2023/day-02/solution.js @@ -2,7 +2,7 @@ const fs = require('fs') const path = require('path') const filePath = path.join(__dirname, 'input.txt') const { linesToArray } = require('../../2018/inputParser') -const { parseGame, checksumGameSet } = require('./game') +const { parseGame, checksumGameSet, power } = require('./game') fs.readFile(filePath, { encoding: 'utf8' }, (err, initData) => { if (err) throw err @@ -27,8 +27,11 @@ fs.readFile(filePath, { encoding: 'utf8' }, (err, initData) => { const part2 = () => { const data = resetInput() - console.debug(data) - return 'No answer yet' + .map(parseGame) + + return data.reduce((acc, game) => { + return acc + power(game) + }, 0) } const answers = [] answers.push(part1()) From b2d6ca9e2d17acefc6febde5a8c6aaf76770f106 Mon Sep 17 00:00:00 2001 From: amclin Date: Fri, 15 Dec 2023 06:12:44 +0000 Subject: [PATCH 18/28] docs: Update badges [skip ci] --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c2dcf15..9b41c5c 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-14-blue) -![](https://img.shields.io/badge/stars%20⭐-2-yellow) -![](https://img.shields.io/badge/days%20completed-1-red) +![](https://img.shields.io/badge/day%20📅-15-blue) +![](https://img.shields.io/badge/stars%20⭐-4-yellow) +![](https://img.shields.io/badge/days%20completed-2-red) ## Run the currently configured default day `npm start` From 91b46654b293d1231e85e1e67d90162b69ff90e9 Mon Sep 17 00:00:00 2001 From: amclin Date: Sat, 16 Dec 2023 06:11:26 +0000 Subject: [PATCH 19/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9b41c5c..9a8925f 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-15-blue) +![](https://img.shields.io/badge/day%20📅-16-blue) ![](https://img.shields.io/badge/stars%20⭐-4-yellow) ![](https://img.shields.io/badge/days%20completed-2-red) From 3b09317c99f977d5022881589e04bb9f2a7e0f77 Mon Sep 17 00:00:00 2001 From: amclin Date: Sun, 17 Dec 2023 06:11:32 +0000 Subject: [PATCH 20/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a8925f..0a2d082 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-16-blue) +![](https://img.shields.io/badge/day%20📅-17-blue) ![](https://img.shields.io/badge/stars%20⭐-4-yellow) ![](https://img.shields.io/badge/days%20completed-2-red) From e10c6111b5c1d7ce05782338709b5f4f91e758b2 Mon Sep 17 00:00:00 2001 From: amclin Date: Mon, 18 Dec 2023 06:13:18 +0000 Subject: [PATCH 21/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0a2d082..dad79c6 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-17-blue) +![](https://img.shields.io/badge/day%20📅-18-blue) ![](https://img.shields.io/badge/stars%20⭐-4-yellow) ![](https://img.shields.io/badge/days%20completed-2-red) From b05280fbe89fe069344a604c923056ea0f36f22d Mon Sep 17 00:00:00 2001 From: amclin Date: Tue, 19 Dec 2023 06:12:45 +0000 Subject: [PATCH 22/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dad79c6..c861fc5 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-18-blue) +![](https://img.shields.io/badge/day%20📅-19-blue) ![](https://img.shields.io/badge/stars%20⭐-4-yellow) ![](https://img.shields.io/badge/days%20completed-2-red) From e4b4cc00ddcf847fe1a83958ff38ae358a6b4320 Mon Sep 17 00:00:00 2001 From: amclin Date: Wed, 20 Dec 2023 06:10:26 +0000 Subject: [PATCH 23/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c861fc5..b1f528a 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-19-blue) +![](https://img.shields.io/badge/day%20📅-20-blue) ![](https://img.shields.io/badge/stars%20⭐-4-yellow) ![](https://img.shields.io/badge/days%20completed-2-red) From 4ed6a6be1bdb5eb23454e1604f08b81af0a1a8ff Mon Sep 17 00:00:00 2001 From: amclin Date: Thu, 21 Dec 2023 06:12:39 +0000 Subject: [PATCH 24/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b1f528a..4086391 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-20-blue) +![](https://img.shields.io/badge/day%20📅-21-blue) ![](https://img.shields.io/badge/stars%20⭐-4-yellow) ![](https://img.shields.io/badge/days%20completed-2-red) From b994ed4db554693293809a0c3da4fafa6ec56e14 Mon Sep 17 00:00:00 2001 From: amclin Date: Fri, 22 Dec 2023 06:12:30 +0000 Subject: [PATCH 25/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4086391..6a7489d 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-21-blue) +![](https://img.shields.io/badge/day%20📅-22-blue) ![](https://img.shields.io/badge/stars%20⭐-4-yellow) ![](https://img.shields.io/badge/days%20completed-2-red) From ae5d8b396f54d91d09bd48f6fef1decc21f2a503 Mon Sep 17 00:00:00 2001 From: amclin Date: Sat, 23 Dec 2023 06:11:32 +0000 Subject: [PATCH 26/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6a7489d..643228e 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-22-blue) +![](https://img.shields.io/badge/day%20📅-23-blue) ![](https://img.shields.io/badge/stars%20⭐-4-yellow) ![](https://img.shields.io/badge/days%20completed-2-red) From 6327e45c0750e600abfce627450ce68c6ddceef6 Mon Sep 17 00:00:00 2001 From: amclin Date: Sun, 24 Dec 2023 06:11:23 +0000 Subject: [PATCH 27/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 643228e..90146ea 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-23-blue) +![](https://img.shields.io/badge/day%20📅-24-blue) ![](https://img.shields.io/badge/stars%20⭐-4-yellow) ![](https://img.shields.io/badge/days%20completed-2-red) From 63c458651332319da1ed58b0dc7803ba4f62d9d1 Mon Sep 17 00:00:00 2001 From: amclin Date: Mon, 25 Dec 2023 06:13:04 +0000 Subject: [PATCH 28/28] docs: Update badges [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 90146ea..ea926d8 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Status ### 2022 -![](https://img.shields.io/badge/day%20📅-24-blue) +![](https://img.shields.io/badge/day%20📅-25-blue) ![](https://img.shields.io/badge/stars%20⭐-4-yellow) ![](https://img.shields.io/badge/days%20completed-2-red)