Skip to content

Commit 0c2541e

Browse files
Merge pull request #2 from rainerzufalldererste/cstiller/cross_check_solver
Optional Cross-Check-Solver (Block-VLine/Block-HLine/VLine-HLine/HLine-VLine)
2 parents e9cafbb + 3b2a263 commit 0c2541e

File tree

5 files changed

+746
-42
lines changed

5 files changed

+746
-42
lines changed

src/io.cpp

+58
Original file line numberDiff line numberDiff line change
@@ -217,3 +217,61 @@ void print_state(const state *pState)
217217
fputs("- ----:-----:-----|-----:-----:-----|-----:-----:----\n", stdout);
218218
}
219219
}
220+
221+
void inspect_triple_value_internal(const uint32_t value)
222+
{
223+
fputc(value & s_done ? '!' : ' ', stdout);
224+
225+
for (uint8_t i = 1; i <= 9; i++)
226+
{
227+
if (value & (1 << i))
228+
fputc('0' + i, stdout);
229+
else
230+
fputc('.', stdout);
231+
}
232+
}
233+
234+
void inspect_triple_value(const uint32_t value)
235+
{
236+
inspect_triple_value_internal(value);
237+
puts("");
238+
}
239+
240+
void inspect_triple(const uint32_t triple)
241+
{
242+
size_t tripleIndex = 0;
243+
244+
fputs("[ ", stdout);
245+
246+
for (size_t offset = 0; offset < 21; offset += 10, tripleIndex++)
247+
{
248+
if (offset > 0)
249+
fputs(" | ", stdout);
250+
251+
printf("%" PRIu64 ": ", tripleIndex);
252+
inspect_triple_value_internal(triple >> offset);
253+
}
254+
255+
puts(" ]");
256+
}
257+
258+
void inspect_bits(const uint64_t value)
259+
{
260+
uint64_t v = value;
261+
262+
for (size_t i = 0; i < 64; i++, v >>= 1)
263+
{
264+
if (v == 0)
265+
{
266+
fputc('/', stdout);
267+
break;
268+
}
269+
270+
if (v & 1)
271+
printf("%" PRIX64 " ", i);
272+
else
273+
fputs(". ", stdout);
274+
}
275+
276+
puts("");
277+
}

src/io.h

+4
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,7 @@ bool parse(state *pState, const char *in, const size_t size);
66

77
void print(const state *pState);
88
void print_state(const state *pState);
9+
10+
void inspect_triple_value(const uint32_t value);
11+
void inspect_triple(const uint32_t triple);
12+
void inspect_bits(const uint64_t value);

src/ook.cpp

+50-8
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,52 @@ void init(state *pState)
3838
}
3939

4040
static const char _Arg_Benchmark[] = "--bench";
41+
static const char _Arg_PreferPreSolve[] = "--prefer-pre-solve";
42+
static const char _Arg_PreferGuessSolve[] = "--prefer-guess-solve";
4143

4244
int32_t main(const int32_t argc, char **ppArgv)
4345
{
44-
ERROR_IF(argc <= 1, "Usage: ook <filename> [--bench]");
46+
bool benchmark = false;
47+
bool preferPreSolve = false;
48+
bool preferGuessSolve = false;
49+
50+
if (argc <= 1)
51+
{
52+
puts("Usage: ook <filename>");
53+
printf("\t[ % 25s ]: \tRun Benchmark\n", _Arg_Benchmark);
54+
printf("\t[ % 25s ]: \tPrefer Advanced Solver before guessing Values\n", _Arg_PreferPreSolve);
55+
printf("\t[ % 25s ]: \tPrefer Advanced Solver when guessing Values\n", _Arg_PreferGuessSolve);
56+
57+
return EXIT_FAILURE;
58+
}
59+
60+
int32_t argIndex = 2;
61+
62+
while (argIndex < argc)
63+
{
64+
const int32_t argsLeft = argc - argIndex;
65+
(void)argsLeft; // currently none of the arguments have additional parameters.
66+
67+
if (strncmp(ppArgv[argIndex], _Arg_Benchmark, sizeof(_Arg_Benchmark)) == 0)
68+
{
69+
benchmark = true;
70+
}
71+
else if (strncmp(ppArgv[argIndex], _Arg_PreferPreSolve, sizeof(_Arg_PreferPreSolve)) == 0)
72+
{
73+
preferPreSolve = true;
74+
}
75+
else if (strncmp(ppArgv[argIndex], _Arg_PreferGuessSolve, sizeof(_Arg_PreferGuessSolve)) == 0)
76+
{
77+
preferGuessSolve = true;
78+
}
79+
else
80+
{
81+
printf("Invalid Argument'%s'. Aborting.\n", ppArgv[argIndex]);
82+
return EXIT_FAILURE;
83+
}
84+
85+
argIndex++;
86+
}
4587

4688
state s;
4789
init(&s);
@@ -62,19 +104,19 @@ int32_t main(const int32_t argc, char **ppArgv)
62104

63105
print(&s);
64106

65-
if (argc > 2 && strncmp(ppArgv[2], _Arg_Benchmark, sizeof(_Arg_Benchmark)) == 0)
107+
if (benchmark)
66108
{
67109
// Dry Run.
68110
{
69111
puts("Dry Run...");
70112

71113
state s1 = s;
72-
simple_solve(&s1);
114+
(preferPreSolve ? simple_solve_advanced : simple_solve)(&s1);
73115

74116
if (s1.blocks != 0b111111111)
75117
{
76118
size_t _0, _1;
77-
recursive_guess(&s1, &_0, &_1);
119+
(preferGuessSolve ? recursive_guess_advanced : recursive_guess)(&s1, &_0, &_1);
78120
}
79121
}
80122

@@ -98,12 +140,12 @@ int32_t main(const int32_t argc, char **ppArgv)
98140
for (size_t i = 0; i < 1000; i++)
99141
{
100142
state s1 = s;
101-
simple_solve(&s1);
143+
(preferPreSolve ? simple_solve_advanced : simple_solve)(&s1);
102144

103145
if (s1.blocks != 0b111111111)
104146
{
105147
size_t _0, _1;
106-
recursive_guess(&s1, &_0, &_1);
148+
(preferGuessSolve ? recursive_guess_advanced : recursive_guess)(&s1, &_0, &_1);
107149
}
108150
}
109151

@@ -154,7 +196,7 @@ int32_t main(const int32_t argc, char **ppArgv)
154196
fputs("Simple Solve...", stdout);
155197

156198
const uint64_t before = _get_ticks();
157-
simple_solve(&s);
199+
(preferPreSolve ? simple_solve_advanced : simple_solve)(&s);
158200
const uint64_t after = _get_ticks();
159201

160202
printf(" (Completed in %9.6f ms)\n", _ticks_to_ns(after - before) * 1e-6f);
@@ -175,7 +217,7 @@ int32_t main(const int32_t argc, char **ppArgv)
175217
const uint64_t before = _get_ticks();
176218

177219
size_t guesses = 0, total = 0;
178-
ERROR_IF(!recursive_guess(&s, &guesses, &total), "Failed to solve by guessing.");
220+
ERROR_IF(!(preferGuessSolve ? recursive_guess_advanced : recursive_guess)(&s, &guesses, &total), "Failed to solve by guessing.");
179221

180222
const uint64_t after = _get_ticks();
181223

0 commit comments

Comments
 (0)