Compare commits

...

3 Commits

2 changed files with 42 additions and 6 deletions

View File

@@ -3,8 +3,35 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "sudoku.h"
int main(int argc, char **argv) { int main(int argc, char **argv) {
(void)argc, (void)argv; (void)argc, (void)argv;
printf("%s\n", "Hello, World!"); u16 board[SUDOKU_DEPTH_2] = {
// clang-format off
0x010, 0x004, 0x000, 0x000, 0x040, 0x000, 0x000, 0x000, 0x000,
0x020, 0x000, 0x000, 0x001, 0x100, 0x010, 0x000, 0x000, 0x000,
0x000, 0x100, 0x080, 0x000, 0x000, 0x000, 0x000, 0x020, 0x000,
0x080, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x004,
0x008, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001,
0x040, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x020,
0x000, 0x020, 0x000, 0x000, 0x000, 0x000, 0x002, 0x080, 0x000,
0x000, 0x000, 0x000, 0x008, 0x001, 0x100, 0x000, 0x000, 0x010,
0x000, 0x000, 0x000, 0x000, 0x080, 0x000, 0x000, 0x040, 0x100,
// clang-format on
};
sudoku_init(board);
sudoku_print(board);
sudoku_solve_step(board);
sudoku_print(board);
sudoku_solve_step(board);
sudoku_print(board);
sudoku_solve_step(board);
sudoku_print(board);
sudoku_solve_step(board);
sudoku_print(board);
sudoku_solve_step(board);
sudoku_print(board);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@@ -14,14 +14,19 @@ void sudoku_init(u16 *board) {
} }
} }
void sudoku_place(u16 *board, u16 val, uint idx) { /* removes `val` from `*brd`, if `*brd` is not equal to `val` */
static inline void setbrdpos(u16 *brd, u16 val) {
*brd &= ~(val & -(*brd != val));
}
void sudoku_place(u16 *brd, u16 val, uint idx) {
uint icol = idx % SUDOKU_DEPTH; uint icol = idx % SUDOKU_DEPTH;
uint irow = idx - icol; uint irow = idx - icol;
uint ibox = idx - (idx % SUDOKU_DEPTH_SQRT); uint ibox = idx - (idx % SUDOKU_DEPTH_SQRT);
for (uint i = 0; i < SUDOKU_DEPTH; i++) { for (uint i = 0; i < SUDOKU_DEPTH; i++) {
board[irow + i] &= ~val; setbrdpos(&brd[irow + i], val);
board[icol + (i * SUDOKU_DEPTH)] &= ~val; setbrdpos(&brd[icol + (i * SUDOKU_DEPTH)], val);
board[ibox + (i / SUDOKU_DEPTH_SQRT * SUDOKU_DEPTH) + (i % SUDOKU_DEPTH_SQRT)] &= ~val; setbrdpos(&brd[ibox + (i / SUDOKU_DEPTH_SQRT * SUDOKU_DEPTH) + (i % SUDOKU_DEPTH_SQRT)], val);
} }
} }
@@ -43,9 +48,11 @@ void sudoku_solve_step(u16 *board) {
} }
void sudoku_print(const u16 *board) { void sudoku_print(const u16 *board) {
printf("+———-———-———-———-———-———-———-———-———+\n");
for (uint i = 0; i < SUDOKU_DEPTH_2; i++) { for (uint i = 0; i < SUDOKU_DEPTH_2; i++) {
char tile; char tile;
switch (board[i]) { switch (board[i]) {
case 0: tile = 'x'; break;
case SUDOKU_1: tile = '1'; break; case SUDOKU_1: tile = '1'; break;
case SUDOKU_2: tile = '2'; break; case SUDOKU_2: tile = '2'; break;
case SUDOKU_3: tile = '3'; break; case SUDOKU_3: tile = '3'; break;
@@ -58,7 +65,9 @@ void sudoku_print(const u16 *board) {
default: tile = ' '; break; default: tile = ' '; break;
}; };
printf("|%c ", tile); printf("| %c ", tile);
// printf("|%3i", board[i]);
if (i % 9 == 8) printf("|\n"); if (i % 9 == 8) printf("|\n");
} }
printf("+———-———-———-———-———-———-———-———-———+\n");
} }