aboutsummaryrefslogtreecommitdiffstats
path: root/day1/index.ts
blob: e93a688352f0f46bf27966fd694eef3449726620 (plain)
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
import { of } from "rxjs";
import { concatAll, filter, map } from 'rxjs/operators';
import { ExerciseModuleFunc } from "../types";

type Pair<T, K> = [T, K];
type Triple<A, B, C> = [A, B, C];

const allTriples = <T extends unknown>(lst: T[]): Triple<T, T, T>[] => {
  const results: Triple<T, T, T>[] = [];
  lst.forEach((a, ai) => {
    lst.slice(ai + 1).forEach((b, bi) => {
      lst.slice(bi + 1).forEach((c, _ci) => {
        results.push([a, b, c]);
      })
    })
  });
  return results;
}

const day1: ExerciseModuleFunc = async (input: string) => {
  const numbers = input.split("\n").map(line => Number(line));
  const obs1 = of(...numbers).pipe(
    map((number, index) => [number, numbers.slice(index + 1)] as Pair<number, number[]>),
    map(pair => [pair[0], pair[1].find(elem => pair[0] + elem === 2020)] as Pair<number, number | undefined>),
    filter(pair => pair[1] !== undefined),
    map(pair => pair[0] * pair[1]),
    map(solution => solution.toString())
  )

  const first = await obs1.toPromise();

  const obs2 = of(numbers).pipe(
    map(allTriples),
    concatAll(),
    filter(t => t[0] + t[1] + t[2] === 2020),
    map(t => t[0] * t[1] * t[2]),
    map(sol => sol.toString())
  );

  const second = await obs2.toPromise();

  return [first, second];
}

export default day1;