/ 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  }