Day 02

import Solution from "./solution.ts";

function isSafeTransition(
  p: number,
  c: number,
  d: "d" | "u" | "",
): { safe: boolean; dir: "d" | "u" | ""; p: number } {
  const dis = Math.abs(p - c);
  const dir: "d" | "u" = p > c ? "d" : "u";
  return {
    dir,
    safe: (d === "" || d === dir) && dis >= 1 && dis <= 3,
    p: c,
  };
}

function isSafe(arr: number[], dir = "", p = arr[0]) {
  return arr.slice(1).reduce(
    (p, c, i) => p.safe ? { ...isSafeTransition(p.p, c, p.dir), i: i + 1 } : p,
    { safe: true, dir: "", p: arr[0], i: 0 } as
      & ReturnType<typeof isSafeTransition>
      & {
        i: number;
      },
  );
}

const task = new Solution(
  (arr: number[][]) =>
    arr.reduce(
      (p, c) => p + (isSafe(c).safe ? 1 : 0),
      0,
    ),
  (arr: number[][]) => {
    return arr.reduce(
      (p, c) => {
        const safe = isSafe(c);
        if (safe.safe) {
          return p + 1;
        }
        if (
          isSafe(c.slice(0, safe.i - 2).concat(c.slice(safe.i - 1))).safe ||
          isSafe(c.slice(0, safe.i - 1).concat(c.slice(safe.i))).safe ||
          isSafe(c.slice(0, safe.i).concat(c.slice(safe.i + 1))).safe
        ) {
          return p + 1;
        }
        return p;
      },
      0,
    );
  },
  {
    sep: "\n",
    transform: (s) => s.split(" ").map((n) => Number.parseInt(n)),
  },
);
task.expect(2, 4);

export default task;

Last edited 04. April 2025 13:29