function enumerate({ line, groups, size = 0, memo = new Map() }) {
const key = `${line.length} ${groups.length} ${size}`;
if (!memo.has(key)) {
const u = line[0];
line = line.slice(1);
memo.set(
key,
u
? (u === "#"
? null
: size === 0
? enumerate({ line, groups, size: 0, memo })
: size === groups[0]
? enumerate({ line, groups: groups.slice(1), size: 0, memo })
: null) +
(u === "."
? null
: size === 0
? enumerate({ line, groups, size: 1, memo })
: size === groups[0]
? null
: enumerate({ line, groups, size: size + 1, memo }))
:
(size === 0 && groups.length === 0) ||
(groups.length === 1 && size === groups[0])
);
}
return memo.get(key);
}