Compare commits

..

3 Commits

2 changed files with 42 additions and 6 deletions

View File

@@ -3,8 +3,35 @@
#include <stdio.h>
#include <stdlib.h>
#include "sudoku.h"
int main(int argc, char **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;
}

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 irow = idx - icol;
uint ibox = idx - (idx % SUDOKU_DEPTH_SQRT);
for (uint i = 0; i < SUDOKU_DEPTH; i++) {
board[irow + i] &= ~val;
board[icol + (i * SUDOKU_DEPTH)] &= ~val;
board[ibox + (i / SUDOKU_DEPTH_SQRT * SUDOKU_DEPTH) + (i % SUDOKU_DEPTH_SQRT)] &= ~val;
setbrdpos(&brd[irow + i], val);
setbrdpos(&brd[icol + (i * SUDOKU_DEPTH)], 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) {
printf("+———-———-———-———-———-———-———-———-———+\n");
for (uint i = 0; i < SUDOKU_DEPTH_2; i++) {
char tile;
switch (board[i]) {
case 0: tile = 'x'; break;
case SUDOKU_1: tile = '1'; break;
case SUDOKU_2: tile = '2'; break;
case SUDOKU_3: tile = '3'; break;
@@ -58,7 +65,9 @@ void sudoku_print(const u16 *board) {
default: tile = ' '; break;
};
printf("|%c ", tile);
printf("| %c ", tile);
// printf("|%3i", board[i]);
if (i % 9 == 8) printf("|\n");
}
printf("+———-———-———-———-———-———-———-———-———+\n");
}