/ parse.go
parse.go
1 package main 2 3 import ( 4 "fmt" 5 "strconv" 6 "strings" 7 ) 8 9 func parseEquation(input string) (polynom, polynom, error) { 10 polynoms := strings.Split(input, "=") 11 if len(polynoms) != 2 { 12 return polynom{}, polynom{}, fmt.Errorf("invalid equation") 13 } 14 polynom1, err := parsePolynom(polynoms[0]) 15 if err != nil { 16 return polynom{}, polynom{}, err 17 } 18 polynom2, err := parsePolynom(polynoms[1]) 19 if err != nil { 20 return polynom{}, polynom{}, err 21 } 22 return polynom1, polynom2, nil 23 } 24 25 func parsePolynom(input string) (polynom, error) { 26 var p polynom 27 parts := strings.Split(input, " ") 28 29 for i := range parts { 30 if parts[i] != "*" || i+1 >= len(parts) || !strings.HasPrefix(parts[i+1], "X^") { 31 continue 32 } 33 34 coefficient := 0.0 35 if i > 0 { 36 coefficient, _ = strconv.ParseFloat(parts[i-1], 64) 37 } 38 39 if i >= 2 && parts[i-2] == "-" { 40 coefficient = -coefficient 41 } 42 43 power := parsePower(parts[i+1]) 44 45 switch power { 46 case 0: 47 p.constant = coefficient 48 case 1: 49 p.linear = coefficient 50 case 2: 51 p.square = coefficient 52 default: 53 return polynom{}, fmt.Errorf("unsupported degree %d, I can't solve", power) 54 } 55 } 56 57 return p, nil 58 } 59 60 func parsePower(s string) int { 61 if !strings.HasPrefix(s, "X^") { 62 return 0 63 } 64 power, err := strconv.Atoi(strings.TrimPrefix(s, "X^")) 65 if err != nil { 66 return 0 67 } 68 return power 69 }