package main import ( "bufio" "fmt" "os" "regexp" "strconv" ) //Statement is a representation of a string asignment type Statement struct { Variable string Number int IsQuery bool Reverse bool } func main() { statements := scanner() state := map[string]int{} for _, statement := range statements { if statement.IsQuery { if statement.Reverse { fmt.Printf("%d=%s\n", state[statement.Variable], statement.Variable) } else { fmt.Printf("%s=%d\n", statement.Variable, state[statement.Variable]) } } else { state[statement.Variable] = statement.Number } } } func scanner() []Statement { scanner := bufio.NewScanner(os.Stdin) statements := []Statement{} for scanner.Scan() { statements = append(statements, parseStatement(scanner.Text())) } return statements } func parseStatement(s string) Statement { re := regexp.MustCompile("[0-9]+") sre := regexp.MustCompile("[A-z]") qre := regexp.MustCompile("[?]") num := re.FindString(s) questionMarkIndex := qre.FindStringIndex(s) variableName := sre.FindString(s) variableIndex := sre.FindStringIndex(s) if num == "" { return Statement{ Variable: variableName, IsQuery: true, Reverse: variableIndex[0] > questionMarkIndex[0], } } n, err := strconv.Atoi(num) if err != nil { panic(err) } statement := Statement{ Variable: variableName, Number: n, } return statement }