-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.ts
executable file
·49 lines (35 loc) · 1.46 KB
/
main.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env deno run --allow-read
import { assertEquals } from "https://deno.land/[email protected]/testing/asserts.ts";
import { minMax, range, sum } from "../../2020/utils.ts";
const parseInput = (string: string): number[] => {
return string.trim().split(",").map((s) => parseInt(s, 10));
};
const text = await Deno.readTextFile("input.txt");
export const input = parseInput(text);
type FuelConsumption = (distance: number) => number;
const assumedFuelConsumption: FuelConsumption = (distance) => distance;
const findMinimumFuelConsumption = (
input: number[],
fuelConsumption: FuelConsumption,
): number => {
const [from, to] = minMax(input);
const targets = range(to - from).map((i) => i + from);
const totalFuelConsumptions = (target: number) =>
sum(input.map((n) => fuelConsumption(Math.abs(n - target))));
return Math.min(...targets.map(totalFuelConsumptions));
};
const part1 = (input: number[]): number => {
return findMinimumFuelConsumption(input, assumedFuelConsumption);
};
const example = parseInput(`16,1,2,0,4,2,7,1,2,14`);
assertEquals(part1(example), 37);
console.log("Result part 1: " + part1(input));
export const actualFuelConsumption: FuelConsumption = (distance) => {
if (distance === 0) return 0;
return distance * (distance + 1) / 2;
};
const part2 = (input: number[]): number => {
return findMinimumFuelConsumption(input, actualFuelConsumption);
};
assertEquals(part2(example), 168);
console.log("Result part 2: " + part2(input));