introduce bitloops

This commit is contained in:
mike
2026-01-10 04:42:24 +01:00
parent e559040321
commit cf185e0a7c

View File

@@ -357,21 +357,17 @@ public record SwedishGenerator(Rng rng) {
}
private static void processSlot(Grid grid, SlotVisitor visitor, int idx) {
var d = grid.digitAt(idx);
var nbrs16 = OFFSETS[d];
int r = Grid.r(idx), c = Grid.c(idx), rr = r + nbrs16.r(), cc = c + nbrs16.c();
if (rr < 0 || rr >= R || cc < 0 || cc >= C || grid.isDigitAt(rr, cc)) return;
var d = grid.digitAt(idx);
var packed = OFFSETS[d].path()[idx];
long packedPos = 0;
var n = 0;
while (rr >= 0 && rr < R && cc >= 0 && cc < C && grid.isLetterAt(rr, cc) && n < MAX_WORD_LENGTH) {
packedPos |= (long) Grid.offset(rr, cc) << (n * 7);
n++;
rr += nbrs16.dr();
cc += nbrs16.dc();
int k = 0;
for (int n = (int) (packed >>> 56), iidx; k < n && k < MAX_WORD_LENGTH; k++) {
iidx = (int) ((packed >>> (k * 7)) & 0x7F);
if (grid.isClue(iidx)) break;
packedPos |= (long) iidx << (k * 7);
}
if (n > 0) {
visitor.visit((idx << 4) | d, packedPos, n);
if (k > 0) {
visitor.visit((idx << 4) | d, packedPos, k);
}
}
@@ -381,21 +377,10 @@ public record SwedishGenerator(Rng rng) {
return slots;
}
boolean hasRoomForClue(Grid grid, long packed) {
//long packed = nbrs16.path()[idx];
int n = (int) (packed >>> 56), k, idx;
for (k = 0; k < n && k < MAX_WORD_LENGTH; ) {
idx = (int) ((packed >>> (k * 7)) & 0x7F);
if (!grid.isLetterAt(idx)) break;
k++;
if (k >= MIN_LEN) return true;
for (int n = (int) (packed >>> 56), k = 0; k < n && k < MAX_WORD_LENGTH; ) {
if (!grid.isLetterAt((int) ((packed >>> (k * 7)) & 0x7F))) break;
if (++k >= MIN_LEN) return true;
}
/* int rr = Grid.r(idx) + nbrs16.r(), cc = Grid.c(idx) + nbrs16.c();
while (rr >= 0 && rr < R && cc >= 0 && cc < C && (grid.isLetterAt(rr, cc)) && run < MAX_WORD_LENGTH) {
run++;
rr += nbrs16.dr();
cc += nbrs16.dc();
if (run >= MIN_LEN) return true;
}*/
return false;
}