Compare commits

...

9 Commits

3 changed files with 51 additions and 16 deletions

View File

@@ -3,8 +3,30 @@
#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_LEN] = {
// 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, 0x020, 0x000, 0x000, 0x000, 0x004,
0x008, 0x000, 0x000, 0x080, 0x000, 0x004, 0x000, 0x000, 0x001,
0x040, 0x000, 0x000, 0x000, 0x002, 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);
for (int i = 0; i < 2; i++) {
sudoku_solve_step(board);
sudoku_print(board);
}
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@@ -9,24 +9,32 @@
#include "util/intdef.h" #include "util/intdef.h"
void sudoku_init(u16 *board) { void sudoku_init(u16 *board) {
for (uint i = 0; i < SUDOKU_DEPTH_2; i++) { for (uint i = 0; i < SUDOKU_LEN; i++) {
board[i] |= SUDOKU_ALL & -!board[i]; board[i] |= SUDOKU_ALL & -!board[i];
} }
} }
void sudoku_place(u16 *board, u16 val, uint idx) { /* removes `val` from `*brd`, if `*brd` is not equal to `val` */
uint icol = idx % SUDOKU_DEPTH; static inline void setbrdpos(u16 *brd, u16 val) {
uint irow = idx - icol; *brd &= ~(val & -(*brd != val));
uint ibox = idx - (idx % SUDOKU_DEPTH_SQRT); }
for (uint i = 0; i < SUDOKU_DEPTH; i++) {
board[irow + i] &= ~val; void sudoku_place(u16 *brd, u16 val, uint idx) {
board[icol + (i * SUDOKU_DEPTH)] &= ~val; uint x = idx % SUDOKU_DPT;
board[ibox + (i / SUDOKU_DEPTH_SQRT * SUDOKU_DEPTH) + (i % SUDOKU_DEPTH_SQRT)] &= ~val; uint y = idx / SUDOKU_DPT;
uint irow = idx - x;
uint ibox = SUDOKU_DPT * (y % SUDOKU_BOXLEN) + SUDOKU_BOXLEN * (x % SUDOKU_BOXLEN);
for (uint i = 0; i < SUDOKU_DPT; i++) {
setbrdpos(&brd[irow + i], val);
setbrdpos(&brd[x + (i * SUDOKU_DPT)], val);
setbrdpos(&brd[ibox + (SUDOKU_DPT * (i % SUDOKU_BOXLEN))], val);
} }
} }
void sudoku_solve_step(u16 *board) { void sudoku_solve_step(u16 *board) {
for (uint i = 0; i < SUDOKU_DEPTH_2; i++) { for (uint i = 0; i < SUDOKU_LEN; i++) {
switch (board[i]) { switch (board[i]) {
case SUDOKU_1: case SUDOKU_1:
case SUDOKU_2: case SUDOKU_2:
@@ -38,14 +46,17 @@ void sudoku_solve_step(u16 *board) {
case SUDOKU_8: case SUDOKU_8:
case SUDOKU_9: case SUDOKU_9:
sudoku_place(board, board[i], i); sudoku_place(board, board[i], i);
// printf("%i,%i\n", i % SUDOKU_DPT, i / SUDOKU_DPT);
} }
} }
} }
void sudoku_print(const u16 *board) { void sudoku_print(const u16 *board) {
for (uint i = 0; i < SUDOKU_DEPTH_2; i++) { printf("+———-———-———-———-———-———-———-———-———+\n");
for (uint i = 0; i < SUDOKU_LEN; 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;
@@ -59,6 +70,8 @@ void sudoku_print(const u16 *board) {
}; };
printf("| %c ", tile); printf("| %c ", tile);
// printf("|%3X", board[i]);
if (i % 9 == 8) printf("|\n"); if (i % 9 == 8) printf("|\n");
} }
printf("+———-———-———-———-———-———-———-———-———+\n");
} }

View File

@@ -4,9 +4,9 @@
#include "util/intdef.h" #include "util/intdef.h"
#define SUDOKU_DEPTH_SQRT 3 #define SUDOKU_BOXLEN 3
#define SUDOKU_DEPTH (SUDOKU_DEPTH_SQRT * SUDOKU_DEPTH_SQRT) #define SUDOKU_DPT 9
#define SUDOKU_DEPTH_2 (SUDOKU_DEPTH * SUDOKU_DEPTH) #define SUDOKU_LEN (SUDOKU_DPT * SUDOKU_DPT)
/* bitmask */ /* bitmask */
enum sudoku_bitmask { enum sudoku_bitmask {