Skip to content

Commit ebde394

Browse files
committed
feat(2020-24/angch): redblobgames rocks
1 parent 2520475 commit ebde394

2 files changed

Lines changed: 183 additions & 0 deletions

File tree

2020-24/angch/main.go

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"log"
6+
"os"
7+
)
8+
9+
type Hex struct {
10+
I, J, K int
11+
}
12+
13+
func Cube(i, j, k int) Hex {
14+
return Hex{i, j, k}
15+
}
16+
17+
var dir = map[string]Hex{
18+
"e": Cube(+1, -1, 0),
19+
"ne": Cube(+1, 0, -1),
20+
"nw": Cube(0, +1, -1),
21+
"w": Cube(-1, +1, 0),
22+
"sw": Cube(-1, 0, +1),
23+
"se": Cube(0, -1, +1),
24+
}
25+
26+
func do(fileName string) (ret1 int, ret2 int) {
27+
file, err := os.Open(fileName)
28+
if err != nil {
29+
log.Fatal(err)
30+
}
31+
defer file.Close()
32+
scanner := bufio.NewScanner(file)
33+
34+
current := Hex{}
35+
hexmap := make(map[Hex]bool)
36+
37+
for scanner.Scan() {
38+
l := scanner.Text()
39+
_ = l
40+
41+
p := ""
42+
current = Hex{}
43+
for _, v := range l {
44+
if v == 'e' || v == 'w' {
45+
d := p + string(v)
46+
dh, ok := dir[d]
47+
if !ok {
48+
log.Fatal(dh)
49+
}
50+
current.I += dh.I
51+
current.J += dh.J
52+
current.K += dh.K
53+
p = ""
54+
} else {
55+
p = string(v)
56+
}
57+
}
58+
hexmap[current] = !hexmap[current]
59+
60+
}
61+
62+
// log.Println(hexmap)
63+
64+
for _, v := range hexmap {
65+
if v {
66+
ret1++
67+
}
68+
}
69+
70+
for day := 1; day <= 100; day++ {
71+
hexmap2 := make(map[Hex]bool)
72+
min, max := minmax(hexmap)
73+
for i := min.I - 1; i <= max.I+1; i++ {
74+
for j := min.J - 1; j <= max.J+1; j++ {
75+
for k := min.K - 1; k <= max.K+1; k++ {
76+
c := Hex{i, j, k}
77+
n := neighbour(hexmap, c)
78+
if hexmap[c] {
79+
if n == 0 || n > 2 {
80+
// hexmap2[c] = false
81+
} else {
82+
hexmap2[c] = true
83+
}
84+
} else {
85+
if n == 2 {
86+
hexmap2[c] = true
87+
} else {
88+
// hexmap2[c] = false
89+
}
90+
}
91+
}
92+
}
93+
}
94+
hexmap = hexmap2
95+
96+
count := 0
97+
for _, v := range hexmap {
98+
if v {
99+
count++
100+
}
101+
}
102+
ret2 = count
103+
log.Println("Day", day, count)
104+
105+
}
106+
107+
return ret1, ret2
108+
}
109+
110+
func minmax(hexmap map[Hex]bool) (Hex, Hex) {
111+
min := Hex{}
112+
max := Hex{}
113+
first := true
114+
for k, v := range hexmap {
115+
if !v {
116+
continue
117+
}
118+
if first {
119+
first = false
120+
min = k
121+
max = k
122+
continue
123+
}
124+
if min.I > k.I {
125+
min.I = k.I
126+
}
127+
if min.J > k.J {
128+
min.J = k.J
129+
}
130+
if min.K > k.K {
131+
min.K = k.K
132+
}
133+
if max.I < k.I {
134+
max.I = k.I
135+
}
136+
if max.J < k.J {
137+
max.J = k.J
138+
}
139+
if max.K < k.K {
140+
max.K = k.K
141+
}
142+
}
143+
return min, max
144+
}
145+
146+
func neighbour(hexmap map[Hex]bool, c Hex) int {
147+
count := 0
148+
for _, v := range dir {
149+
d := c
150+
d.I += v.I
151+
d.J += v.J
152+
d.K += v.K
153+
154+
if hexmap[d] {
155+
count++
156+
}
157+
}
158+
return count
159+
}
160+
func main() {
161+
log.Println(do("test.txt"))
162+
log.Println(do("input.txt"))
163+
}

2020-24/angch/test.txt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
sesenwnenenewseeswwswswwnenewsewsw
2+
neeenesenwnwwswnenewnwwsewnenwseswesw
3+
seswneswswsenwwnwse
4+
nwnwneseeswswnenewneswwnewseswneseene
5+
swweswneswnenwsewnwneneseenw
6+
eesenwseswswnenwswnwnwsewwnwsene
7+
sewnenenenesenwsewnenwwwse
8+
wenwwweseeeweswwwnwwe
9+
wsweesenenewnwwnwsenewsenwwsesesenwne
10+
neeswseenwwswnwswswnw
11+
nenwswwsewswnenenewsenwsenwnesesenew
12+
enewnwewneswsewnwswenweswnenwsenwsw
13+
sweneswneswneneenwnewenewwneswswnese
14+
swwesenesewenwneswnwwneseswwne
15+
enesenwswwswneneswsenwnewswseenwsese
16+
wnwnesenesenenwwnenwsewesewsesesew
17+
nenewswnwewswnenesenwnesewesw
18+
eneswnwswnwsenenwnwnwwseeswneewsenese
19+
neswnwewnwnwseenwseesewsenwsweewe
20+
wseweeenwnesenwwwswnew

0 commit comments

Comments
 (0)