feat: valid sudoku
This commit is contained in:
46
pkg/valid_sudoku/main.go
Normal file
46
pkg/valid_sudoku/main.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package valid_sudoku
|
||||
|
||||
type Multiset map[byte]bool
|
||||
|
||||
func (m Multiset) Add(b byte) bool {
|
||||
if b == '.' {
|
||||
return true
|
||||
}
|
||||
|
||||
exists := m[b]
|
||||
m[b] = true
|
||||
return !exists
|
||||
}
|
||||
|
||||
func IsValidSudoku(board [][]byte) bool {
|
||||
for i := range 3 {
|
||||
for j := range 3 {
|
||||
box := Multiset{}
|
||||
|
||||
for x := range 3 {
|
||||
for y := range 3 {
|
||||
if !box.Add(board[3*j+y][3*i+x]) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for i := range 9 {
|
||||
row := Multiset{}
|
||||
column := Multiset{}
|
||||
|
||||
for j := range 9 {
|
||||
if !row.Add(board[i][j]) {
|
||||
return false
|
||||
}
|
||||
|
||||
if !column.Add(board[j][i]) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
56
pkg/valid_sudoku/main_test.go
Normal file
56
pkg/valid_sudoku/main_test.go
Normal file
@@ -0,0 +1,56 @@
|
||||
package valid_sudoku_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.maximhutz.com/practice/pkg/valid_sudoku"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func Test1(t *testing.T) {
|
||||
board := [][]byte{
|
||||
{'5', '3', '.', '.', '7', '.', '.', '.', '.'},
|
||||
{'6', '.', '.', '1', '9', '5', '.', '.', '.'},
|
||||
{'.', '9', '8', '.', '.', '.', '.', '6', '.'},
|
||||
{'8', '.', '.', '.', '6', '.', '.', '.', '3'},
|
||||
{'4', '.', '.', '8', '.', '3', '.', '.', '1'},
|
||||
{'7', '.', '.', '.', '2', '.', '.', '.', '6'},
|
||||
{'.', '6', '.', '.', '.', '.', '2', '8', '.'},
|
||||
{'.', '.', '.', '4', '1', '9', '.', '.', '5'},
|
||||
{'.', '.', '.', '.', '8', '.', '.', '7', '9'},
|
||||
}
|
||||
|
||||
assert.True(t, valid_sudoku.IsValidSudoku(board))
|
||||
}
|
||||
|
||||
func Test2(t *testing.T) {
|
||||
board := [][]byte{
|
||||
{'8', '3', '.', '.', '7', '.', '.', '.', '.'},
|
||||
{'6', '.', '.', '1', '9', '5', '.', '.', '.'},
|
||||
{'.', '9', '8', '.', '.', '.', '.', '6', '.'},
|
||||
{'8', '.', '.', '.', '6', '.', '.', '.', '3'},
|
||||
{'4', '.', '.', '8', '.', '3', '.', '.', '1'},
|
||||
{'7', '.', '.', '.', '2', '.', '.', '.', '6'},
|
||||
{'.', '6', '.', '.', '.', '.', '2', '8', '.'},
|
||||
{'.', '.', '.', '4', '1', '9', '.', '.', '5'},
|
||||
{'.', '.', '.', '.', '8', '.', '.', '7', '9'},
|
||||
}
|
||||
|
||||
assert.False(t, valid_sudoku.IsValidSudoku(board))
|
||||
}
|
||||
|
||||
func Test3(t *testing.T) {
|
||||
board := [][]byte{
|
||||
{'.', '.', '.', '.', '5', '.', '.', '1', '.'},
|
||||
{'.', '4', '.', '3', '.', '.', '.', '.', '.'},
|
||||
{'.', '.', '.', '.', '.', '3', '.', '.', '1'},
|
||||
{'8', '.', '.', '.', '.', '.', '.', '2', '.'},
|
||||
{'.', '.', '2', '.', '7', '.', '.', '.', '.'},
|
||||
{'.', '1', '5', '.', '.', '.', '.', '.', '.'},
|
||||
{'.', '.', '.', '.', '.', '2', '.', '.', '.'},
|
||||
{'.', '2', '.', '9', '.', '.', '.', '.', '.'},
|
||||
{'.', '.', '4', '.', '.', '.', '.', '.', '.'},
|
||||
}
|
||||
|
||||
assert.False(t, valid_sudoku.IsValidSudoku(board))
|
||||
}
|
||||
Reference in New Issue
Block a user