Skip to content

Commit bf2287b

Browse files
committed
feat:(2020-22/angch)
1 parent aa824bb commit bf2287b

2 files changed

Lines changed: 249 additions & 0 deletions

File tree

2020-22/angch/main.go

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"crypto/md5"
6+
"fmt"
7+
"log"
8+
"os"
9+
"strconv"
10+
)
11+
12+
type Hands map[int][]int
13+
14+
func (h *Hands) Hash() string {
15+
// m, err := json.Marshal(*h)
16+
17+
// if err != nil {
18+
// log.Fatal(err)
19+
// }
20+
// k := md5.Sum(m)
21+
j := md5.New()
22+
for _, v := range (*h)[1] {
23+
j.Write([]byte{byte(v)})
24+
}
25+
for _, v := range (*h)[2] {
26+
j.Write([]byte{byte(v) + 64})
27+
}
28+
k := j.Sum([]byte{})
29+
return string(k[:])
30+
}
31+
32+
func do(fileName string) (ret1 int, ret2 int) {
33+
file, err := os.Open(fileName)
34+
if err != nil {
35+
log.Fatal(err)
36+
}
37+
defer file.Close()
38+
scanner := bufio.NewScanner(file)
39+
40+
hands := make(map[int][]int, 0)
41+
42+
for scanner.Scan() {
43+
l := scanner.Text()
44+
_ = l
45+
46+
player := 0
47+
fmt.Sscanf(l, "Player %d:", &player)
48+
hands[player] = make([]int, 0)
49+
50+
for scanner.Scan() {
51+
l := scanner.Text()
52+
_ = l
53+
54+
if l == "" {
55+
break
56+
}
57+
i, _ := strconv.Atoi(l)
58+
59+
hands[player] = append(hands[player], i)
60+
}
61+
}
62+
63+
a:
64+
for {
65+
top := make([]int, len(hands)+1)
66+
for k, v := range hands {
67+
if len(v) == 0 {
68+
break a
69+
}
70+
top[k] = v[0]
71+
hands[k] = v[1:]
72+
}
73+
74+
if top[1] > top[2] {
75+
hands[1] = append(hands[1], top[1], top[2])
76+
} else {
77+
hands[2] = append(hands[2], top[2], top[1])
78+
}
79+
log.Println(hands)
80+
}
81+
82+
log.Println(hands)
83+
for _, v := range hands {
84+
if len(v) == 0 {
85+
continue
86+
}
87+
88+
for k2, v2 := range v {
89+
ret1 += v2 * (len(v) - k2)
90+
log.Println(v2, (len(v) - k2))
91+
}
92+
}
93+
// ret1 = count
94+
95+
return ret1, ret2
96+
}
97+
98+
var debug = false
99+
100+
var history2 = map[string]int{}
101+
102+
func subgame(hands Hands, round int, game int) (int, Hands) {
103+
winner := 0
104+
subgamecount := game
105+
106+
sum2 := hands.Hash()
107+
if h3, ok := history2[sum2]; ok {
108+
if debug {
109+
log.Println("cached", len(history2), round, game)
110+
}
111+
return h3, hands
112+
}
113+
history := make(map[string]bool)
114+
a:
115+
for {
116+
if debug {
117+
log.Println("Round", round, "Game", game)
118+
log.Println(hands)
119+
}
120+
round++
121+
sum := hands.Hash()
122+
if history[sum] {
123+
if debug {
124+
log.Println("inf game", round, game)
125+
}
126+
winner = 1
127+
break
128+
}
129+
130+
top := make([]int, len(hands)+1)
131+
history[sum] = true
132+
for k, v := range hands {
133+
if len(v) == 0 {
134+
if k == 1 {
135+
winner = 2
136+
} else {
137+
winner = 1
138+
}
139+
break a
140+
}
141+
top[k] = v[0]
142+
hands[k] = v[1:]
143+
}
144+
145+
if debug {
146+
log.Println("top", top[1], len(hands[1]), top[2], len(hands[2]))
147+
}
148+
149+
if top[1] <= len(hands[1]) && top[2] <= len(hands[2]) {
150+
h2 := make(Hands)
151+
h2[1] = make([]int, top[1])
152+
h2[2] = make([]int, top[2])
153+
copy(h2[1], hands[1])
154+
copy(h2[2], hands[2])
155+
if debug {
156+
log.Println("Playing subgame", h2)
157+
}
158+
subgamecount++
159+
w2, _ := subgame(h2, 1, subgamecount)
160+
if debug {
161+
log.Println("Winner of subgame is", w2)
162+
}
163+
164+
if w2 == 1 {
165+
hands[1] = append(hands[1], top[1], top[2])
166+
} else {
167+
hands[2] = append(hands[2], top[2], top[1])
168+
}
169+
continue
170+
}
171+
172+
if top[1] > top[2] {
173+
hands[1] = append(hands[1], top[1], top[2])
174+
} else {
175+
hands[2] = append(hands[2], top[2], top[1])
176+
}
177+
}
178+
history2[sum2] = winner
179+
180+
return winner, hands
181+
}
182+
183+
func do2(fileName string) (ret1 int, ret2 int) {
184+
file, err := os.Open(fileName)
185+
if err != nil {
186+
log.Fatal(err)
187+
}
188+
defer file.Close()
189+
scanner := bufio.NewScanner(file)
190+
191+
hands := make(Hands)
192+
193+
for scanner.Scan() {
194+
l := scanner.Text()
195+
_ = l
196+
197+
player := 0
198+
fmt.Sscanf(l, "Player %d:", &player)
199+
hands[player] = make([]int, 0)
200+
201+
for scanner.Scan() {
202+
l := scanner.Text()
203+
_ = l
204+
205+
if l == "" {
206+
break
207+
}
208+
i, _ := strconv.Atoi(l)
209+
210+
hands[player] = append(hands[player], i)
211+
}
212+
}
213+
214+
w, hands := subgame(hands, 1, 1)
215+
log.Println("Winner", w, hands)
216+
for _, v := range hands {
217+
if len(v) == 0 {
218+
continue
219+
}
220+
221+
for k2, v2 := range v {
222+
ret1 += v2 * (len(v) - k2)
223+
// log.Println(v2, (len(v) - k2))
224+
}
225+
}
226+
// ret1 = count
227+
228+
return ret1, ret2
229+
}
230+
231+
func main() {
232+
// log.Println(do("test.txt"))
233+
// log.Println(do2("test.txt"))
234+
// log.Println(do("input.txt"))
235+
log.Println(do2("input.txt"))
236+
}

2020-22/angch/test.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
Player 1:
2+
9
3+
2
4+
6
5+
3
6+
1
7+
8+
Player 2:
9+
5
10+
8
11+
4
12+
7
13+
10

0 commit comments

Comments
 (0)