Compare commits

..

2 commits

Author SHA1 Message Date
tristan 71e6dcd7dc 2024 day 12 part 2 in js 2024-12-12 23:45:30 +00:00
tristan 161b2a7e6f 2024 day 12 part 1 in js 2024-12-12 22:17:41 +00:00
8 changed files with 148 additions and 5 deletions

View file

@ -3,6 +3,8 @@
inherit (lib.strings) toIntBase10; inherit (lib.strings) toIntBase10;
in input: rec { in input: rec {
sum = foldl' add 0;
blinkStone = stone: count: blinkStone = stone: count:
if toIntBase10 stone == 0 then [{ "1" = count; }] if toIntBase10 stone == 0 then [{ "1" = count; }]
else let else let
@ -21,19 +23,17 @@ in input: rec {
; ;
bfast = stones: stones bfast = stones: stones
|> (builtins.mapAttrs (stone: blinkStone stone)) |> builtins.mapAttrs blinkStone
|> attrValues |> attrValues
|> concatLists |> concatLists
|> addStones |> builtins.zipAttrsWith (stone: sum)
; ;
bfastt = times: stones: bfastt = times: stones:
if times == 0 then stones |> attrValues |> foldl' add 0 if times == 0 then stones |> attrValues |> sum
else bfastt (times - 1) (bfast stones) else bfastt (times - 1) (bfast stones)
; ;
addStones = builtins.zipAttrsWith (stone: foldl' add 0);
initialStones = input initialStones = input
|> lib.trim |> lib.trim
|> lib.splitString " " |> lib.splitString " "

4
2024/12/example.txt Normal file
View file

@ -0,0 +1,4 @@
AAAA
BBCD
BBCC
EEEC

5
2024/12/example2.txt Normal file
View file

@ -0,0 +1,5 @@
OOOOO
OXOXO
OOOOO
OXOXO
OOOOO

10
2024/12/example3.txt Normal file
View file

@ -0,0 +1,10 @@
RRRRIICCFF
RRRRIICCCF
VVRRRCCFFF
VVRCCCJFFF
VVVVCJJCFE
VVIVCCJJEE
VVIIICJJEE
MIIIIIJJEE
MIIISIJEEE
MMMISSJEEE

5
2024/12/example4.txt Normal file
View file

@ -0,0 +1,5 @@
EEEEE
EXXXX
EEEEE
EXXXX
EEEEE

6
2024/12/example5.txt Normal file
View file

@ -0,0 +1,6 @@
AAAAAA
AAABBA
AAABBA
ABBAAA
ABBAAA
AAAAAA

50
2024/12/solution.js Normal file
View file

@ -0,0 +1,50 @@
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)

63
2024/12/solution2.js Normal file
View file

@ -0,0 +1,63 @@
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)