jsadvent/solutions/2020/14.js

90 lines
2.4 KiB
JavaScript

const { Glib, BNMath: Math } = require('../../lib');
const v1 = (input, mask) =>
Math.parseInt(
Math.parseInt(input, 10)
.toString(2)
.padStart(36, '0')
.glib.map((bit, i) => (mask[i] === 'X' ? bit : mask[i])).string,
2,
);
const v2 = (input, mask) => {
const num = Math.parseInt(input, 10)
.toString(2)
.padStart(36, '0')
.glib.map((bit, i) => (mask[i] === '0' ? bit : mask[i])).string;
return num.glib
.map((char, i) =>
char === 'X'
? (str) => [
str.splice(Number(i), 1, '0'),
str.splice(Number(i), 1, '1'),
]
: char === '1'
? (str) => [str.splice(Number(i), 1, '1')]
: (str) => [str],
)
.reduce((glib, flatMapFn) => glib.flatMap(flatMapFn), [num].glib);
};
module.exports = {
1: (input) =>
Glib.fromLines(input)
.reduce(
(state, line) => {
const [identifier, value] = line.split(' = ');
const [lIdent, rIdent] = identifier.split('[');
switch (lIdent.split('[')[0]) {
case 'mask':
return { ...state, mask: value };
case 'mem':
return {
...state,
mem: new Map(
state.mem.glibEntries.concat([
[rIdent.slice(0, -1), v1(value, state.mask)],
]),
),
};
}
},
{
mem: new Map(),
mask: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
},
)
.mem.glibValues.sum(),
2: (input) =>
Glib.fromLines(input)
.reduce(
(state, line) => {
const [identifier, value] = line.split(' = ');
const [lIdent, rIdent] = identifier.split('[');
switch (lIdent.split('[')[0]) {
case 'mask':
return { ...state, mask: value };
case 'mem':
const num = BigInt(value);
return {
...state,
mem: new Map(
state.mem.glibEntries.concat(
v2(rIdent.slice(0, -1), state.mask).map((addr) => [
addr,
num,
]),
),
),
};
}
},
{
mem: new Map(),
mask: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
},
)
.mem.glibValues.sum(),
};