/
math.go
113 lines (104 loc) · 2.19 KB
/
math.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package utils
import "github.com/0xVanfer/types"
// Get the minimum one of the input numbers.
//
// Example:
//
// Min(1, 2, 3) = 1
// Min[int]() = 0
// Min([]int{2, 3, 4}...) = 2
func Min[T types.OrderedNumber](numbers ...T) T {
if len(numbers) == 0 {
return 0
}
if len(numbers) == 1 {
return numbers[0]
}
var min T = numbers[0]
for _, number := range numbers {
if number < min {
min = number
}
}
return min
}
// Get the maximum one of the input numbers.
//
// Example:
//
// Max(1, 2, 3) = 3
// Max[int]() = 0
// Max([]int{2, 3, 4}...) = 4
func Max[T types.OrderedNumber](numbers ...T) T {
if len(numbers) == 0 {
return 0
}
if len(numbers) == 1 {
return numbers[0]
}
var max T = numbers[0]
for _, number := range numbers {
if number > max {
max = number
}
}
return max
}
// Get the medium number.
func Medium[T types.OrderedNumber](numbers ...T) float64 {
numbers = SortSimple(true, numbers...)
if len(numbers) == 0 {
return 0
}
if len(numbers)%2 == 1 {
return types.ToFloat64(numbers[len(numbers)/2])
} else {
return (types.ToFloat64(numbers[len(numbers)/2-1]) + types.ToFloat64(numbers[len(numbers)/2])) / 2
}
}
// Get the mode(math).
func Mode[T types.OrderedNumber](numbers ...T) []T {
if len(numbers) <= 1 {
return numbers
}
mapp := make(map[T]int64)
for _, num := range numbers {
if mapp[num] == 0 {
mapp[num] = 1
} else {
mapp[num] += 1
}
}
numberList, timesList := SortSimpleMap(false, mapp)
if len(timesList) == 0 {
return []T{}
}
maxTime := timesList[0]
var res []T
for i := range numberList {
if timesList[i] == maxTime {
res = append(res, numberList[i])
}
}
return SortSimple(true, res...)
}
// Get the sum.
func Sum[T types.OrderedNumber](numbers ...T) T {
var res T
for _, num := range numbers {
res += num
}
return res
}
func Mean[T types.OrderedNumber](numbers ...T) float64 {
return types.ToFloat64(Sum(numbers...)) / float64(len(numbers))
}
func Variance[T types.OrderedNumber](numbers ...T) float64 {
mean := Mean(numbers...)
sumSquaredDifferences := 0.0
for _, value := range numbers {
diff := float64(value) - mean
sumSquaredDifferences += diff * diff
}
return sumSquaredDifferences / float64(len(numbers))
}