Advent of Code 2023-08

 avatar
radulle
javascript
a year ago
1.2 kB
153
Indexable
function solve(input) {
  return [process0(...parse(input)), process1(...parse(input))];
}

function parse(input) {
  let [instr, _map] = input.split("\n\n");
  instr = instr.split("");
  _map = _map.split("\n").map((e) => e.split(" = "));
  const map = {};
  for (let i = 0; i < _map.length; i++)
    map[_map[i][0]] = _map[i][1].replace(/[\(\)]/g, "").split(", ");
  return [instr, map];
}

function process0(instr, map) {
  let step = 0;
  let pos = "AAA";
  while (pos !== "ZZZ")
    (pos = map[pos][instr[step % instr.length] === "L" ? 0 : 1]), step++;
  return step;
}

function process1(instr, map) {
  let step = 0;
  let pos = [...Object.keys(map)].filter((e) => e[2] === "A");
  while (pos.some((e) => typeof e !== "number")) {
    for (let i = 0; i < pos.length; i++) {
      if (pos[i][2] === "Z") pos[i] = step;
      if (typeof pos[i] === "number") continue;
      pos[i] = map[pos[i]][instr[step % instr.length] === "L" ? 0 : 1];
    }
    step++;
  }
  return pos.reduce((acc, cur) => lcm(acc, cur), 1);
}

function lcm(a, b) {
  return (a / gcd(a, b)) * b;
}

function gcd(a, b) {
  var t = 0;
  a < b && ((t = b), (b = a), (a = t));
  t = a % b;
  return t ? gcd(b, t) : b;
}
Editor is loading...
Leave a Comment