Skip to content

Commit d8723a8

Browse files
committed
2024-day12
1 parent 4dd0d53 commit d8723a8

File tree

6 files changed

+154
-0
lines changed

6 files changed

+154
-0
lines changed

2024/day12/.bench

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"Lines":[{"Name":"Part 1","N":196,"NsPerOp":6034676,"AllocedBytesPerOp":0,"AllocsPerOp":0,"MBPerS":0,"Measured":1,"Ord":0},{"Name":"Part 2","N":132,"NsPerOp":9227806,"AllocedBytesPerOp":0,"AllocsPerOp":0,"MBPerS":0,"Measured":1,"Ord":0}],"Measured":1}

2024/day12/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<!-- You can add some comments here if you want to :D -->

2024/day12/main.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package main
2+
3+
import (
4+
_ "embed"
5+
"os"
6+
)
7+
8+
//go:embed input.txt
9+
var input string
10+
11+
//go:embed input_test.txt
12+
var inputTest string
13+
14+
func main() {
15+
// Check argv if we use test input or not
16+
if len(os.Args) > 1 && os.Args[1] == "test" {
17+
input = inputTest
18+
}
19+
20+
answer := doPartOne(input)
21+
println(answer)
22+
23+
answer = doPartTwo(input)
24+
println(answer)
25+
}

2024/day12/main_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package main
2+
3+
import "testing"
4+
5+
func BenchmarkPartOne(b *testing.B) {
6+
for n := 0; n < b.N; n++ {
7+
doPartOne(input)
8+
}
9+
}
10+
11+
func BenchmarkPartTwo(b *testing.B) {
12+
for n := 0; n < b.N; n++ {
13+
doPartTwo(input)
14+
}
15+
}

2024/day12/part1.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package main
2+
3+
import (
4+
"aocli/utils/maps"
5+
"aocli/utils/reader"
6+
"image"
7+
)
8+
9+
func doPartOne(input string) int {
10+
mapper := maps.MakeImagePointMap(reader.FileLineByLine(input))
11+
seen := make(map[image.Point]bool)
12+
var delta = []image.Point{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}
13+
var res int
14+
for i, r := range mapper {
15+
if seen[i] {
16+
continue
17+
}
18+
NP := []image.Point{i}
19+
var area, perim int
20+
for len(NP) > 0 {
21+
P := NP[0]
22+
NP = NP[1:]
23+
if seen[P] {
24+
continue
25+
}
26+
area++
27+
28+
seen[P] = true
29+
for _, d := range delta {
30+
np := P.Add(d)
31+
if _, ok := mapper[np]; mapper[np] == r && ok {
32+
NP = append(NP, np)
33+
continue
34+
}
35+
perim++
36+
}
37+
}
38+
res += area * perim
39+
}
40+
return res
41+
}

2024/day12/part2.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package main
2+
3+
import (
4+
"aocli/utils/maps"
5+
"aocli/utils/reader"
6+
"image"
7+
"slices"
8+
)
9+
10+
func doPartTwo(input string) int {
11+
mapper := maps.MakeImagePointMap(reader.FileLineByLine(input))
12+
seen := make(map[image.Point]bool)
13+
var delta = []image.Point{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}
14+
var res int
15+
for i, r := range mapper {
16+
if seen[i] {
17+
continue
18+
}
19+
NP := []image.Point{i}
20+
sides := make(map[image.Point][]image.Point)
21+
var area int
22+
for len(NP) > 0 {
23+
P := NP[0]
24+
NP = NP[1:]
25+
if seen[P] {
26+
continue
27+
}
28+
area++
29+
30+
seen[P] = true
31+
for _, d := range delta {
32+
np := P.Add(d)
33+
if _, ok := mapper[np]; mapper[np] == r && ok {
34+
NP = append(NP, np)
35+
continue
36+
}
37+
if _, ok := sides[d]; !ok {
38+
sides[d] = []image.Point{}
39+
}
40+
sides[d] = append(sides[d], P)
41+
}
42+
}
43+
var S int
44+
for _, s := range sides {
45+
sideseen := make(map[image.Point]bool)
46+
for _, i := range s {
47+
if _, ok := sideseen[i]; ok {
48+
continue
49+
}
50+
S++
51+
NP := []image.Point{i}
52+
for len(NP) > 0 {
53+
P := NP[0]
54+
NP = NP[1:]
55+
if sideseen[P] {
56+
continue
57+
}
58+
sideseen[P] = true
59+
for _, dd := range delta {
60+
np := P.Add(dd)
61+
if slices.Contains(s, np) {
62+
NP = append(NP, np)
63+
}
64+
}
65+
}
66+
}
67+
}
68+
res += area * S
69+
}
70+
return res
71+
}

0 commit comments

Comments
 (0)