@@ -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+
72124func 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