32 typedef typename compositor_t::function function_t;
34 std::vector<T> board =
36 0, 0, 0, 0, 0, 8, 2, 0, 5,
37 0, 0, 0, 3, 2, 0, 0, 0, 8,
38 0, 0, 0, 0, 0, 5, 6, 0, 0,
39 0, 1, 0, 0, 4, 7, 0, 9, 3,
40 0, 0, 0, 0, 0, 0, 0, 0, 0,
41 8, 6, 0, 2, 3, 0, 0, 1, 0,
42 0, 0, 6, 8, 0, 0, 0, 0, 0,
43 5, 0, 0, 0, 7, 3, 0, 0, 0,
44 4, 0, 3, 9, 0, 0, 0, 0, 0,
49 symbol_table_t symbol_table;
50 symbol_table.add_vector (
"board", board);
51 symbol_table.add_function(
"print_digit",
53 { printf(
" %d ",
static_cast<int>(v));
return 0; });
54 symbol_table.add_package (io_package);
56 compositor_t compositor(symbol_table);
58 compositor.load_variables(
true);
59 compositor.load_vectors (
true);
62 function_t(
"get_board")
65 (
" board[row * sqrt(board[]) + col]; " ));
68 function_t(
"set_board")
69 .vars(
"col",
"row",
"value")
71 (
" board[row * sqrt(board[]) + col] := value; " ));
74 function_t(
"display_board")
77 " const var n := sqrt(board[]); "
79 " for (var row := 0; row < n; row += 1) "
81 " for (var col := 0; col < n; col += 1) "
83 " print_digit(get_board(col,row)); "
85 " if ((col > 0) and (col < 8) and (col + 1) % 3 == 0) "
93 " if ((row > 0) and (row < 8) and (row + 1) % 3 == 0) "
95 " println('---------+---------+----------'); "
101 function_t(
"is_valid")
102 .vars(
"col",
"row",
"num")
105 " const var n := sqrt(board[]); "
107 " for (var i := 0; i < n; i += 1) "
110 " (get_board(col, i ) == num) or "
111 " (get_board(i , row) == num) "
118 " var subgrid_row := row - floor(row % 3); "
119 " var subgrid_col := col - floor(col % 3); "
121 " for (var i := subgrid_row; i < subgrid_row + 3; i += 1) "
123 " for (var j := subgrid_col; j < subgrid_col + 3; j += 1) "
125 " if (get_board(j,i) == num) "
136 function_t(
"solve_sudoku")
139 " const var n := sqrt(board[]); "
141 " for (var row := 0; row < n; row += 1) "
143 " for (var col := 0; col < n; col += 1) "
145 " if (get_board(col, row) == 0) "
147 " for (var num := 1; num <= 9; num += 1) "
149 " if (is_valid(col, row, num)) "
151 " set_board(col, row, num); "
153 " if (solve_sudoku()) "
158 " set_board(col, row, 0); "
170 const std::string sudoku_solver_program =
171 " if (solve_sudoku()) "
173 " println('Puzzle Solved!'); "
177 " println('Error: Failed to solve puzzle.'); "
180 " display_board(); ";
182 expression_t expression;
183 expression.register_symbol_table(symbol_table);
186 parser.compile(sudoku_solver_program,expression);