package main import . "fmt" import "math/rand" func main() { var id,n,m int Scan(&id,&n,&m) mycards := make([]int, m+1) for i := 0; i < n; i++ { var c int Scan(&c) mycards[c]++ } s := newS(id, n, m, mycards) for i := 0; i < 3*m; i++ { var status string Scan(&status) switch status { case "TURN": ask, guess := s.turn() if len(guess) == 0 { Println("ASK", ask) } else { Println(append([]any{"GUESS"}, guess...)...) } case "WAIT": s.wait() case "END": return } var answer string Scan(&answer) switch answer { case "COUNT": var x, k int Scan(&x, &k) s.count(x, k) case "GUESSED": var gid, ok int Scan(&gid, &ok) s.guessed(gid, ok) } } } type S struct { id, n, m int cards [][]int cur int myturn bool } func newS(id, n, m int, mycards []int) *S { s := &S{ id: id, n: n, m: m, cards: [][]int{ make([]int, m+1), make([]int, m+1), make([]int, m+1), }, cur: m-1, myturn: false, } for _, cc := range s.cards { for i := range cc { cc[i] = -1 } } copy(s.cards[id], mycards) if n < m { s.cur = n for i := 1; i <= m; i++ { s.cards[3-id][i] = 0 } } return s } func (s *S)turn() (ask int, guess []any) { s.myturn = true if s.cur == 0 { tmp := []any{} for i := 1; i <= s.m; i++ { if s.cards[0][i] == -1 { continue } uc := s.cards[1][i]+s.cards[2][i] uc = s.cards[0][i] - uc for j := 0; j < uc; j++ { tmp = append(tmp, i) } } if len(tmp) == s.n { guess = tmp return } for i := 1; i <= s.m; i++ { if s.cards[0][i] == -1 { ask = i return } } panic("BUG") } if s.n < s.m { tmp := []int{} for i := 1; i <= s.m; i++ { for j := 0; j < s.cards[s.id][i]; j++ { tmp = append(tmp, i) } } ask = tmp[s.cur-1] return } if s.cards[s.id][s.cur] == 0 { e := s.cur+1 for e < s.m && s.cards[0][e] != -1 { e++ } ask = e return } ask = s.cards[s.id][s.cur] return } func (s *S)wait() { s.myturn = false } func (s *S)count(x, k int) { s.cards[0][x] = k if s.cur == 0 { return } if s.n < s.m { if s.myturn { if s.id == 2 { s.cur-- } } else { s.cards[3-s.id][x]++ if s.id == 1 { s.cur-- } } return } if s.myturn { if s.id == 2 { s.cur-- for s.cur > 0 && s.cards[0][s.cur] == 0 { s.cards[3-s.id][s.cur] = 0 s.cur-- } } } else { if x > s.cur { s.cards[3-s.id][s.cur] = 0 } else { s.cards[3-s.id][s.cur] = x } if s.id == 1 { s.cur-- for s.cur > 0 && s.cards[0][s.cur] == 0 { s.cards[3-s.id][s.cur] = 0 s.cur-- } } } if s.cur == 0 { s.cards[3-s.id][s.m] = s.n for i := 1; i < s.m; i++ { s.cards[3-s.id][s.m] -= max(0, s.cards[3-s.id][i]) } } } func (s *S)guessed(id, ok int) { } func init() { check() } func check() { m := rand.Intn(11-4+1)+4 n := max(2, min(18, (m*(m+1)/2)/3)) n = rand.Intn(n-2+1)+2 println(Sprintf("n=%d,m=%d",n,m)) all := []int{} for i := 1; i <= m; i++ { for j := 0; j < i; j++ { all = append(all, i) } } rand.Shuffle(len(all), func(i, j int) { all[i],all[j] = all[j],all[i] }) cards := [][]int{ make([]int, m+1), make([]int, m+1), make([]int, m+1), make([]int, m+1), } for i := 0; i < 3*n; i++ { c := all[i] cards[0][c]++ cards[i%3+1][c]++ } for i := 1; i <= m; i++ { println(Sprint(i, cards[0][i], cards[1][i], cards[2][i], cards[3][i])) } s1 := newS(1, n, m, cards[1]) s2 := newS(2, n, m, cards[2]) end := 0 for i := 0; i < 3*m; i++ { ask, guess := s1.turn() s2.wait() if len(guess) == 0 { println("ask ", ask) s1.count(ask, cards[0][ask]) s2.count(ask, cards[0][ask]) } else { println("guess ", Sprint(guess...)) ps := make([]int, m+1) for _, g := range guess { ps[g.(int)]++ } ok := 1 for i, p := range ps { if cards[3][i] != p { ok = 0 break } } s1.guessed(s1.id, ok) s2.guessed(s1.id, ok) end |= s1.id * ok if end == (1|2) { println(Sprintf("end %d", i+1)) return } } s1,s2 = s2,s1 } }