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