90 lines
2.4 KiB
JavaScript
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(),
|
||
|
};
|