Skip to content

Commit a1f1346

Browse files
committed
Merge branch 'dev'
2 parents 8c4e9e7 + 2430111 commit a1f1346

24 files changed

+1318
-5
lines changed

docs/user_guide/dojos-resolvidos.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,20 @@
88

99
---
1010

11-
144 dojos resolvidos
11+
150 dojos resolvidos
1212

1313
---
1414

1515

1616

1717
### 2024
1818

19+
- [Dojo20241221 — Sum of Subarray Minimums](https://github.com/incolume-jedi/coding-dojo/tree/dev/incolume/py/coding_dojo_jedi/dojo20241221/README.md){:target="_blank"}
20+
- [Dojo20241220 — Revert String to image from json file.](https://github.com/incolume-jedi/coding-dojo/tree/dev/incolume/py/coding_dojo_jedi/dojo20241220/README.md){:target="_blank"}
21+
- [Dojo20241216 — Convert Image to String and write into json file.](https://github.com/incolume-jedi/coding-dojo/tree/dev/incolume/py/coding_dojo_jedi/dojo20241216/README.md){:target="_blank"}
22+
- [Dojo20241214 — Top K Frequent Elements](https://github.com/incolume-jedi/coding-dojo/tree/dev/incolume/py/coding_dojo_jedi/dojo20241214/README.md){:target="_blank"}
23+
- [Dojo20241213 — Longest Consecutive Sequence](https://github.com/incolume-jedi/coding-dojo/tree/dev/incolume/py/coding_dojo_jedi/dojo20241213/README.md){:target="_blank"}
24+
- [Dojo20241212 — Solucionador de Sudoku](https://github.com/incolume-jedi/coding-dojo/tree/dev/incolume/py/coding_dojo_jedi/dojo20241212/README.md){:target="_blank"}
1925
- [Dojo20241211 — Crie número válidos para CNPJ](https://github.com/incolume-jedi/coding-dojo/tree/dev/incolume/py/coding_dojo_jedi/dojo20241211/README.md){:target="_blank"}
2026
- [Dojo20241128 — Sudoku válido](https://github.com/incolume-jedi/coding-dojo/tree/dev/incolume/py/coding_dojo_jedi/dojo20241128/README.md){:target="_blank"}
2127
- [Dojo20241127 — Criar dígitos verificadores para CNPJ](https://github.com/incolume-jedi/coding-dojo/tree/dev/incolume/py/coding_dojo_jedi/dojo20241127/README.md){:target="_blank"}

incolume/py/coding_dojo_jedi/README.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,16 @@
88

99
---
1010

11-
144 dojos resolvidos
11+
150 dojos resolvidos
1212

1313
---
1414

15+
- [Dojo20241221 — Sum of Subarray Minimums](dojo20241221/README.md)
16+
- [Dojo20241220 — Revert String to image from json file.](dojo20241220/README.md)
17+
- [Dojo20241216 — Convert Image to String and write into json file.](dojo20241216/README.md)
18+
- [Dojo20241214 — Top K Frequent Elements](dojo20241214/README.md)
19+
- [Dojo20241213 — Longest Consecutive Sequence](dojo20241213/README.md)
20+
- [Dojo20241212 — Solucionador de Sudoku](dojo20241212/README.md)
1521
- [Dojo20241211 — Crie número válidos para CNPJ](dojo20241211/README.md)
1622
- [Dojo20241128 — Sudoku válido](dojo20241128/README.md)
1723
- [Dojo20241127 — Criar dígitos verificadores para CNPJ](dojo20241127/README.md)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# Coding Dojo
2+
3+
**Guilda JEDI Incolume - Grupo Python Incolume**
4+
5+
- _[Seja membro da Guilda JEDI Incolume](https://discord.gg/eBNamXVtBW)_
6+
7+
---
8+
9+
## Problema
10+
11+
**Solucionador de Sudoku**
12+
13+
Escreva um programa para resolver um quebra-cabeça Sudoku preenchendo as células vazias.
14+
15+
Uma solução de sudoku deve satisfazer todas as seguintes regras :
16+
17+
1. Cada um dos dígitos 1-9, deve ocorrer exatamente uma vez em cada linha.
18+
1. Cada um dos dígitos 1-9, deve ocorrer exatamente uma vez em cada coluna.
19+
1. Cada um dos dígitos 1-9, deve ocorrer exatamente uma vez em cada uma dos 9 quadrantes 3x3 da grade.
20+
21+
O '.' caractere indica células vazias.
22+
23+
24+
## Exemplos
25+
26+
Exemplo 1:
27+
28+
29+
Entrada: placa = [["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"]]
30+
Saída: [ ["5","3","4","6","7","8","9","1","2"],["6","7","2" ,"1","9","5","3","4","8"],["1","9","8","3","4","2" ,"5","6","7"],["8","5","9","7","6","1","4","2","3" ],["4","2","6","8","5","3","7","9","1"],["7","1"," 3","9","2","4","8","5","6"],["9","6","1","5","3"," 7","2","8","4"],["2","8","7","4","1","9","6","3"," 5"],["3","4","5","2","8","6","1","7","9"]]
31+
32+
Explicação:
33+
34+
A placa de entrada é mostrada acima e a única solução válida é mostrada abaixo:
35+
36+
37+
![Solução válida](https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Sudoku-by-L2G-20050714_solution.svg/250px-Sudoku-by-L2G-20050714_solution.svg.png "Soduku")
38+
39+
40+
Restrições:
41+
42+
- board.length == 9
43+
- board[i].length == 9
44+
- board[i][j]é um dígito ou '.'.
45+
46+
É garantido que a placa de entrada possui apenas uma solução.
47+
48+
49+
<details>
50+
<summary>Spoiler?</summary>
51+
Considerar em caso de fatoração:
52+
53+
> modo pythônico
54+
> sem condicionais
55+
> estruturas performáticas
56+
> redução de complexidade ciclomática
57+
> análise assintótica de algoritmos (big O)
58+
59+
</details>
60+
61+
N/A - Exemplos de solução e resposta do problema. Geralmente utilizado para validar os testes do TDD.
62+
63+
## Artefatos
64+
65+
- [dojo](__init__.py)
66+
- [tests](test_20241212.py)
67+
68+
69+
## Referências
70+
71+
- [Solucionador de Sudoku](https://leetcode.com/problems/sudoku-solver/)
72+
73+
N/A - Referências para o dojo, o problema ou para elicidações extras.
74+
75+
---
76+
77+
Copyright &copy; **incolume.com.br** since 2010
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"""dojo module."""
2+
3+
import contextlib
4+
from typing import TypeAlias
5+
6+
import numpy as np
7+
from icecream import ic
8+
9+
Board: TypeAlias = list[list[str | int]]
10+
11+
12+
class SudokuSolver:
13+
"""Sudoku solutions."""
14+
15+
def __to_ndarray(self, sudoku: Board) -> np.ndarray:
16+
"""ND Array."""
17+
sudoku = np.array(sudoku).reshape([9, 9])
18+
with contextlib.suppress(ValueError):
19+
sudoku = np.strings.replace(sudoku, '.', 0)
20+
sudoku = sudoku.astype(int)
21+
ic(sudoku)
22+
return sudoku
23+
24+
def solver(
25+
self,
26+
sudoku: Board,
27+
solutions: None | list[Board] = None,
28+
) -> list[Board]:
29+
"""Solver."""
30+
solutions = solutions or []
31+
solution = self.__to_ndarray(sudoku)
32+
for (x, y), value in np.ndenumerate(solution):
33+
ic(x, y, value)
34+
if value == 0:
35+
ic(value)
36+
for possibility in self.possibilities(solution, x, y):
37+
solution[x, y] = possibility
38+
self.solver(solution, solutions)
39+
solutions.append(solution.copy())
40+
return solutions
41+
42+
def check_quadrant(self, sudoku: Board, x: int, y: int) -> Board:
43+
"""Check quadrant."""
44+
sudoku = self.__to_ndarray(sudoku)
45+
xx = x // 3
46+
yy = y // 3
47+
return sudoku[xx * 3 : (xx + 1) * 3, yy * 3 : (yy + 1) * 3]
48+
49+
def is_valid(self, sudoku: Board, x: int, y: int, value: int) -> bool:
50+
"""Check sudoku is valid."""
51+
sudoku = self.__to_ndarray(sudoku)
52+
ic(sudoku)
53+
return (
54+
value not in sudoku[x, :]
55+
and value not in sudoku[:, y]
56+
and value not in self.check_quadrant(sudoku, x, y)
57+
)
58+
59+
def possibilities(self, sudoku: Board, x: int, y: int) -> Board:
60+
"""List possibilities."""
61+
return [
62+
value
63+
for value in range(1, 10)
64+
if self.is_valid(sudoku, x, y, value)
65+
]

0 commit comments

Comments
 (0)