diff --git a/src/day6/typescript/main.test.ts b/src/day6/typescript/main.test.ts new file mode 100644 index 0000000..ef9113b --- /dev/null +++ b/src/day6/typescript/main.test.ts @@ -0,0 +1,28 @@ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +import {readFileSync} from 'node:fs'; +import {assertEquals} from 'https://deno.land/std@0.209.0/assert/mod.ts'; +import {partA, partB} from './main.ts'; // eslint-disable-line n/file-extension-in-import + +const day = 6; +const answerExample = 288; +const answerA = 449_550; +const answerB = 0; +const answerExampleB = 71_503; +const input: string[] = readFileSync(`src/day${day}/input.txt`, 'utf8').split('\n'); +const inputExample: string[] = readFileSync(`src/day${day}/input_example.txt`, 'utf8').split('\n'); + +Deno.test('Example', () => { + assertEquals(partA(inputExample), answerExample); +}); + +Deno.test('Part A', () => { + assertEquals(partA(input), answerA); +}); + +Deno.test('Example B', () => { + assertEquals(partB(inputExample), answerExampleB); +}); + +Deno.test('Part B', () => { + assertEquals(partB(input), answerB); +}); diff --git a/src/day6/typescript/main.ts b/src/day6/typescript/main.ts new file mode 100644 index 0000000..1a1fb57 --- /dev/null +++ b/src/day6/typescript/main.ts @@ -0,0 +1,79 @@ +/* eslint-disable @typescript-eslint/indent */ + +export const partA = (input: string[]) => { + const durationOfRace: number[] = []; + const recordOfRace: number[] = []; + const parsedInput = input.map(line => line.split(/\s+/).filter(x => x !== '')); + console.log(parsedInput); + const parsedInputNoFirstElement = parsedInput.map(line => line.slice(1)); + console.log(parsedInputNoFirstElement); + const parsedInputNoFirstElementNumbers = parsedInputNoFirstElement.map(line => line.map(x => Number.parseInt(x, 10))); + console.log(parsedInputNoFirstElementNumbers); + for (const element of parsedInputNoFirstElementNumbers[0]) { + durationOfRace.push(element); + } + + for (const element of parsedInputNoFirstElementNumbers[1]) { + recordOfRace.push(element); + } + + const winningOutcomeArray: number[] = []; + for (const [i, duration] of durationOfRace.entries()) { + const record = recordOfRace[i]; + let winningOutcomes = 0; + for (let j = 0; j < duration; j++) { + const speed = j; + const distanceTravelled = speed * (duration - j); + if (distanceTravelled > record) { + winningOutcomes++; + } + } + + winningOutcomeArray.push(winningOutcomes); + } + + const outcomesMultiplied = winningOutcomeArray.reduce((a, b) => a * b, 1); + return outcomesMultiplied; +}; + +export const partB = (input: string[]) => { + const durationOfRace: number[] = []; + const recordOfRace: number[] = []; + const parsedInput = input.map(line => line.split(/\s+/).filter(x => x !== '')); + console.log(parsedInput); + const parsedInputNoFirstElement = parsedInput.map(line => line.slice(1)); + console.log(parsedInputNoFirstElement); + const parsedInputNoFirstElementNumbers = parsedInputNoFirstElement.map(line => line.map(x => Number.parseInt(x, 10))); + console.log(parsedInputNoFirstElementNumbers); + let concatDuration = ''; + for (const element of parsedInputNoFirstElementNumbers[0]) { + concatDuration += element; + } + + durationOfRace.push(Number.parseInt(concatDuration, 10)); + + let concatRecord = ''; + for (const element of parsedInputNoFirstElementNumbers[1]) { + concatRecord += element; + } + + recordOfRace.push(Number.parseInt(concatRecord, 10)); + + const winningOutcomeArray: number[] = []; + for (const [i, duration] of durationOfRace.entries()) { + const record = recordOfRace[i]; + let winningOutcomes = 0; + for (let j = 0; j < duration; j++) { + const speed = j; + const distanceTravelled = speed * (duration - j); + if (distanceTravelled > record) { + winningOutcomes++; + } + } + + winningOutcomeArray.push(winningOutcomes); + } + + const outcomesMultiplied = winningOutcomeArray.reduce((a, b) => a * b, 1); + return outcomesMultiplied; +};