http://d.puremagic.com/issues/show_bug.cgi?id=5258
bearophile_h...@eml.cc changed:
What|Removed |Added
Severity|normal |regression
--- Comment #1 from bearophile_h...@eml.cc 2011-05-06 02:51:16 PDT ---
This CTFE bug is present in DMD v1.068beta still, but it seems absent in DMD
v1.042.
A longer example that gives the correct answer with DMD 1.042 but produces
stack overflow with DMD v1.068beta:
import std.c.stdio: printf;
bool test(int k, int j, ulong diag45, ulong diag135, ulong cols) {
return ((cols (1UL j)) +
(diag135 (1UL (j + k))) +
(diag45 (1UL (32 + j - k))) ) == 0;
}
void mark(int k, int j, ref ulong diag45, ref ulong diag135, ref ulong cols) {
cols^= (1UL j);
diag135 ^= (1UL (j + k));
diag45 ^= (1UL (32 + j - k));
}
uint solve(int niv, int dx, ref ulong diag45, ref ulong diag135, ref ulong
cols) {
uint solutions_found;
if (niv) {
for (int i = 0; i dx; i++)
if (test(niv, i, diag45, diag135, cols)) {
mark(niv, i, diag45, diag135, cols);
solutions_found += solve(niv - 1, dx, diag45, diag135, cols);
mark(niv, i, diag45, diag135, cols);
}
} else {
for (int i = 0; i dx; i++)
solutions_found += test(0, i, diag45, diag135, cols);
}
return solutions_found;
}
ulong nqueen(int n) {
// masques
ulong diag45 = 0; // / diagonal bitboard
ulong diag135 = 0; // \ diagonal bitboard
ulong cols= 0; // column bitboard
return solve(n - 1, n, diag45, diag135, cols);
}
const ulong result = nqueen(9);
void main() {
// NQUEENS: 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2_680, 14_200, 73_712,
365_596
printf(%lld\n, result);
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---