Skip to content

Commit

Permalink
feat: add day 17 part 1
Browse files Browse the repository at this point in the history
  • Loading branch information
dsluijk committed Dec 17, 2024
1 parent e7403d4 commit dc586ed
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 0 deletions.
5 changes: 5 additions & 0 deletions inputs/17.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Register A: 59397658
Register B: 0
Register C: 0

Program: 2,4,1,1,7,5,4,6,1,4,0,3,5,5,3,0
13 changes: 13 additions & 0 deletions solvers/17/1.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { expect, test } from "bun:test";

import { solve } from "./1";

test("example", () => {
const example = `Register A: 729
Register B: 0
Register C: 0
Program: 0,1,5,4,3,0`;

expect(solve(example)).toBe("4,6,3,5,6,3,5,2,1,0");
});
69 changes: 69 additions & 0 deletions solvers/17/1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
const getCombo = (opperant: number, registers: [number, number, number]) => {
if (opperant <= 3) return opperant;
if (opperant >= 7) throw new Error("Invalid compo opperant.");

return registers[opperant - 4];
};

export const solve = (input: string) => {
const lines = input.split("\n");
const regA = Number(lines[0].split(": ")[1]);
const regB = Number(lines[1].split(": ")[1]);
const regC = Number(lines[2].split(": ")[1]);
const registers = [regA, regB, regC] as [number, number, number];
const program = lines[4]
.split(": ")[1]
.split(",")
.map((num) => Number(num));

let pc = 0;
let outputs: number[] = [];

while (true) {
if (program[pc] === undefined) return outputs.join(",");

switch (program[pc]) {
case 0:
registers[0] = Math.floor(
registers[0] / Math.pow(2, getCombo(program[pc + 1], registers))
);
pc += 2;
break;
case 1:
registers[1] = registers[1] ^ program[pc + 1];
pc += 2;
break;
case 2:
registers[1] = getCombo(program[pc + 1], registers) % 8;
pc += 2;
break;
case 3:
if (registers[0] === 0) {
pc += 2;
break;
}
pc = program[pc + 1];
break;
case 4:
registers[1] = registers[1] ^ registers[2];
pc += 2;
break;
case 5:
outputs.push(getCombo(program[pc + 1], registers) % 8);
pc += 2;
break;
case 6:
registers[1] =
registers[0] / Math.pow(2, getCombo(program[pc + 1], registers));
pc += 2;
break;
case 7:
registers[2] =
registers[0] / Math.pow(2, getCombo(program[pc + 1], registers));
pc += 2;
break;
default:
throw new Error("Invalid opcode.");
}
}
};

0 comments on commit dc586ed

Please sign in to comment.