diff --git a/2024/11/solution.nix b/2024/11/solution.nix index 4411e38..ccc3769 100644 --- a/2024/11/solution.nix +++ b/2024/11/solution.nix @@ -3,8 +3,6 @@ inherit (lib.strings) toIntBase10; in input: rec { - sum = foldl' add 0; - blinkStone = stone: count: if toIntBase10 stone == 0 then [{ "1" = count; }] else let @@ -23,17 +21,19 @@ in input: rec { ; bfast = stones: stones - |> builtins.mapAttrs blinkStone + |> (builtins.mapAttrs (stone: blinkStone stone)) |> attrValues |> concatLists - |> builtins.zipAttrsWith (stone: sum) + |> addStones ; bfastt = times: stones: - if times == 0 then stones |> attrValues |> sum + if times == 0 then stones |> attrValues |> foldl' add 0 else bfastt (times - 1) (bfast stones) ; + addStones = builtins.zipAttrsWith (stone: foldl' add 0); + initialStones = input |> lib.trim |> lib.splitString " " diff --git a/2024/12/example.txt b/2024/12/example.txt deleted file mode 100644 index b41163a..0000000 --- a/2024/12/example.txt +++ /dev/null @@ -1,4 +0,0 @@ -AAAA -BBCD -BBCC -EEEC diff --git a/2024/12/example2.txt b/2024/12/example2.txt deleted file mode 100644 index 50a7304..0000000 --- a/2024/12/example2.txt +++ /dev/null @@ -1,5 +0,0 @@ -OOOOO -OXOXO -OOOOO -OXOXO -OOOOO diff --git a/2024/12/example3.txt b/2024/12/example3.txt deleted file mode 100644 index 85b768f..0000000 --- a/2024/12/example3.txt +++ /dev/null @@ -1,10 +0,0 @@ -RRRRIICCFF -RRRRIICCCF -VVRRRCCFFF -VVRCCCJFFF -VVVVCJJCFE -VVIVCCJJEE -VVIIICJJEE -MIIIIIJJEE -MIIISIJEEE -MMMISSJEEE diff --git a/2024/12/example4.txt b/2024/12/example4.txt deleted file mode 100644 index 5818d30..0000000 --- a/2024/12/example4.txt +++ /dev/null @@ -1,5 +0,0 @@ -EEEEE -EXXXX -EEEEE -EXXXX -EEEEE diff --git a/2024/12/example5.txt b/2024/12/example5.txt deleted file mode 100644 index f7cd38f..0000000 --- a/2024/12/example5.txt +++ /dev/null @@ -1,6 +0,0 @@ -AAAAAA -AAABBA -AAABBA -ABBAAA -ABBAAA -AAAAAA diff --git a/2024/12/solution.js b/2024/12/solution.js deleted file mode 100644 index 72e34a2..0000000 --- a/2024/12/solution.js +++ /dev/null @@ -1,50 +0,0 @@ - -const input = (await Bun.file(Bun.argv[2]).text()).trim() - -let map = input.split("\n") - -const dirs = [[-1,0], [1,0], [0, -1], [0, 1]]; -const height = map.length; -const width = height; - -const key = (x,y) => x + y*width; -const visited = new Set(); - -function search(x,y) { - if (visited.has(key(x,y))) { - return {area: 0, perimeter: 0} - } - visited.add(key(x,y)) - const letter = map[y][x] - let perimeter = 0 - let area = 1 - for (const [dx, dy] of dirs) { - const nletter = map[y + dy]?.[x + dx]; - if (letter !== nletter) { - perimeter += 1 - continue - } - const n = search(x + dx, y + dy) - area += n.area - perimeter += n.perimeter - } - - return {area, perimeter} -} - -const regions = []; - -for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - if (visited.has(key(x,y))) continue - regions.push(search(x,y)) - } -} - -let cost = 0 -for (const {area, perimeter} of regions) { - cost += area * perimeter -} -console.log(cost) - - diff --git a/2024/12/solution2.js b/2024/12/solution2.js deleted file mode 100644 index 65d71f7..0000000 --- a/2024/12/solution2.js +++ /dev/null @@ -1,63 +0,0 @@ - -const input = (await Bun.file(Bun.argv[2]).text()).trim() - -let map = input.split("\n") - -const dirs = [[-1,0], [0,-1], [1,0], [0, 1]]; -const height = map.length; -const width = height; - -const key = (x,y) => x + y*width; -const vkey = (x,y) => y + x*height; -const visited = new Set(); - -function search(x,y) { - if (visited.has(key(x,y))) { - return {area: 0, hsides: new Set()} - } - visited.add(key(x,y)) - const letter = map[y][x] - let area = 1 - let hsides = new Set() - for (const [dx, dy] of dirs) { - const nletter = map[y + dy]?.[x + dx]; - if (letter !== nletter) { - if (dx === 0) { - hsides.add({y: y+dy/2, key: key(x,y)}) - } - continue - } - const n = search(x + dx, y + dy) - area += n.area - hsides = hsides.union(n.hsides) - } - - return {area, hsides} -} - -const regions = []; - -for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - if (visited.has(key(x,y))) continue - regions.push(search(x,y)) - } -} - - -let cost = 0; -for (const {area, hsides} of regions) { - // hacky filter of all perimeter nodes to extract adjacent - const horizontal = Array.from(hsides) - .sort((a, b) => a.key - b.key) - .sort((a, b) => a.y - b.y) - .filter(({y, key}, i, a) => a[i-1]?.key + 1 !== key || a[i-1]?.y !== y) - .length - - // there's always an equal amount of horizontal and vertical sides - cost += area * (horizontal * 2) -} - -console.log(cost) - -