diff --git a/src/2024/2024-12-06/main.ts b/src/2024/2024-12-06/main.ts index 7e9156d..bc1795d 100644 --- a/src/2024/2024-12-06/main.ts +++ b/src/2024/2024-12-06/main.ts @@ -1,4 +1,4 @@ -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' import { guardController } from './lib/guardController.js' @@ -6,7 +6,7 @@ import { findObstructionPositions } from './lib/guardControllerLoop.js' const input = readAOCInputFile({ filePath: file(import.meta.url, 'input.txt'), - type: AOC_OUTPUT_TYPE.STRING_ARRAY_2D + type: AOCOutputType.STRING_ARRAY_2D }) as string [][] /** diff --git a/src/2024/2024-12-06/sample.test.ts b/src/2024/2024-12-06/sample.test.ts index 30c1f2e..cc4c754 100644 --- a/src/2024/2024-12-06/sample.test.ts +++ b/src/2024/2024-12-06/sample.test.ts @@ -1,6 +1,6 @@ import { test, expect } from 'vitest' -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' import { guardController } from './lib/guardController.js' @@ -8,7 +8,7 @@ import { findObstructionPositions } from './lib/guardControllerLoop.js' const input = readAOCInputFile({ filePath: file(import.meta.url, 'input.txt'), - type: AOC_OUTPUT_TYPE.STRING_ARRAY_2D + type: AOCOutputType.STRING_ARRAY_2D }) as string [][] test('Count distinct guard positions', () => { diff --git a/src/2024/2024-12-07/main.ts b/src/2024/2024-12-07/main.ts index 99086bb..64f5f71 100644 --- a/src/2024/2024-12-07/main.ts +++ b/src/2024/2024-12-07/main.ts @@ -1,4 +1,4 @@ -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' import { totalCalibrationResult } from './lib/totalCalibration.js' @@ -7,7 +7,7 @@ import { totalCalibrationConcat } from './lib/totalCalibrationConcat.js' // Read and process the input file const input = (readAOCInputFile({ filePath: file(import.meta.url, 'input.txt'), - type: AOC_OUTPUT_TYPE.STRING + type: AOCOutputType.STRING }) as string) .split('\n') diff --git a/src/2024/2024-12-07/sample.test.ts b/src/2024/2024-12-07/sample.test.ts index 792eab9..4cea8af 100644 --- a/src/2024/2024-12-07/sample.test.ts +++ b/src/2024/2024-12-07/sample.test.ts @@ -1,6 +1,6 @@ import { test, expect } from 'vitest' -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' import { totalCalibrationResult } from './lib/totalCalibration.js' @@ -9,7 +9,7 @@ import { totalCalibrationConcat } from './lib/totalCalibrationConcat.js' // Read and process the input file const input = (readAOCInputFile({ filePath: file(import.meta.url, 'input.txt'), - type: AOC_OUTPUT_TYPE.STRING + type: AOCOutputType.STRING }) as string) .split('\n') diff --git a/src/2024/2024-12-08/main.ts b/src/2024/2024-12-08/main.ts index cfa25bf..7f251f4 100644 --- a/src/2024/2024-12-08/main.ts +++ b/src/2024/2024-12-08/main.ts @@ -1,4 +1,4 @@ -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' import { countAntinodes } from './lib/uniqueAntinodes.js' @@ -6,7 +6,7 @@ import { countAllAntinodes } from './lib/allAntinodes.js' const input = readAOCInputFile({ filePath: file(import.meta.url, 'input.txt'), - type: AOC_OUTPUT_TYPE.STRING_ARRAY_2D + type: AOCOutputType.STRING_ARRAY_2D }) as string[][] /** diff --git a/src/2024/2024-12-08/sample.test.ts b/src/2024/2024-12-08/sample.test.ts index df76851..d9a4177 100644 --- a/src/2024/2024-12-08/sample.test.ts +++ b/src/2024/2024-12-08/sample.test.ts @@ -1,6 +1,6 @@ import { test, expect } from 'vitest' -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' import { countAntinodes } from './lib/uniqueAntinodes.js' @@ -8,7 +8,7 @@ import { countAllAntinodes } from './lib/allAntinodes.js' const input = readAOCInputFile({ filePath: file(import.meta.url, 'input.txt'), - type: AOC_OUTPUT_TYPE.STRING_ARRAY_2D + type: AOCOutputType.STRING_ARRAY_2D }) as string[][] test('Antinodes in unique locations', () => { diff --git a/src/2024/2024-12-09/main.ts b/src/2024/2024-12-09/main.ts index 064e19f..d342839 100644 --- a/src/2024/2024-12-09/main.ts +++ b/src/2024/2024-12-09/main.ts @@ -1,4 +1,4 @@ -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' import { CompactDisk } from './lib/compact.js' @@ -6,7 +6,7 @@ import { WholeDisk } from './lib/whole.js' const input = readAOCInputFile({ filePath: file(import.meta.url, 'input.txt'), - type: AOC_OUTPUT_TYPE.STRING + type: AOCOutputType.STRING }) as string /** diff --git a/src/2024/2024-12-09/sample.test.ts b/src/2024/2024-12-09/sample.test.ts index ae1a330..795d3c6 100644 --- a/src/2024/2024-12-09/sample.test.ts +++ b/src/2024/2024-12-09/sample.test.ts @@ -1,6 +1,6 @@ import { test, expect } from 'vitest' -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' import { CompactDisk } from './lib/compact.js' @@ -8,7 +8,7 @@ import { WholeDisk } from './lib/whole.js' const input = readAOCInputFile({ filePath: file(import.meta.url, 'input.txt'), - type: AOC_OUTPUT_TYPE.STRING + type: AOCOutputType.STRING }) as string test('Defragmented disk checksum', () => { diff --git a/src/2024/2024-12-10/main.ts b/src/2024/2024-12-10/main.ts index 4ec9955..02587e2 100644 --- a/src/2024/2024-12-10/main.ts +++ b/src/2024/2024-12-10/main.ts @@ -1,12 +1,12 @@ -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' import { countTrailScores } from './lib/scoresRatings.js' const input = readAOCInputFile({ filePath: file(import.meta.url, 'input.txt'), - type: AOC_OUTPUT_TYPE.NUMBER_ARRAY_2D + type: AOCOutputType.NUMBER_ARRAY_2D }) as number[][] /** diff --git a/src/2024/2024-12-10/sample.test.ts b/src/2024/2024-12-10/sample.test.ts index bfbde18..9959b19 100644 --- a/src/2024/2024-12-10/sample.test.ts +++ b/src/2024/2024-12-10/sample.test.ts @@ -1,13 +1,13 @@ import { test, expect } from 'vitest' -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' import { countTrailScores } from './lib/scoresRatings.js' const input = readAOCInputFile({ filePath: file(import.meta.url, 'input.txt'), - type: AOC_OUTPUT_TYPE.NUMBER_ARRAY_2D + type: AOCOutputType.NUMBER_ARRAY_2D }) as number[][] test('Total trailhead score:', () => { diff --git a/src/2024/2024-12-11/input.ts b/src/2024/2024-12-11/input.ts new file mode 100644 index 0000000..b1be1a3 --- /dev/null +++ b/src/2024/2024-12-11/input.ts @@ -0,0 +1,5 @@ +// Quiz input random data. +// Replace the input value with other values for testing + +export const inputSample: string = '125 17' +export const inputQuiz: string = '2 34576 0 740884 60 103 1721 7405157' diff --git a/src/2024/2024-12-11/main.ts b/src/2024/2024-12-11/main.ts index 96bbc6d..97f5dad 100644 --- a/src/2024/2024-12-11/main.ts +++ b/src/2024/2024-12-11/main.ts @@ -1,17 +1,33 @@ import { Blinker } from './lib/blink.js' +import { inputSample, inputQuiz } from './input.js' /** - * Part 1/2 and 2/2 of the 2024-12-10 quiz - * Counts the number of visible stones after blinking + * Part 1/2 of the 2024-12-10 quiz + * Counts the number of visible stones after blinkingc 25x */ -const quiz20241211 = () => { +const quiz20241211_01 = () => { const numBlinks = 25 const blinker = new Blinker() - const stones = '125 17'.split(' ').map(Number) + const stones = inputSample.split(' ').map(Number) const count = blinker.blink(stones, numBlinks) console.log(`${count} stones available after ${numBlinks} blinks`) } -quiz20241211() +/** + * Part 2/2 and 2/2 of the 2024-12-10 quiz + * Counts the number of visible stones after blinking 75x + */ +const quiz20241211_02 = () => { + const numBlinks = 75 + const blinker = new Blinker() + + const stones = inputQuiz.split(' ').map(Number) + const count = blinker.blink(stones, numBlinks) + + console.log(`${count} stones available after ${numBlinks} blinks`) +} + +quiz20241211_01() +quiz20241211_02() diff --git a/src/2024/2024-12-11/sample.test.ts b/src/2024/2024-12-11/sample.test.ts index c2bfb33..a51022f 100644 --- a/src/2024/2024-12-11/sample.test.ts +++ b/src/2024/2024-12-11/sample.test.ts @@ -1,9 +1,17 @@ import { test, expect } from 'vitest' import { Blinker } from './lib/blink.js' +import { inputSample, inputQuiz } from './input.js' -test('Number of stones after blinking:', () => { - const stones = '125 17'.split(' ').map(Number) +test('Number of stones after blinking 25x:', () => { + const stones = inputSample.split(' ').map(Number) const blinker = new Blinker() expect(blinker.blink(stones, 25)).toBe(55312) }) + +test('Number of stones after blinking 75x:', () => { + const stones = inputQuiz.split(' ').map(Number) + const blinker = new Blinker() + + expect(blinker.blink(stones, 75)).toBe(246353780086424) +}) diff --git a/src/2024/2024-12-12/main.ts b/src/2024/2024-12-12/main.ts index a986d6f..a89a5ed 100644 --- a/src/2024/2024-12-12/main.ts +++ b/src/2024/2024-12-12/main.ts @@ -1,4 +1,4 @@ -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' import { Garden } from './lib/garden.js' @@ -6,7 +6,7 @@ import { WholesaleGarden } from './lib/wholesale.js' const input = readAOCInputFile({ filePath: file(import.meta.url, 'input.txt'), - type: AOC_OUTPUT_TYPE.STRING_ARRAY_2D + type: AOCOutputType.STRING_ARRAY_2D }) as string[][] /** diff --git a/src/2024/2024-12-12/sample.test.ts b/src/2024/2024-12-12/sample.test.ts index d04423a..b76f366 100644 --- a/src/2024/2024-12-12/sample.test.ts +++ b/src/2024/2024-12-12/sample.test.ts @@ -1,5 +1,5 @@ import { test, expect } from 'vitest' -import { AOC_OUTPUT_TYPE, readAOCInputFileAsync } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFileAsync } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' import { Garden } from './lib/garden.js' @@ -19,7 +19,7 @@ const files: Promise[] = [] for (let i = 0; i < inputFiles.length; i += 1) { files.push(readAOCInputFileAsync({ filePath: file(import.meta.url, inputFiles[i] as string), - type: AOC_OUTPUT_TYPE.STRING_ARRAY_2D + type: AOCOutputType.STRING_ARRAY_2D })) } diff --git a/src/2024/2024-12-13/lib/fileReader.ts b/src/2024/2024-12-13/lib/fileReader.ts index 337e362..b4ce996 100644 --- a/src/2024/2024-12-13/lib/fileReader.ts +++ b/src/2024/2024-12-13/lib/fileReader.ts @@ -1,6 +1,6 @@ import type { MatrixData } from './types.js' -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' /** @@ -11,7 +11,7 @@ import { file } from '@/aoc/file/utils.js' export const fileReader = (fileName: string): MatrixData => { const input = readAOCInputFile({ filePath: file(import.meta.url, fileName), - type: AOC_OUTPUT_TYPE.STRING + type: AOCOutputType.STRING }) as string return input diff --git a/src/2024/2024-12-14/input_sample.txt b/src/2024/2024-12-14/input1.txt similarity index 100% rename from src/2024/2024-12-14/input_sample.txt rename to src/2024/2024-12-14/input1.txt diff --git a/src/2024/2024-12-14/lib/fileReader.ts b/src/2024/2024-12-14/lib/fileReader.ts index e02b89a..7ebe4ce 100644 --- a/src/2024/2024-12-14/lib/fileReader.ts +++ b/src/2024/2024-12-14/lib/fileReader.ts @@ -1,6 +1,6 @@ import type { RobotProperty } from './types.js' -import { AOC_OUTPUT_TYPE, readAOCInputFile } from '@/aoc/file/aocfile.js' +import { AOCOutputType, readAOCInputFile } from '@/aoc/file/aocfile.js' import { file } from '@/aoc/file/utils.js' /** @@ -11,7 +11,7 @@ import { file } from '@/aoc/file/utils.js' export const fileReader = (fileName: string): RobotProperty[] => { const input = readAOCInputFile({ filePath: file(import.meta.url, fileName), - type: AOC_OUTPUT_TYPE.STRING + type: AOCOutputType.STRING }) as string return input diff --git a/src/2024/2024-12-14/main.ts b/src/2024/2024-12-14/main.ts index 7e87a38..134957f 100644 --- a/src/2024/2024-12-14/main.ts +++ b/src/2024/2024-12-14/main.ts @@ -2,23 +2,20 @@ import { fileReader } from './lib/fileReader.js' import { calculateSafetyFactor } from './lib/safetyFactor.js' import { findEasterEgg } from './lib/findEasterEgg.js' -const dataSample = fileReader('../input_sample.txt') -const dataQuiz = fileReader('../input.txt') - -// Grid dimensions for the sample input -const gridSample = { length: 7, width: 11 } - -// Grid dimensions for the randomized quiz input -const gridQuiz = { length: 103, width: 101 } - /** * Part 1/2 of the 2024-12-14 quiz * Counts the safety factor from robots after N seconds */ const quiz20241214_01 = () => { + // Grid dimensions for the randomized quiz input + const gridSettings = { length: 7, width: 11 } + + // Sample data. Replace with AoC quiz data. + const dataInput = fileReader('../input1.txt') + const safetyFactor = calculateSafetyFactor({ - data: dataSample, - gridMeta: gridSample, + data: dataInput, + gridMeta: gridSettings, seconds: 100, log: true }) @@ -31,9 +28,15 @@ const quiz20241214_01 = () => { * Counts the no. of seconds before robots display the easter egg */ const quiz20241214_02 = () => { + // Grid dimensions for the randomized quiz input + const gridSettings = { length: 103, width: 101 } + + // Random AoC auiz data + const dataInput = fileReader('../input.txt') + const seconds = findEasterEgg({ - data: dataQuiz, - gridMeta: gridQuiz, + data: dataInput, + gridMeta: gridSettings, seconds: 10000 // Uncomment to print the xmas tree // log: true diff --git a/src/2024/2024-12-14/sample.test.ts b/src/2024/2024-12-14/sample.test.ts index 959ecea..5173417 100644 --- a/src/2024/2024-12-14/sample.test.ts +++ b/src/2024/2024-12-14/sample.test.ts @@ -4,19 +4,16 @@ import { fileReader } from './lib/fileReader.js' import { calculateSafetyFactor } from './lib/safetyFactor.js' import { findEasterEgg } from './lib/findEasterEgg.js' -const dataSample = fileReader('../input_sample.txt') -const dataQuiz = fileReader('../input.txt') - -// Grid dimensions for the sample input -const gridSample = { length: 7, width: 11 } +test('Safety factor:', () => { + // Grid dimensions for the randomized quiz input + const gridSettings = { length: 7, width: 11 } -// Grid dimensions for the randomized quiz input -const gridQuiz = { length: 103, width: 101 } + // Sample data. Replace with AoC quiz data. + const dataInput = fileReader('../input1.txt') -test('Safety factor:', () => { const safetyFactor = calculateSafetyFactor({ - data: dataSample, - gridMeta: gridSample, + data: dataInput, + gridMeta: gridSettings, seconds: 100 }) @@ -24,9 +21,15 @@ test('Safety factor:', () => { }) test('Easter egg iteration no. (seconds):', () => { + // Grid dimensions for the randomized quiz input + const gridSettings = { length: 103, width: 101 } + + // Random AoC auiz data + const dataInput = fileReader('../input.txt') + const seconds = findEasterEgg({ - data: dataQuiz, - gridMeta: gridQuiz, + data: dataInput, + gridMeta: gridSettings, seconds: 10000 }) diff --git a/src/aoc/file/aocfile.ts b/src/aoc/file/aocfile.ts index 2917931..ea7e4b5 100644 --- a/src/aoc/file/aocfile.ts +++ b/src/aoc/file/aocfile.ts @@ -9,7 +9,7 @@ import { readFile } from './utils.js' * - `NUMBER_ARRAY` - Array of numbers: `number[]` * - `NUMBER_ARRAY_2D` - 2D array of numbers: `number[][]` */ -export enum AOC_OUTPUT_TYPE { +export enum AOCOutputType { STRING = 'string', STRING_ARRAY = 'string_array', STRING_ARRAY_2D = '2d_string_array', @@ -20,12 +20,12 @@ export enum AOC_OUTPUT_TYPE { /** * Input parameters indicating details about the AoC quiz input file. * @param {string} filePath - Full file path to an AoC input text file. - * @param {AOC_OUTPUT_TYPE} type - Type to convert the input text file. One of `AOC_OUTPUT_TYPE`. + * @param {AOCOutputType} type - Type to convert the input text file. One of `AOCOutputType`. * @param {delimiter} delimiter - String delimiter to `split()` between characters in the original text file. Defaults to none. */ type AOCFileInput = { filePath: string; - type: AOC_OUTPUT_TYPE; + type: AOCOutputType; delimiter?: string; } @@ -51,23 +51,23 @@ export const readAOCInputFile = (param: AOCFileInput): AOCFileOutput => { } switch(param.type) { - case AOC_OUTPUT_TYPE.STRING: + case AOCOutputType.STRING: return file as string - case AOC_OUTPUT_TYPE.STRING_ARRAY: + case AOCOutputType.STRING_ARRAY: return file.split(delimiter) as string[] || [] - case AOC_OUTPUT_TYPE.STRING_ARRAY_2D: + case AOCOutputType.STRING_ARRAY_2D: return file .split('\n') .map(row => row.split(delimiter)) as string[][] || [] - case AOC_OUTPUT_TYPE.NUMBER_ARRAY: + case AOCOutputType.NUMBER_ARRAY: return file .split(delimiter) .map(Number) as number[] || [] - case AOC_OUTPUT_TYPE.NUMBER_ARRAY_2D: + case AOCOutputType.NUMBER_ARRAY_2D: return file .split('\n') .map(row => row.split(delimiter).map(Number)) as number[][] || []