← Home
```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")
	}
}
```