← Home
For problem statement at 1000-1999/1700-1799/1700-1709/1705/problemF.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1700-1709/1705/verifierF.go ends with Problem F is interactive and cannot be automatically verified. can you fix the verifier? package main

import (
	"fmt"
	"math/rand"
	"os"
)

func expand(v int) uint64 {
	var res uint64
	for i := 0; i < 8; i++ {
		if (v&(1<<i)) != 0 {
			res |= (uint64(1) << (i * 8))
		}
	}
	return res
}

func getColumns() []int {
	r := rand.New(rand.NewSource(1337))
	for {
		cands := r.Perm(255)
		ans := []int{}
		S := make([]uint64, 0, 4096)
		S = append(S, 0)
		seen := make(map[uint64]bool, 4096)
		seen[0] = true

		for i := 0; i < 255; i++ {
			v := cands[i] + 1
			vExp := expand(v)
			conflict := false
			for _, s := range S {
				if seen[s+vExp] {
					conflict = true
					break
				}
			}
			if !conflict {
				ans = append(ans, v)
				n := len(S)
				for j := 0; j < n; j++ {
					newS := S[j] + vExp
					S = append(S, newS)
					seen[newS] = true
				}
				if len(ans) == 12 {
					return ans
				}
			}
		}
	}
}

func query(s []byte) int {
	fmt.Println(string(s))
	var res int
	_, err := fmt.Scan(&res)
	if err != nil {
		os.Exit(0)
	}
	if res == len(s) {
		os.Exit(0)
	}
	return res
}

func main() {
	var n int
	if _, err := fmt.Scan(&n); err != nil {
		return
	}

	baseline := make([]byte, n)
	for i := 0; i < n; i++ {
		baseline[i] = 'F'
	}
	S0 := query(baseline)

	cols := getColumns()
	lookup := make(map[uint64]int)
	for x := 0; x < 4096; x++ {
		var sum uint64
		for c := 0; c < 12; c++ {
			if (x&(1<<c)) != 0 {
				sum += expand(cols[c])
			}
		}
		lookup[sum] = x
	}

	ans := make([]byte, n)
	blocks := n / 12
	for b := 0; b < blocks; b++ {
		start := b * 12
		var V [8]int
		for q := 0; q < 8; q++ {
			qs := make([]byte, n)
			copy(qs, baseline)
			flipped := 0
			for c := 0; c < 12; c++ {
				if (cols[c]&(1<<q)) != 0 {
					qs[start+c] = 'T'
					flipped++
				}
			}
			Sq := query(qs)
			diff := Sq - S0
			V[q] = (diff + flipped) / 2
		}

		var sum uint64
		for q := 0; q < 8; q++ {
			sum |= (uint64(V[q]) << (q * 8))
		}

		x := lookup[sum]
		for c := 0; c < 12; c++ {
			if (x&(1<<c)) != 0 {
				ans[start+c] = 'T'
			} else {
				ans[start+c] = 'F'
			}
		}
	}

	remStart := blocks * 12
	for i := remStart; i < n; i++ {
		qs := make([]byte, n)
		copy(qs, baseline)
		qs[i] = 'T'
		Sq := query(qs)
		diff := Sq - S0
		if diff == 1 {
			ans[i] = 'T'
		} else {
			ans[i] = 'F'
		}
	}

	query(ans)
}