Finally do Day Five
This commit is contained in:
parent
835e507816
commit
14efab3450
42
src/day_five.test.ts
Normal file
42
src/day_five.test.ts
Normal file
@ -0,0 +1,42 @@
|
||||
import {mapSeedToLocation} from "./day_five";
|
||||
|
||||
describe('Day Five', () => {
|
||||
const input = `seeds: 79 14 55 13
|
||||
|
||||
seed-to-soil map:
|
||||
50 98 2
|
||||
52 50 48
|
||||
|
||||
soil-to-fertilizer map:
|
||||
0 15 37
|
||||
37 52 2
|
||||
39 0 15
|
||||
|
||||
fertilizer-to-water map:
|
||||
49 53 8
|
||||
0 11 42
|
||||
42 0 7
|
||||
57 7 4
|
||||
|
||||
water-to-light map:
|
||||
88 18 7
|
||||
18 25 70
|
||||
|
||||
light-to-temperature map:
|
||||
45 77 23
|
||||
81 45 19
|
||||
68 64 13
|
||||
|
||||
temperature-to-humidity map:
|
||||
0 69 1
|
||||
1 0 69
|
||||
|
||||
humidity-to-location map:
|
||||
60 56 37
|
||||
56 93 4`;
|
||||
|
||||
it('should calculate the smallest location from the input', () => {
|
||||
const result = mapSeedToLocation(input);
|
||||
expect(result).toEqual(46);
|
||||
});
|
||||
});
|
61
src/day_five.ts
Normal file
61
src/day_five.ts
Normal file
@ -0,0 +1,61 @@
|
||||
import {Range, Seq} from "immutable";
|
||||
import {chunk} from "lodash";
|
||||
import fs from "fs";
|
||||
|
||||
type MapRange = {
|
||||
source: number;
|
||||
destination: number;
|
||||
size: number;
|
||||
}
|
||||
|
||||
const parseSeeds = (input: string): Seq.Indexed<number> => {
|
||||
const [_, seedString] = input.split('seeds: ');
|
||||
|
||||
return chunk(seedString.split(' '), 2).reduce((seeds, [start, size]) => {
|
||||
return seeds.concat(Range(Number(start), Number(start) + Number(size)));
|
||||
}, Seq.Indexed<number>());
|
||||
}
|
||||
|
||||
const mapMapper = (input: string): MapRange[] => {
|
||||
const [_, ...lines] = input.split('\n');
|
||||
|
||||
return lines.map(line => {
|
||||
const [dest, source, size] = line.split(' ').map(Number);
|
||||
return {
|
||||
source: source,
|
||||
destination: dest,
|
||||
size
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const seedMapper = (seed: number, map: MapRange[]): number => {
|
||||
const mapped = map.find(({source, destination, size}) => {
|
||||
return seed >= source && seed < source + size;
|
||||
});
|
||||
|
||||
if (!mapped) {
|
||||
return seed;
|
||||
}
|
||||
|
||||
return seed - mapped.source + mapped.destination;
|
||||
}
|
||||
|
||||
export const mapSeedToLocation = (input: string): number => {
|
||||
const [seedsStr, ...mapStrings] = input.split('\n\n');
|
||||
const seeds = parseSeeds(seedsStr);
|
||||
|
||||
const maps = mapStrings.map(mapMapper);
|
||||
|
||||
const mapped = seeds.map(seed => {
|
||||
return maps.reduce((seed, map) => seedMapper(seed, map), seed);
|
||||
});
|
||||
|
||||
return mapped.min()!;
|
||||
}
|
||||
|
||||
export const runDayFive = () => {
|
||||
const input = fs.readFileSync('./inputs/day_five_input.txt', 'utf8').trimEnd();
|
||||
const result = mapSeedToLocation(input);
|
||||
console.log(`Day Five: ${result}`);
|
||||
}
|
Loading…
Reference in New Issue
Block a user