function findPaths2(caves) {
let paths = new Set();
const smallCaves = [...caves.keys()].filter(
(c) => isSmall(c) && c !== "start" && c !== "end"
);
const traverse = (cave, visited, path, special) => {
if (isSmall(cave)) {
if (cave !== special) {
visited.add(cave);
} else {
special = null;
}
}
path.push(cave);
if (cave === "end") {
return paths.add(path.join(","));
}
caves.get(cave).forEach((neighbour) => {
if (!visited.has(neighbour)) {
traverse(neighbour, new Set(visited), path.map(AOC.identity), special);
}
});
};
smallCaves.forEach((c) => traverse("start", new Set(), [], c));
return paths.size;
}