Skip to content

Commit ca67225

Browse files
committed
Solution for 2024, day 12
1 parent 76bccbf commit ca67225

File tree

4 files changed

+136
-0
lines changed

4 files changed

+136
-0
lines changed

2024/12/Makefile

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
input:
2+
http "https://adventofcode.com/2024/day/12/input" "Cookie:session=${AOC_SESSION};" >input
3+
4+
main1:
5+
go build -o main1 main1.go common.go
6+
7+
main2:
8+
go build -o main2 main2.go common.go
9+
10+
.PHONY: run1 run2 clean
11+
12+
run1: main1 input
13+
./main1 <input
14+
15+
run2: main2 input
16+
./main2 <input
17+
18+
clean:
19+
rm -f main1 main2 input

2024/12/common.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"fmt"
6+
"os"
7+
)
8+
9+
type P struct{ x, y int }
10+
11+
func parseInput() (map[P]uint8, int) {
12+
scanner := bufio.NewScanner(os.Stdin)
13+
m := map[P]uint8{}
14+
var i int
15+
for i = 0; scanner.Scan(); i++ {
16+
line := scanner.Text()
17+
for j, c := range line {
18+
m[P{i, j}] = uint8(c)
19+
}
20+
}
21+
return m, i
22+
}
23+
24+
func main() {
25+
m, size := parseInput()
26+
price := 0
27+
visited := map[P]struct{}{}
28+
for i := 0; i < size; i++ {
29+
for j := 0; j < size; j++ {
30+
if _, ok := visited[P{i, j}]; ok {
31+
continue
32+
}
33+
area, fence := explore(m, P{i, j}, visited)
34+
price += area * fence
35+
}
36+
}
37+
fmt.Println(price)
38+
}

2024/12/main1.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package main
2+
3+
// BFS
4+
func explore(m map[P]uint8, p P, visited map[P]struct{}) (int, int) {
5+
6+
visited[p] = struct{}{}
7+
8+
perimeter, area := 0, 0
9+
10+
var c P
11+
toDo := []P{p}
12+
for len(toDo) > 0 {
13+
c, toDo = toDo[0], toDo[1:]
14+
15+
area++
16+
17+
for _, d := range []P{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} {
18+
next := P{c.x + d.x, c.y + d.y}
19+
val, ok := m[next]
20+
if ok && val == m[p] {
21+
if _, ok := visited[next]; !ok {
22+
toDo = append(toDo, next)
23+
visited[next] = struct{}{}
24+
}
25+
} else {
26+
perimeter++
27+
}
28+
}
29+
30+
}
31+
32+
return area, perimeter
33+
}

2024/12/main2.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package main
2+
3+
// BFS
4+
func explore(m map[P]uint8, p P, visited map[P]struct{}) (int, int) {
5+
visited[p] = struct{}{}
6+
7+
id := m[p]
8+
9+
area, corners := 0, 0
10+
11+
var c P
12+
toDo := []P{p}
13+
for len(toDo) > 0 {
14+
c, toDo = toDo[0], toDo[1:]
15+
16+
area++
17+
18+
for _, d := range []P{{-1, 0}, {1, 0}, {0, -1}, {0, 1}} {
19+
next := P{c.x + d.x, c.y + d.y}
20+
val, ok := m[next]
21+
if ok && val == id {
22+
if _, ok := visited[next]; !ok {
23+
toDo = append(toDo, next)
24+
visited[next] = struct{}{}
25+
}
26+
}
27+
}
28+
29+
for _, d := range []P{{-1, -1}, {1, 1}, {1, -1}, {-1, 1}} {
30+
// convex corner
31+
if m[P{c.x + d.x, c.y}] != id &&
32+
m[P{c.x, c.y + d.y}] != id {
33+
corners++
34+
}
35+
// concave corner
36+
if m[P{c.x + d.x, c.y}] == id &&
37+
m[P{c.x, c.y + d.y}] == id &&
38+
m[P{c.x + d.x, c.y + d.y}] != id {
39+
corners++
40+
}
41+
}
42+
43+
}
44+
45+
return area, corners
46+
}

0 commit comments

Comments
 (0)