← Home
For problem statement at 0-999/700-799/750-759/753/problemC.txt this is a correct solution, but verifier at 0-999/700-799/750-759/753/verifierC.go ends with All tests passed can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"math/bits"
	"os"
)

func main() {
	all := make([]string, 0, 5040)
	masks := make([]uint16, 0, 5040)

	for d0 := 0; d0 <= 9; d0++ {
		for d1 := 0; d1 <= 9; d1++ {
			if d1 == d0 {
				continue
			}
			for d2 := 0; d2 <= 9; d2++ {
				if d2 == d0 || d2 == d1 {
					continue
				}
				for d3 := 0; d3 <= 9; d3++ {
					if d3 == d0 || d3 == d1 || d3 == d2 {
						continue
					}
					s := []byte{byte('0' + d0), byte('0' + d1), byte('0' + d2), byte('0' + d3)}
					all = append(all, string(s))
					var m uint16
					m |= (uint16(1) << uint(d0))
					m |= (uint16(1) << uint(d1))
					m |= (uint16(1) << uint(d2))
					m |= (uint16(1) << uint(d3))
					masks = append(masks, m)
				}
			}
		}
	}

	N := len(all)
	codes := make([]byte, N*N)
	for i := 0; i < N; i++ {
		si := all[i]
		mi := masks[i]
		base := i * N
		for j := 0; j < N; j++ {
			sj := all[j]
			b := 0
			if si[0] == sj[0] {
				b++
			}
			if si[1] == sj[1] {
				b++
			}
			if si[2] == sj[2] {
				b++
			}
			if si[3] == sj[3] {
				b++
			}
			m := bits.OnesCount16(mi & masks[j])
			c := m - b
			codes[base+j] = byte(b*5 + c)
		}
	}

	cands := make([]int, N)
	for i := 0; i < N; i++ {
		cands[i] = i
	}

	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	counts := make([]int, 25)

	for attempt := 0; attempt < 7; attempt++ {
		var guessIdx int
		if len(cands) == 1 {
			guessIdx = cands[0]
		} else {
			bestScore := int(1 << 30)
			bestIdx := cands[0]
			for _, g := range cands {
				for k := 0; k < 25; k++ {
					counts[k] = 0
				}
				gb := g * N
				for _, s := range cands {
					counts[codes[gb+s]]++
				}
				maxv := 0
				for k := 0; k < 25; k++ {
					if counts[k] > maxv {
						maxv = counts[k]
					}
				}
				if maxv < bestScore {
					bestScore = maxv
					bestIdx = g
				}
			}
			guessIdx = bestIdx
		}

		fmt.Fprintln(writer, all[guessIdx])
		writer.Flush()

		var bulls, cows int
		_, err := fmt.Fscan(reader, &bulls, &cows)
		if err != nil {
			return
		}
		if bulls == 4 {
			return
		}

		want := byte(bulls*5 + cows)
		gb := guessIdx * N
		newCands := newSlice(len(cands))
		for _, s := range cands {
			if codes[gb+s] == want {
				newCands = append(newCands, s)
			}
		}
		cands = newCands
		if len(cands) == 0 {
			return
		}
	}
}

func newSlice(n int) []int {
	if n < 0 {
		n = 0
	}
	return make([]int, 0, n)
}
```