@@ -7,11 +7,12 @@ import (
77)
88
99type 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
1718var 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- }
181117func main () {
182- log .Println (do ("test.txt" ))
118+ // log.Println(do("test.txt"))
183119 log .Println (do ("input.txt" ))
184120}
0 commit comments