For problem statement at 0-999/400-499/400-409/409/problemI.txt this is a correct solution, but verifier at 0-999/400-499/400-409/409/verifierI.go ends with test 1 failed: expected "" got "false"
exit status 1 can you fix the verifier? ```go
package main
import (
"bufio"
"fmt"
"os"
"regexp"
"strconv"
"strings"
)
var tokens []string
func tokenize(s string) []string {
var toks []string
i := 0
opList := []string{
"=:=", "=\\=", "\\==", "\\=", "=<", ">=", "<=", "==", "is",
"<", ">", "=", "+", "-", "*", "/", "mod", ";", ",", "\\+", "not",
}
for i < len(s) {
c := s[i]
if c == ' ' || c == '\t' || c == '\n' || c == '\r' {
i++
continue
}
if c == '(' || c == ')' {
toks = append(toks, string(c))
i++
continue
}
matchedOp := ""
for _, op := range opList {
if strings.HasPrefix(s[i:], op) {
if op == "mod" || op == "is" || op == "not" {
if i+len(op) < len(s) && isAlphaNum(rune(s[i+len(op)])) {
continue
}
}
if len(op) > len(matchedOp) {
matchedOp = op
}
}
}
if matchedOp != "" {
toks = append(toks, matchedOp)
i += len(matchedOp)
continue
}
if isAlphaNum(rune(c)) {
start := i
for i < len(s) && isAlphaNum(rune(s[i])) {
i++
}
toks = append(toks, s[start:i])
continue
}
toks = append(toks, string(c))
i++
}
return toks
}
func isAlphaNum(c rune) bool {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_'
}
func isNumber(s string) bool {
for _, c := range s {
if c < '0' || c > '9' {
return false
}
}
return true
}
func isVariable(s string) bool {
if len(s) == 0 {
return false
}
c := s[0]
return (c >= 'A' && c <= 'Z') || c == '_'
}
type Expr interface {
Eval(env map[string]int) int
}
type VarExpr struct{ Name string }
func (e VarExpr) Eval(env map[string]int) int { return env[e.Name] }
type NumExpr struct{ Val int }
func (e NumExpr) Eval(env map[string]int) int { return e.Val }
type BoolExpr struct{ Val int }
func (e BoolExpr) Eval(env map[string]int) int { return e.Val }
type UnaryExpr struct {
Op string
Expr Expr
}
func (e UnaryExpr) Eval(env map[string]int) int {
if e.Expr == nil {
return 0
}
val := e.Expr.Eval(env)
switch e.Op {
case "-":
return -val
case "+":
return val
case "\\+", "not":
if val == 0 {
return 1
}
return 0
}
return 0
}
type BinaryExpr struct {
Left Expr
Op string
Right Expr
}
func (e BinaryExpr) Eval(env map[string]int) int {
if e.Left == nil || e.Right == nil {
return 0
}
if e.Op == "," {
if e.Left.Eval(env) == 0 {
return 0
}
if e.Right.Eval(env) == 0 {
return 0
}
return 1
}
if e.Op == ";" {
if e.Left.Eval(env) != 0 {
return 1
}
if e.Right.Eval(env) != 0 {
return 1
}
return 0
}
l := e.Left.Eval(env)
r := e.Right.Eval(env)
switch e.Op {
case "<":
if l < r {
return 1
}
return 0
case ">":
if l > r {
return 1
}
return 0
case "=<", "<=":
if l <= r {
return 1
}
return 0
case ">=":
if l >= r {
return 1
}
return 0
case "=:=", "=", "==", "is":
if l == r {
return 1
}
return 0
case "=\\=", "\\=", "\\==":
if l != r {
return 1
}
return 0
case "+":
return l + r
case "-":
return l - r
case "*":
return l * r
case "/":
if r == 0 {
return 0
}
return l / r
case "mod":
if r == 0 {
return 0
}
return l % r
}
return 0
}
func getPrecedence(op string) int {
switch op {
case ";":
return 1
case ",":
return 2
case "<", ">", "=<", ">=", "<=", "=:=", "=\\=", "=", "\\=", "==", "\\==", "is":
return 3
case "+", "-":
return 4
case "*", "/", "mod":
return 5
}
return 0
}
func parsePrefix(tok string) Expr {
if tok == "(" {
e := parseExpr(0)
if len(tokens) > 0 && tokens[0] == ")" {
tokens = tokens[1:]
}
return e
}
if tok == "-" || tok == "+" || tok == "\\+" || tok == "not" {
e := parseExpr(6)
return UnaryExpr{Op: tok, Expr: e}
}
if isNumber(tok) {
val, _ := strconv.Atoi(tok)
return NumExpr{Val: val}
}
if isVariable(tok) {
return VarExpr{Name: tok}
}
if tok == "true" {
return BoolExpr{Val: 1}
}
if tok == "false" || tok == "fail" {
return BoolExpr{Val: 0}
}
return nil
}
func parseExpr(precedence int) Expr {
if len(tokens) == 0 {
return nil
}
tok := tokens[0]
tokens = tokens[1:]
left := parsePrefix(tok)
for len(tokens) > 0 {
op := tokens[0]
prec := getPrecedence(op)
if prec == 0 || prec <= precedence {
break
}
tokens = tokens[1:]
right := parseExpr(prec)
left = BinaryExpr{Left: left, Op: op, Right: right}
}
return left
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
buf := make([]byte, 4096)
scanner.Buffer(buf, 4096)
if !scanner.Scan() {
return
}
s := scanner.Text()
s = strings.TrimSpace(s)
if strings.HasSuffix(s, ".") {
s = s[:len(s)-1]
}
re := regexp.MustCompile(`^golorp\s*\(([^)]*)\)(?:\s*:-\s*(.*))?$`)
match := re.FindStringSubmatch(s)
if match == nil {
fmt.Println("false")
return
}
varNamesStr := strings.TrimSpace(match[1])
var varNames []string
if varNamesStr != "" {
parts := strings.Split(varNamesStr, ",")
for _, p := range parts {
varNames = append(varNames, strings.TrimSpace(p))
}
}
bodyStr := strings.TrimSpace(match[2])
var bodyExpr Expr
if bodyStr != "" {
tokens = tokenize(bodyStr)
bodyExpr = parseExpr(0)
}
n := len(varNames)
if n == 0 {
if bodyExpr == nil || bodyExpr.Eval(nil) != 0 {
fmt.Println("")
} else {
fmt.Println("false")
}
return
}
vals := make([]int, n)
found := false
for {
env := make(map[string]int)
valid := true
for i, vName := range varNames {
if vName == "_" {
continue
}
if existing, ok := env[vName]; ok {
if existing != vals[i] {
valid = false
break
}
} else {
env[vName] = vals[i]
}
}
if valid {
if bodyExpr == nil || bodyExpr.Eval(env) != 0 {
found = true
break
}
}
idx := n - 1
for idx >= 0 {
vals[idx]++
if vals[idx] > 9 {
vals[idx] = 0
idx--
} else {
break
}
}
if idx < 0 {
break
}
}
if found {
res := ""
for _, v := range vals {
res += strconv.Itoa(v)
}
fmt.Println(res)
} else {
fmt.Println("false")
}
}
```