For problem statement at 0-999/200-299/210-219/217/problemC.txt this is a correct solution, but verifier at 0-999/200-299/210-219/217/verifierC.go ends with test 1: runtime error: exit status 2
stderr: panic: runtime error: index out of range [0] with length 0
goroutine 1 [running]:
main.evaluate({0x0, 0x0}, 0x0)
/tmp/build-2387339114/solution.go:54 +0x3a8
main.main()
/tmp/build-2387339114/solution.go:152 +0x8c
exit status 1 can you fix the verifier? ```go
package main
import (
"bufio"
"fmt"
"os"
)
type Aff struct {
is bool
d byte
p byte
}
func evaluate(f string, val byte) byte {
var vals []byte
var ops []rune
for i := 0; i < len(f); i++ {
c := f[i]
if c == '0' || c == '1' {
vals = append(vals, c-'0')
} else if c == '?' {
vals = append(vals, val)
} else if c == '(' {
} else if c == '|' || c == '&' || c == '^' {
ops = append(ops, rune(c))
} else if c == ')' {
op := ops[len(ops)-1]
ops = ops[:len(ops)-1]
right := vals[len(vals)-1]
vals = vals[:len(vals)-1]
left := vals[len(vals)-1]
vals = vals[:len(vals)-1]
var res byte
switch op {
case '^':
res = left ^ right
case '&':
if left == 1 && right == 1 {
res = 1
} else {
res = 0
}
case '|':
if left == 1 || right == 1 {
res = 1
} else {
res = 0
}
}
vals = append(vals, res)
}
}
return vals[0]
}
func getAff(f string) Aff {
var vals []Aff
var ops []rune
for i := 0; i < len(f); i++ {
c := f[i]
if c == '0' {
vals = append(vals, Aff{true, 0, 0})
} else if c == '1' {
vals = append(vals, Aff{true, 1, 0})
} else if c == '?' {
vals = append(vals, Aff{true, 0, 1})
} else if c == '(' {
} else if c == '|' || c == '&' || c == '^' {
ops = append(ops, rune(c))
} else if c == ')' {
op := ops[len(ops)-1]
ops = ops[:len(ops)-1]
right := vals[len(vals)-1]
vals = vals[:len(vals)-1]
left := vals[len(vals)-1]
vals = vals[:len(vals)-1]
var res Aff
if !left.is || !right.is {
res = Aff{false, 0, 0}
} else {
switch op {
case '^':
d := left.d ^ right.d
p := left.p ^ right.p
res = Aff{true, d, p}
case '&':
if left.p != 0 && right.p != 0 {
res = Aff{false, 0, 0}
} else {
var d, p byte
if left.p == 0 {
if left.d == 0 {
d = 0
p = 0
} else {
d = right.d
p = right.p
}
} else {
if right.d == 0 {
d = 0
p = 0
} else {
d = left.d
p = left.p
}
}
res = Aff{true, d, p}
}
case '|':
if left.p != 0 && right.p != 0 {
res = Aff{false, 0, 0}
} else {
var d, p byte
if left.p == 0 {
dl := left.d
dr := right.d
d = dl ^ dr ^ (dl & dr)
coeff := byte(1) ^ dl
if coeff == 1 {
p = right.p
} else {
p = 0
}
} else {
dr := right.d
dl := left.d
d = dl ^ dr ^ (dl & dr)
coeff := byte(1) ^ dr
if coeff == 1 {
p = left.p
} else {
p = 0
}
}
res = Aff{true, d, p}
}
}
}
vals = append(vals, res)
}
}
return vals[0]
}
func main() {
sc := bufio.NewScanner(os.Stdin)
sc.Scan()
sc.Scan()
formula := sc.Text()
v0 := evaluate(formula, 0)
v1 := evaluate(formula, 1)
if v0 != v1 {
fmt.Println("YES")
} else {
aff := getAff(formula)
if aff.is {
fmt.Println("NO")
} else {
fmt.Println("YES")
}
}
}
```