You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

47 lines
1.1 KiB
JavaScript

4 years ago
const fs = require("fs");
const input = fs.readFileSync("input", "utf-8").trim().split("\n");
function main() {
// original mask string
let mask = null;
const memory = [];
for (const line of input) {
if (line.startsWith("mask")) {
mask = line.slice(7);
} else {
const address = parseInt(line.slice(4));
const num = BigInt(parseInt(line.split(" = ")[1]));
memory[address] = apply(num, mask);
// debug(num, mask);
}
}
const sum = memory.reduce((a, b) => a + b, 0n);
console.log("Solution:");
console.log(sum.toString());
}
function debug(value, mask) {
const result = apply(value, mask);
console.log("=".repeat(18), " DEBUG ", "=".repeat(18));
console.log(`value: ${numToBin(value)} (decimal ${value})`);
console.log(`mask: ${mask}`);
console.log(`result: ${numToBin(result)} (decimal ${result})`);
}
function numToBin(num) {
return num.toString(2).padStart(36, "0");
}
function binToNum(bin) {
return BigInt(parseInt(bin, 2));
}
function apply(num, mask) {
num = num & binToNum(mask.replaceAll("X", 1));
num = num | binToNum(mask.replaceAll("X", 0));
return num;
}
main();