You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.8 KiB
JavaScript
72 lines
1.8 KiB
JavaScript
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;
|
|
}
|