40 lines
948 B
Go
40 lines
948 B
Go
package pythagorean
|
|
|
|
import "math"
|
|
|
|
type Triplet [3]int
|
|
|
|
func isTriplet(a, b, c int) bool {
|
|
return a*a + b*b == c*c && a < b && b < c
|
|
}
|
|
|
|
func Range(min, max int) []Triplet {
|
|
var triplets = []Triplet{}
|
|
for c := min; c <= max; c++ {
|
|
for b := min; b <= c - 1; b++ {
|
|
a := int(math.Sqrt(float64(c*c - b*b)))
|
|
|
|
if isTriplet(a, b, c) && a >= min {
|
|
triplets = append(triplets, Triplet{a,b,c})
|
|
}
|
|
}
|
|
}
|
|
return triplets
|
|
}
|
|
|
|
func Sum(p int) []Triplet {
|
|
temp_triplets := Range(1, p / 2)
|
|
triplets := make([]Triplet, 0, len(temp_triplets))
|
|
|
|
for _, triplet := range temp_triplets {
|
|
if triplet[0] + triplet[1] + triplet[2] == p {
|
|
triplets = append(triplets, triplet)
|
|
}
|
|
}
|
|
// Reverse slice..
|
|
for i, j := 0, len(triplets)-1; i < j; i, j = i+1, j-1 {
|
|
triplets[i], triplets[j] = triplets[j], triplets[i]
|
|
}
|
|
return triplets
|
|
}
|