For problem statement at 1000-1999/1600-1699/1610-1619/1617/problemD2.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1610-1619/1617/verifierD2.go ends with Problem D2 is interactive and cannot be automatically verified. can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var t int
fmt.Fscan(reader, &t)
for tc := 0; tc < t; tc++ {
var n int
fmt.Fscan(reader, &n)
ask := func(x, y, z int) int {
fmt.Fprintf(writer, "? %d %d %d\n", x, y, z)
writer.Flush()
var res int
fmt.Fscan(reader, &res)
return res
}
ans := make([]int, n/3+1)
groupA := -1
groupB := -1
for i := 1; i <= n/3; i++ {
ans[i] = ask(3*i-2, 3*i-1, 3*i)
if ans[i] == 0 {
groupA = i
} else {
groupB = i
}
}
a1, a2, a3 := 3*groupA-2, 3*groupA-1, 3*groupA
b1, b2, b3 := 3*groupB-2, 3*groupB-1, 3*groupB
w1 := ask(a2, a3, b1)
var I, C int
if w1 == 1 {
I, C = a1, b1
} else {
w2 := ask(a3, b1, b2)
if w2 == 1 {
I, C = a2, b2
} else {
I, C = a3, b3
}
}
isImpostor := make([]bool, n+1)
isImpostor[I] = true
isImpostor[C] = false
for _, p := range []int{a1, a2, a3, b1, b2, b3} {
if p != I && p != C {
res := ask(I, C, p)
if res == 0 {
isImpostor[p] = true
} else {
isImpostor[p] = false
}
}
}
for i := 1; i <= n/3; i++ {
if i == groupA || i == groupB {
continue
}
x, y, z := 3*i-2, 3*i-1, 3*i
if ans[i] == 0 {
res := ask(C, x, y)
if res == 0 {
isImpostor[x] = true
isImpostor[y] = true
resZ := ask(I, C, z)
isImpostor[z] = (resZ == 0)
} else {
isImpostor[z] = true
resX := ask(I, C, x)
if resX == 0 {
isImpostor[x] = true
isImpostor[y] = false
} else {
isImpostor[x] = false
isImpostor[y] = true
}
}
} else {
res := ask(I, x, y)
if res == 1 {
isImpostor[x] = false
isImpostor[y] = false
resZ := ask(I, C, z)
isImpostor[z] = (resZ == 0)
} else {
isImpostor[z] = false
resX := ask(I, C, x)
if resX == 0 {
isImpostor[x] = true
isImpostor[y] = false
} else {
isImpostor[x] = false
isImpostor[y] = true
}
}
}
}
var impostors []int
for i := 1; i <= n; i++ {
if isImpostor[i] {
impostors = append(impostors, i)
}
}
fmt.Fprintf(writer, "! %d", len(impostors))
for _, p := range impostors {
fmt.Fprintf(writer, " %d", p)
}
fmt.Fprintln(writer)
writer.Flush()
}
}