From 9fcf8e29214210612d545bed50d7f889800ac639 Mon Sep 17 00:00:00 2001 From: Alexander Kiryukhin Date: Sun, 1 May 2022 21:50:12 +0300 Subject: Initial --- math/doc.go | 2 ++ math/mimax.go | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ math/minmax_test.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 math/doc.go create mode 100644 math/mimax.go create mode 100644 math/minmax_test.go (limited to 'math') 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) + } + }) + } +} -- cgit v1.2.3