day01.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { reduce, tail, zip, map } from "fp-ts/lib/Array";
  2. import { pipe } from "fp-ts/lib/function";
  3. import { MonoidSum, Ord } from "fp-ts/lib/number";
  4. import { getOrElse, chain } from "fp-ts/lib/Option";
  5. import { lt } from "fp-ts/lib/Ord";
  6. import { concatAll } from "fp-ts/lib/Monoid";
  7. import { depthMeasurements } from "./input1";
  8. const increaseCount = (as: number[]): number => pipe(
  9. zip(
  10. as,
  11. pipe(as, tail, getOrElse<number[]>(() => []))
  12. ),
  13. map(([a, b]) => lt(Ord)(a, b)),
  14. reduce(0, (acc, n) => n ? acc + 1 : acc)
  15. );
  16. const increases = pipe(
  17. depthMeasurements,
  18. increaseCount
  19. );
  20. console.log("number of times a depth measurement increases", increases);
  21. const slidingWindows = (as: number[]): [number, number, number][] => pipe(
  22. zip(
  23. zip(
  24. as,
  25. pipe(as, tail, getOrElse<number[]>(() => []))
  26. ),
  27. pipe(as, tail, chain(tail), getOrElse<number[]>(() => [])),
  28. ),
  29. map(([[a, b], c]) => [a, b, c])
  30. );
  31. const slidingWindowSumsIncreases = pipe(
  32. depthMeasurements,
  33. slidingWindows,
  34. map(concatAll(MonoidSum)),
  35. increaseCount
  36. );
  37. console.log("number of times a 3 length sliding window measurement sum increases", slidingWindowSumsIncreases);