const fs = require("node:fs"); let data; try { data = fs.readFileSync("test.txt", "utf8"); } catch (err) { return } const lines = data.trim().split("\n"); var part1 = 0; var part2 = 0; lines.forEach((l) => { const parts = l.split(" "); const map = parts[0]; const damaged = parts[1].split(",").map(Number); // const all = allArrangements(map) // const valid = all.filter((m) => isValid(m, damaged)); // part1 += valid.length; const map2 = [map, map, map, map, map].join("?"); const damaged2 = [damaged, damaged, damaged, damaged, damaged].flat(); // console.log(damaged2); const all2 = allValidArrangements(map2, damaged2); console.log("all2", all2); part2 += all2.length; }); // console.log("part1", part1); console.log("part2", part1); function allValidArrangements(map, damaged, index = 0) { const i = map.substring(index).indexOf("?"); if (i === -1) { return map; } const one = allValidArrangements(replaceAt(map, i + index, "#"), damaged, index + 1); const two = allValidArrangements(replaceAt(map, i + index, "."), damaged, index + 1); return [one, two].flat(); } function allArrangements(map, index = 0) { const i = map.substring(index).indexOf("?"); if (i === -1) { return map; } const one = allArrangements(replaceAt(map, i + index, "#"), index + 1); const two = allArrangements(replaceAt(map, i + index, "."), index + 1); return [one, two].flat(); } function replaceAt(str, index, replacement) { return str.substring(0, index) + replacement + str.substring(index + replacement.length); } function isValid(map, damaged) { const trimmed = map.replace(/^\.+/, "").replace(/\.+$/, ""); const parts = trimmed.split(/\.+/); let isValid = parts.length === damaged.length; damaged.forEach((d, i) => { if (!parts[i] || parts[i].length !== d) { isValid = false; } }); return isValid; }