diff options
Diffstat (limited to 'math')
-rw-r--r-- | math/doc.go | 2 | ||||
-rw-r--r-- | math/mimax.go | 63 | ||||
-rw-r--r-- | math/minmax_test.go | 58 |
3 files changed, 123 insertions, 0 deletions
diff --git a/math/doc.go b/math/doc.go new file mode 100644 index 0000000..1d3cbf5 --- /dev/null +++ b/math/doc.go @@ -0,0 +1,2 @@ +// Пакет с математическими функциями над обобщенными типами +package math diff --git a/math/mimax.go b/math/mimax.go new file mode 100644 index 0000000..546afba --- /dev/null +++ b/math/mimax.go @@ -0,0 +1,63 @@ +package math + +import "go.neonxp.dev/extra/utils" + +// MinScalar возвращает минимальное из переданных скалярных значений +func MinScalar[T utils.Scalar](a ...T) T { + i := -1 + for j, v := range a { + if i == -1 { + i = j + continue + } + if v < a[i] { + i = j + } + } + return a[i] +} + +// MaxScalar возвращает максимальное из переданных скалярных значений +func MaxScalar[T utils.Scalar](a ...T) T { + i := -1 + for j, v := range a { + if i == -1 { + i = j + continue + } + if v > a[i] { + i = j + } + } + return a[i] +} + +// Min возвращает минимальное из переданных Sortable значений +func Min[T utils.Sortable[T]](a ...T) T { + i := -1 + for j, v := range a { + if i == -1 { + i = j + continue + } + if v.Less(a[i]) { + i = j + } + } + return a[i] +} + +// Max возвращает максимальное из переданных Sortable значений +func Max[T utils.Sortable[T]](a ...T) T { + i := -1 + for j, v := range a { + if i == -1 { + i = j + continue + } + if a[i].Less(v) { + i = j + } + } + return a[i] +} diff --git a/math/minmax_test.go b/math/minmax_test.go new file mode 100644 index 0000000..00211e2 --- /dev/null +++ b/math/minmax_test.go @@ -0,0 +1,58 @@ +package math + +import ( + "reflect" + "testing" +) + +func TestMin(t *testing.T) { + type args struct { + a []int + } + tests := []struct { + name string + args args + want int + }{ + { + name: "test1", + args: args{ + a: []int{8, 3, 6}, + }, + want: 3, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := MinScalar(tt.args.a...); !reflect.DeepEqual(got, tt.want) { + t.Errorf("Min() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestMax(t *testing.T) { + type args struct { + a []int + } + tests := []struct { + name string + args args + want int + }{ + { + name: "test1", + args: args{ + a: []int{8, 13, 6}, + }, + want: 13, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := MaxScalar(tt.args.a...); !reflect.DeepEqual(got, tt.want) { + t.Errorf("Max() = %v, want %v", got, tt.want) + } + }) + } +} |