Skip to content

Commit e5e13c2

Browse files
committed
feat(2020-16/angch): Hyperoptimized
1 parent 880f7c3 commit e5e13c2

1 file changed

Lines changed: 69 additions & 16 deletions

File tree

2020-15/angch/main.go

Lines changed: 69 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,41 +26,39 @@ func do(fileName string) (int, int) {
2626
a := strings.Split(l, ",")
2727
for k, v := range a {
2828
num, _ := strconv.Atoi(v)
29-
_, ok := nums[num]
29+
k2, ok := nums[num]
3030
if !ok {
31-
nums[num] = make([]int, 0, 2)
31+
k2 = make([]int, 0, 2)
3232
}
33-
nums[num] = append(nums[num], k+1)
34-
pos = k + 1
35-
last = num
33+
nums[num] = append(k2, k+1)
34+
pos, last = k+1, num
3635
}
3736
}
3837

3938
out := 0
4039
for {
41-
if len(nums[last]) == 1 {
40+
k := nums[last]
41+
if len(k) == 1 {
4242
out = 0
4343
} else {
44-
out = nums[last][len(nums[last])-1] - nums[last][len(nums[last])-2]
44+
out = k[1] - k[0]
4545
}
4646
pos++
4747

48-
_, ok := nums[out]
48+
k, ok := nums[out]
4949
if !ok {
50-
nums[out] = make([]int, 0, 2)
50+
k = make([]int, 0, 2)
5151
}
52-
if len(nums[out]) <= 1 {
53-
nums[out] = append(nums[out], pos)
52+
if len(k) <= 1 {
53+
nums[out] = append(k, pos)
5454
} else {
55-
nums[out][0] = nums[out][1]
56-
nums[out][1] = pos
55+
k[0], k[1] = k[1], pos
5756
}
5857
last = out
5958
if pos == 2020 {
6059
ret1 = last
6160
}
6261
if pos >= 30000000 {
63-
// if pos >= 2020 {
6462
break
6563
}
6664
}
@@ -69,8 +67,63 @@ func do(fileName string) (int, int) {
6967
return ret1, ret2
7068
}
7169

70+
type Vec struct {
71+
One int32
72+
Two int32
73+
}
74+
75+
func do2(input []int) (int, int) {
76+
ret1, ret2 := 0, 0
77+
78+
nums := make([]Vec, 30000000)
79+
last, pos := int32(0), int32(0)
80+
for _, v := range input {
81+
pos++
82+
last = int32(v)
83+
nums[last] = Vec{One: int32(pos)}
84+
}
85+
86+
// k := nums[last]
87+
for {
88+
k := nums[last]
89+
if k.Two == 0 {
90+
last = 0
91+
} else {
92+
last = k.One
93+
}
94+
pos++
95+
if pos == 2020 {
96+
ret1 = int(last)
97+
}
98+
if pos >= 30000000 {
99+
break
100+
}
101+
102+
k = nums[last]
103+
if k.One == 0 {
104+
nums[last] = Vec{
105+
One: pos,
106+
}
107+
} else if k.Two == 0 {
108+
nums[last] = Vec{
109+
One: pos - k.One,
110+
Two: pos,
111+
}
112+
} else {
113+
nums[last] = Vec{
114+
One: pos - k.Two,
115+
Two: pos,
116+
}
117+
}
118+
}
119+
ret2 = int(last)
120+
121+
return ret1, ret2
122+
}
123+
72124
func main() {
73-
log.Println(do("test.txt"))
125+
// log.Println(do("test.txt"))
74126
// log.Println(do("test2.txt"))
75-
log.Println(do("input.txt"))
127+
// log.Println(do("input.txt"))
128+
log.Println(do2([]int{12, 20, 0, 6, 1, 17, 7}))
76129
}

0 commit comments

Comments
 (0)