exercism/go/saddle-points/saddle.go

72 lines
1.3 KiB
Go

package matrix
import (
"errors"
"strconv"
"strings"
)
// Matrix is a grid of ints
type Matrix struct {
vals [][]int
}
type Pair [2]int
// New creates a new Matrix from a string of numbers
func New(in string) (*Matrix, error) {
ret := Matrix{}
rows := strings.Split(in, "\n")
for i := range rows {
flds := strings.Fields(rows[i])
var ints []int
for j := range flds {
if v, err := strconv.Atoi(flds[j]); err != nil {
return &ret, err
} else {
ints = append(ints, v)
}
}
ret.vals = append(ret.vals, ints)
}
numInRow := -1
for i := range ret.vals {
if numInRow != -1 {
if len(ret.vals[i]) != numInRow {
return &ret, errors.New("All rows must be equal length")
}
}
numInRow = len(ret.vals[i])
}
return &ret, nil
}
// Saddle finds all Saddle Points in the matrix
func (m *Matrix) Saddle() []Pair {
var ret []Pair
for i := range m.vals {
for j := range m.vals[i] {
val := m.vals[i][j]
// Check if i,j is a saddle point
// (Highest in row, lowest in col)
colTest, rowTest := true, true
for k := range m.vals {
if m.vals[k][j] < val {
colTest = false
break
}
}
for k := range m.vals[i] {
if m.vals[i][k] > val {
rowTest = false
break
}
}
if colTest && rowTest {
ret = append(ret, Pair{i, j})
}
}
}
return ret
}