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