package main import "fmt" type Matrix struct { width int height int matrix [][]int } func NewMatrix(width, height int) *Matrix { m := &Matrix{ width: width, height: height, matrix: make([][]int, height), } for i := 0; i < height; i++ { m.matrix[i] = make([]int, width) } return m } func (m *Matrix) Size() (int, int) { return m.width, m.height } func (m *Matrix) At(x, y int) int { return m.matrix[y][x] } func (m *Matrix) Set(x, y, value int) { m.matrix[y][x] = value } func (m *Matrix) Get() [][]int { return m.matrix } func (m *Matrix) Transpose() *Matrix { M := NewMatrix(m.height, m.width) for x := 0; x < m.width; x++ { for y := 0; y < m.height; y++ { M.Set(y, x, m.At(x, y)) } } return M } func (m *Matrix) MirrorX() *Matrix { M := NewMatrix(m.width, m.height) for x := 0; x < m.width; x++ { for y := 0; y < m.height; y++ { M.Set(x, y, m.At((m.width-1)-x, y)) } } return M } func (m *Matrix) MirrorY() *Matrix { M := NewMatrix(m.width, m.height) for x := 0; x < m.width; x++ { for y := 0; y < m.height; y++ { M.Set(x, y, m.At(x, (m.height-1)-y)) } } return M } func (m *Matrix) Mirror() *Matrix { M := NewMatrix(m.width, m.height) for x := 0; x < m.width; x++ { for y := 0; y < m.height; y++ { M.Set(x, y, m.At((m.width-1)-x, (m.height-1)-y)) } } return M } func (m *Matrix) Add(value int) { for x := 0; x < m.width; x++ { for y := 0; y < m.height; y++ { m.matrix[y][x] += value } } } func (m *Matrix) MergeRight(M *Matrix) *Matrix { var maxHeight int if m.height > M.height { maxHeight = m.height } else { maxHeight = M.height } mM := NewMatrix(m.width+M.width, maxHeight) for y := 0; y < m.height; y++ { for x := 0; x < m.width; x++ { mM.Set(x, y, m.At(x, y)) } } for y := 0; y < M.height; y++ { for x := 0; x < M.width; x++ { mM.Set(m.width+x, y, M.At(x, y)) } } return mM } func (m *Matrix) MergeBottom(M *Matrix) *Matrix { var maxWidth int if m.width > M.width { maxWidth = m.width } else { maxWidth = M.width } mM := NewMatrix(maxWidth, m.height+M.height) for y := 0; y < m.height; y++ { for x := 0; x < m.width; x++ { mM.Set(x, y, m.At(x, y)) } } for y := 0; y < M.height; y++ { for x := 0; x < M.width; x++ { mM.Set(x, m.height+y, M.At(x, y)) } } return mM } func (m *Matrix) ToString() string { str := "" for y := 0; y < m.height; y++ { for x := 0; x < m.width; x++ { str += fmt.Sprintf(" %v ", m.At(x, y)) } str += "\n" } return str } func (m *Matrix) Clone() *Matrix { M := NewMatrix(m.width, m.height) for y := 0; y < m.height; y++ { for x := 0; x < m.width; x++ { M.Set(x, y, m.At(x, y)) } } return M }