Compare commits

...

9 Commits

3 changed files with 51 additions and 16 deletions

View File

@@ -3,8 +3,30 @@
#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_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;
}

View File

@@ -9,24 +9,32 @@
#include "util/intdef.h"
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];
}
}
void sudoku_place(u16 *board, 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;
/* 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 x = idx % SUDOKU_DPT;
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) {
for (uint i = 0; i < SUDOKU_DEPTH_2; i++) {
for (uint i = 0; i < SUDOKU_LEN; i++) {
switch (board[i]) {
case SUDOKU_1:
case SUDOKU_2:
@@ -38,14 +46,17 @@ void sudoku_solve_step(u16 *board) {
case SUDOKU_8:
case SUDOKU_9:
sudoku_place(board, board[i], i);
// printf("%i,%i\n", i % SUDOKU_DPT, i / SUDOKU_DPT);
}
}
}
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;
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 +69,9 @@ void sudoku_print(const u16 *board) {
default: tile = ' '; break;
};
printf("|%c ", tile);
printf("| %c ", tile);
// printf("|%3X", board[i]);
if (i % 9 == 8) printf("|\n");
}
printf("+———-———-———-———-———-———-———-———-———+\n");
}

View File

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