Skip to content

Commit 4da75ed

Browse files
committed
feat(2020-24/angch): More neighbourhoodcount optimization
1 parent 92ff1cf commit 4da75ed

File tree

1 file changed

+30
-94
lines changed

1 file changed

+30
-94
lines changed

Diff for: 2020-24/angch/main.go

+30-94
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ import (
77
)
88

99
type Hex struct {
10-
I, J, K int
10+
I, J, K int16
11+
pad int16
1112
}
1213

13-
func Cube(i, j, k int) Hex {
14-
return Hex{i, j, k}
14+
func Cube(i, j, k int16) Hex {
15+
return Hex{i, j, k, 0}
1516
}
1617

1718
var dir = map[string]Hex{
@@ -64,12 +65,12 @@ func do(fileName string) (ret1 int, ret2 int) {
6465
for c, v2 := range hexmap {
6566
if v2 {
6667
ret1++
68+
// neighbourcount[c] += 0
6769

6870
for _, v := range dir {
6971
v.I += c.I
7072
v.J += c.J
7173
v.K += c.K
72-
7374
neighbourcount[v]++
7475
}
7576
}
@@ -78,107 +79,42 @@ func do(fileName string) (ret1 int, ret2 int) {
7879
for day := 1; day <= 100; day++ {
7980
hexmap2 := make(map[Hex]bool)
8081
neighbourcount2 := make(map[Hex]int)
81-
min, max := minmax(hexmap)
82-
for i := min.I - 1; i <= max.I+1; i++ {
83-
for j := min.J - 1; j <= max.J+1; j++ {
84-
for k := min.K - 1; k <= max.K+1; k++ {
85-
c := Hex{i, j, k}
86-
n := neighbourcount[c]
87-
// n := neighbour(hexmap, c)
88-
if hexmap[c] {
89-
if n == 0 || n > 2 {
90-
// hexmap2[c] = false
91-
} else {
92-
hexmap2[c] = true
93-
for _, v := range dir {
94-
v.I += c.I
95-
v.J += c.J
96-
v.K += c.K
97-
neighbourcount2[v]++
98-
}
99-
}
100-
} else {
101-
if n == 2 {
102-
hexmap2[c] = true
103-
for _, v := range dir {
104-
v.I += c.I
105-
v.J += c.J
106-
v.K += c.K
107-
neighbourcount2[v]++
108-
}
109-
} else {
110-
// hexmap2[c] = false
111-
}
82+
for c, n := range neighbourcount {
83+
if hexmap[c] {
84+
if !(n == 0 || n > 2) {
85+
hexmap2[c] = true
86+
for _, v := range dir {
87+
v.I += c.I
88+
v.J += c.J
89+
v.K += c.K
90+
neighbourcount2[v]++
91+
// neighbourcount2[c] += 0
92+
}
93+
}
94+
} else {
95+
if n == 2 {
96+
hexmap2[c] = true
97+
for _, v := range dir {
98+
v.I += c.I
99+
v.J += c.J
100+
v.K += c.K
101+
neighbourcount2[v]++
102+
// neighbourcount2[c] += 0
112103
}
113104
}
114105
}
115106
}
116107
hexmap = hexmap2
117-
118-
count := 0
119108
neighbourcount = neighbourcount2
120-
for _, v2 := range hexmap {
121-
if v2 {
122-
count++
123-
}
124-
}
125-
ret2 = count
126-
// log.Println("Day", day, count)
109+
110+
ret2 = len(hexmap)
111+
log.Println("Day", day, ret2, len(neighbourcount2))
127112
}
128113

129114
return ret1, ret2
130115
}
131116

132-
func minmax(hexmap map[Hex]bool) (Hex, Hex) {
133-
min := Hex{}
134-
max := Hex{}
135-
first := true
136-
for k, v := range hexmap {
137-
if !v {
138-
continue
139-
}
140-
if first {
141-
first = false
142-
min = k
143-
max = k
144-
continue
145-
}
146-
if min.I > k.I {
147-
min.I = k.I
148-
}
149-
if min.J > k.J {
150-
min.J = k.J
151-
}
152-
if min.K > k.K {
153-
min.K = k.K
154-
}
155-
if max.I < k.I {
156-
max.I = k.I
157-
}
158-
if max.J < k.J {
159-
max.J = k.J
160-
}
161-
if max.K < k.K {
162-
max.K = k.K
163-
}
164-
}
165-
return min, max
166-
}
167-
168-
func neighbour(hexmap map[Hex]bool, c Hex) int {
169-
count := 0
170-
for _, v := range dir {
171-
v.I += c.I
172-
v.J += c.J
173-
v.K += c.K
174-
175-
if hexmap[v] {
176-
count++
177-
}
178-
}
179-
return count
180-
}
181117
func main() {
182-
log.Println(do("test.txt"))
118+
// log.Println(do("test.txt"))
183119
log.Println(do("input.txt"))
184120
}

0 commit comments

Comments
 (0)