Day Six complete

This commit is contained in:
Lewis Dale committed 2023-12-06 08:12:36 +00:00
1 parent 9806b225d1
commit 02e6f1b76c
5 files changed
+72 -3

No files matched your search

+21
View File
@@ -0,0 +1,21 @@
import {BoatRace, Race} from "./day_six";
describe('Day Six', () => {
const input = `Time: 7 15 30
Distance: 9 40 200`;
it.each([
[[7, 9], 4],
[[15, 40], 8],
[[30, 200], 9],
[[71530, 940200], 71503]
])('should calculate that race %s could be won %s different ways', (race, expected) => {
const boatRace = new BoatRace(input);
expect(boatRace.numberOfWinningMethods(race as Race)).toEqual(expected);
});
it('should calculate the total number of winning methods', () => {
const boatRace = new BoatRace(input);
expect(boatRace.totalNumberOfWaysToBeatRace()).toEqual(71503);
})
});
+43
View File
@@ -0,0 +1,43 @@
import {anyCharOf, spaces1, string, whitespace} from "parjs";
import {between, exactly, manySepBy, stringify, then} from "parjs/combinators";
import {Range} from "immutable";
import fs from "fs";
export type Race = [number, number];
const timeName = string('Time:').pipe(then(spaces1()));
const distanceName = string('Distance:').pipe(then(spaces1()));
const timeParser = anyCharOf("0123456789").pipe(manySepBy(whitespace().pipe(exactly(2))), stringify(), between(timeName, whitespace()));
const distanceParser = anyCharOf("0123456789").pipe(manySepBy(whitespace().pipe(exactly(2))), stringify(), between(distanceName, whitespace()));
const parser = timeParser.pipe(then(distanceParser));
export class BoatRace {
private readonly race: Race;
constructor(input: string) {
const [times, distances] = parser.parse(input).value;
this.race = [parseInt(times), parseInt(distances)];
}
numberOfWinningMethods = (race: Race): number => {
const [time, distance] = race;
const canWin = (holdingTime: number) => ((time - holdingTime) * holdingTime) > distance;
const range = Range(0, time).filter(canWin).cacheResult();
return range.size || 0;
}
public totalNumberOfWaysToBeatRace(): number {
return this.numberOfWinningMethods(this.race);
}
}
export const runDaySix = () => {
const input = fs.readFileSync('./inputs/day_six_input.txt', 'utf-8').trimEnd();
const races = new BoatRace(input);
console.log(races.totalNumberOfWaysToBeatRace());
}