Skip to content

Commit 06fddc7

Browse files
committed
feat(2020-17/angch): Hack, as-is
1 parent 9dabb83 commit 06fddc7

2 files changed

Lines changed: 284 additions & 0 deletions

File tree

2020-17/angch/main.go

Lines changed: 281 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,281 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"fmt"
6+
"log"
7+
"os"
8+
)
9+
10+
type Vector struct {
11+
X, Y, Z, W int
12+
}
13+
14+
func neighbour(board map[Vector]bool, x, y, z int) int {
15+
count := 0
16+
for z1 := z - 1; z1 <= z+1; z1++ {
17+
for y1 := y - 1; y1 <= y+1; y1++ {
18+
for x1 := x - 1; x1 <= x+1; x1++ {
19+
if x1 == x && y1 == y && z1 == z {
20+
continue
21+
}
22+
if board[Vector{x1, y1, z1, 0}] {
23+
count++
24+
}
25+
}
26+
}
27+
}
28+
return count
29+
}
30+
func neighbour2(board map[Vector]bool, x, y, z, w int) int {
31+
count := 0
32+
for w1 := w - 1; w1 <= w+1; w1++ {
33+
for z1 := z - 1; z1 <= z+1; z1++ {
34+
for y1 := y - 1; y1 <= y+1; y1++ {
35+
for x1 := x - 1; x1 <= x+1; x1++ {
36+
if x1 == x && y1 == y && z1 == z && w1 == w {
37+
continue
38+
}
39+
if board[Vector{x1, y1, z1, w1}] {
40+
count++
41+
}
42+
}
43+
}
44+
}
45+
}
46+
return count
47+
}
48+
49+
func do(fileName string) (ret1 int, ret2 int) {
50+
file, err := os.Open(fileName)
51+
if err != nil {
52+
log.Fatal(err)
53+
}
54+
defer file.Close()
55+
scanner := bufio.NewScanner(file)
56+
57+
board := make(map[Vector]bool)
58+
row := 0
59+
maxX, maxY, maxZ := 0, 0, 0
60+
minX, minY, minZ := 0, 0, 0
61+
for scanner.Scan() {
62+
l := scanner.Text()
63+
_ = l
64+
65+
if l == "" {
66+
break
67+
}
68+
// log.Println(l)
69+
for k, v := range l {
70+
if v == '#' {
71+
board[Vector{k, row, 0, 0}] = true
72+
}
73+
}
74+
maxX = len(l)
75+
maxY = row
76+
row++
77+
}
78+
79+
for steps := 1; steps < 7; steps++ {
80+
board2 := make(map[Vector]bool)
81+
minX2, minY2, minZ2 := 0, 0, 0
82+
maxX2, maxY2, maxZ2 := 0, 0, 0
83+
count2 := 0
84+
for z := minZ - 1; z <= maxZ+1; z++ {
85+
// fmt.Println("z", z)
86+
for y := minY - 1; y <= maxY+1; y++ {
87+
for x := minX - 1; x <= maxX+1; x++ {
88+
if board[Vector{x, y, z, 0}] {
89+
n := neighbour(board, x, y, z)
90+
if n == 2 || n == 3 {
91+
board2[Vector{x, y, z, 0}] = true
92+
count2++
93+
}
94+
} else {
95+
n := neighbour(board, x, y, z)
96+
if n == 3 {
97+
board2[Vector{x, y, z, 0}] = true
98+
count2++
99+
}
100+
}
101+
if board2[Vector{x, y, z, 0}] {
102+
if x < minX2 {
103+
minX2 = x
104+
}
105+
if x > maxX2 {
106+
maxX2 = x
107+
}
108+
if y < minY2 {
109+
minY2 = y
110+
}
111+
if y > maxY2 {
112+
maxY2 = y
113+
}
114+
if z < minZ2 {
115+
minZ2 = z
116+
}
117+
if z > maxZ2 {
118+
maxZ2 = z
119+
}
120+
} else {
121+
// fmt.Print(".")
122+
}
123+
}
124+
// fmt.Println()
125+
}
126+
}
127+
// minZ--
128+
if false {
129+
for z := minZ2; z <= maxZ2; z++ {
130+
fmt.Println("\nz ", z)
131+
for y := minY2; y <= maxY2; y++ {
132+
for x := minX2; x <= maxX2; x++ {
133+
if board2[Vector{x, y, z, 0}] {
134+
fmt.Print("#")
135+
} else {
136+
fmt.Print(".")
137+
}
138+
}
139+
fmt.Println()
140+
}
141+
}
142+
log.Println(board)
143+
}
144+
board = board2
145+
minX = minX2
146+
maxX = maxX2
147+
minY = minY2
148+
maxY = maxY2
149+
minZ = minZ2
150+
maxZ = maxZ2
151+
ret1 = count2
152+
}
153+
154+
return ret1, ret2
155+
}
156+
157+
func do2(fileName string) (ret1 int, ret2 int) {
158+
file, err := os.Open(fileName)
159+
if err != nil {
160+
log.Fatal(err)
161+
}
162+
defer file.Close()
163+
scanner := bufio.NewScanner(file)
164+
165+
board := make(map[Vector]bool)
166+
row := 0
167+
maxX, maxY, maxZ, maxW := 0, 0, 0, 0
168+
minX, minY, minZ, minW := 0, 0, 0, 0
169+
for scanner.Scan() {
170+
l := scanner.Text()
171+
_ = l
172+
173+
if l == "" {
174+
break
175+
}
176+
// log.Println(l)
177+
for k, v := range l {
178+
if v == '#' {
179+
board[Vector{k, row, 0, 0}] = true
180+
}
181+
}
182+
maxX = len(l)
183+
maxY = row
184+
row++
185+
}
186+
187+
for steps := 1; steps < 7; steps++ {
188+
board2 := make(map[Vector]bool)
189+
minX2, minY2, minZ2, minW2 := 0, 0, 0, 0
190+
maxX2, maxY2, maxZ2, maxW2 := 0, 0, 0, 0
191+
count2 := 0
192+
for w := minW - 1; w <= maxW+1; w++ {
193+
for z := minZ - 1; z <= maxZ+1; z++ {
194+
// fmt.Println("z", z)
195+
for y := minY - 1; y <= maxY+1; y++ {
196+
for x := minX - 1; x <= maxX+1; x++ {
197+
if board[Vector{x, y, z, w}] {
198+
n := neighbour2(board, x, y, z, w)
199+
if n == 2 || n == 3 {
200+
board2[Vector{x, y, z, w}] = true
201+
count2++
202+
}
203+
} else {
204+
n := neighbour2(board, x, y, z, w)
205+
if n == 3 {
206+
board2[Vector{x, y, z, w}] = true
207+
count2++
208+
}
209+
}
210+
if board2[Vector{x, y, z, w}] {
211+
if x < minX2 {
212+
minX2 = x
213+
}
214+
if x > maxX2 {
215+
maxX2 = x
216+
}
217+
if y < minY2 {
218+
minY2 = y
219+
}
220+
if y > maxY2 {
221+
maxY2 = y
222+
}
223+
if z < minZ2 {
224+
minZ2 = z
225+
}
226+
if z > maxZ2 {
227+
maxZ2 = z
228+
}
229+
if w < minW2 {
230+
minW2 = w
231+
}
232+
if w > maxW2 {
233+
maxW2 = w
234+
}
235+
} else {
236+
// fmt.Print(".")
237+
}
238+
}
239+
// fmt.Println()
240+
}
241+
}
242+
}
243+
// minZ--
244+
if false {
245+
for z := minZ2; z <= maxZ2; z++ {
246+
fmt.Println("\nz ", z)
247+
for y := minY2; y <= maxY2; y++ {
248+
for x := minX2; x <= maxX2; x++ {
249+
if board2[Vector{x, y, z, 0}] {
250+
fmt.Print("#")
251+
} else {
252+
fmt.Print(".")
253+
}
254+
}
255+
fmt.Println()
256+
}
257+
}
258+
log.Println(board)
259+
}
260+
board = board2
261+
minX = minX2
262+
maxX = maxX2
263+
minY = minY2
264+
maxY = maxY2
265+
minZ = minZ2
266+
maxZ = maxZ2
267+
minW = minW2
268+
maxW = maxW2
269+
ret2 = count2
270+
}
271+
272+
return ret1, ret2
273+
}
274+
275+
func main() {
276+
log.Println(do("test.txt"))
277+
log.Println(do2("test.txt"))
278+
// log.Println(do("test2.txt"))
279+
log.Println(do("input.txt"))
280+
log.Println(do2("input.txt"))
281+
}

2020-17/angch/test.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.#.
2+
..#
3+
###

0 commit comments

Comments
 (0)