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(), };