package main import ( . "fmt" . "math/rand" . "sort" ) func main() { perms := [][]int{} for a := 0; a < 5; a++ { for b := 0; b < 5; b++ { if a == b { continue } for c := 0; c < 5; c++ { if a == c || b == c { continue } for d := 0; d < 5; d++ { if a == d || b == d || c == d { continue } for e := 0; e < 5; e++ { if a == e || b == e || c == e || d == e { continue } perms = append(perms, []int{a, b, c, d, e}) } } } } } Shuffle(len(perms), func(i, j int) { perms[i], perms[j] = perms[j], perms[i] }) xxs := [][]int{} for a := 0; a <= 9; a++ { for b := a + 1; b <= 9; b++ { for c := b + 1; c <= 9; c++ { for d := c + 1; d <= 9; d++ { for e := d + 1; e <= 9; e++ { xs := []int{a, b, c, d, e} xxs = append(xxs, xs) } } } } } Shuffle(len(xxs), func(i, j int) { xxs[i], xxs[j] = xxs[j], xxs[i] }) score := map[int]int{} for xxi, xs := range xxs { ccc := make([]int, 60) omits := [][]int{} tried := map[int]bool{} for pi, p := range perms { ok := true for _, omp := range omits { for i, pp := range p { if omp[i] == pp { ok = false break } } } if !ok { continue } num := 0 for _, j := range p { num = num*10 + xs[j] } if tried[num] { continue } tried[num] = true for _, j := range p { Print(xs[j]) } Println() fin := false cnt := 0 mm := make([]int, 60) for i := 0; i < 30; i++ { var hi, bi int Scan(&hi, &bi) if i == 0 && hi == 5 && bi == 0 { fin = true } if pi == 0 { ccc[hi+bi]++ } mm[hi*10+bi]++ if hi != 5 && hi+bi == 5 { cnt++ } } if fin { return } if cnt == 0 { break } if cnt == 1 && mm[5] > 0 { omits = append(omits, p) } if cnt > 0 && mm[32] > 0 { if ret := hb32(tried, xs, p, cnt); ret == 1 { return } else if ret == 2 { break } } else if cnt > 0 && mm[14] > 0 { tperms := perms[pi+1:] Slice(tperms, func(i, j int) bool { var c1, c2 int for k, v := range tperms[i] { if p[k] == v { c1++ } } for k, v := range tperms[j] { if p[k] == v { c2++ } } if c1 != 1 { c1 = 0 } if c2 != 1 { c2 = 0 } return c1 > c2 }) } else if cnt > 0 && mm[23] > 0 { tperms := perms[pi+1:] Slice(tperms, func(i, j int) bool { var c1, c2 int for k, v := range tperms[i] { if p[k] == v { c1++ } } for k, v := range tperms[j] { if p[k] == v { c2++ } } if c1 != 2 { c1 = 0 } if c2 != 2 { c2 = 0 } return c1 > c2 }) } } { nnn := make([]int, 10) for _, x := range xs { nnn[x]++ } txxs := xxs[xxi+1:] for i := range txxs { var c1, k1 int for _, x := range txxs[i] { c1 += nnn[x] k1 = k1*10 + x } if c1 == 0 { score[k1] += (ccc[0]*2-1)*20000 } else if ccc[c1] > 0 { score[k1]++ } else { score[k1] -= 20000 } } Slice(txxs, func(i, j int) bool { var k1, k2 int for _, x := range txxs[i] { k1 = k1*10 + x } for _, x := range txxs[j] { k2 = k2*10 + x } return score[k1] > score[k2] }) } } } func hb32(tried map[int]bool, xs, p []int, cnt0 int) (ret int) { omit := make([]bool, 10) for i := 0; i < 5; i++ { if omit[i] { continue } for j := i+1; j < 5; j++ { if omit[j] { continue } ys := make([]int, len(xs)) for u, v := range p { ys[u] = xs[v] } ys[i], ys[j] = ys[j], ys[i] num := 0 for _, y := range ys { num = num*10 + y } if tried[num] { continue } tried[num] = true for _, y := range ys { Print(y) } Println() fin := false cnt := 0 mm := make([]int, 60) for k := 0; k < 30; k++ { var hi, bi int Scan(&hi, &bi) if k == 0 && hi == 5 && bi == 0 { fin = true } mm[hi*10+bi]++ if hi != 5 && hi+bi == 5 { cnt++ } } if fin { ret = 1 return } if cnt == 0 { ret = 2 return } if cnt < cnt0 { ret = -cnt return } if mm[14] > 0 { omit[j] = true break } } } return }