package main import ( \x09"bufio" \x09"fmt" \x09"os" \x09"regexp" \x09"strconv" ) //Statement is a representation of a string asignment type Statement struct { \x09Variable string \x09Number int \x09IsQuery bool \x09Reverse bool } func main() { \x09statements := scanner() \x09state := map[string]int{} \x09for _, statement := range statements { \x09\x09if statement.IsQuery { \x09\x09\x09if statement.Reverse { \x09\x09\x09\x09fmt.Printf("%d=%s\n", state[statement.Variable], statement.Variable) \x09\x09\x09} else { \x09\x09\x09\x09fmt.Printf("%s=%d\n", statement.Variable, state[statement.Variable]) \x09\x09\x09} \x09\x09} else { \x09\x09\x09state[statement.Variable] = statement.Number \x09\x09} \x09} } func scanner() []Statement { \x09scanner := bufio.NewScanner(os.Stdin) \x09statements := []Statement{} \x09for scanner.Scan() { \x09\x09statements = append(statements, parseStatement(scanner.Text())) \x09} \x09return statements } func parseStatement(s string) Statement { \x09re := regexp.MustCompile("[0-9]+") \x09sre := regexp.MustCompile("[A-z]") \x09qre := regexp.MustCompile("[?]") \x09num := re.FindString(s) \x09questionMarkIndex := qre.FindStringIndex(s) \x09variableName := sre.FindString(s) \x09variableIndex := sre.FindStringIndex(s) \x09if num == "" { \x09\x09return Statement{ \x09\x09\x09Variable: variableName, \x09\x09\x09IsQuery: true, \x09\x09\x09Reverse: variableIndex[0] > questionMarkIndex[0], \x09\x09} \x09} \x09n, err := strconv.Atoi(num) \x09if err != nil { \x09\x09panic(err) \x09} \x09statement := Statement{ \x09\x09Variable: variableName, \x09\x09Number: n, \x09} \x09return statement }
Note that non-ascii characters in the above source code will be escaped (such as \x9f).