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)
}