function arrangements(r, state, memo = {}) {
const hash = `${state.pos},${state.grp},${state.len}`;
if (memo[hash] !== undefined) {
return memo[hash];
}
if (state.pos === r.springs.length) {
if (state.len !== 0 && state.len !== r.lengths[state.grp]) {
return 0;
}
return state.grp + (state.len === r.lengths[state.grp] ? 1 : 0) ===
r.lengths.length
? 1
: 0;
}
let n = 0;
const { springs, lengths } = r;
const chr = springs[state.pos];
if (
chr !== "." &&
state.grp < lengths.length &&
state.len < lengths[state.grp]
) {
n += arrangements(
r,
{ pos: state.pos + 1, grp: state.grp, len: state.len + 1 },
memo
);
}
if (chr !== "#" && (state.len === lengths[state.grp] || state.len === 0)) {
n += arrangements(
r,
{
pos: state.pos + 1,
grp: state.grp + (state.len === lengths[state.grp] ? 1 : 0),
len: 0
},
memo
);
}
memo[hash] = n;
return n;
}