feat: valid sudoku

This commit is contained in:
2025-12-17 18:29:19 -05:00
parent 1e2700a2f2
commit 647b79a050
2 changed files with 102 additions and 0 deletions

46
pkg/valid_sudoku/main.go Normal file
View 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
}

View 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))
}