introduce bitloops
This commit is contained in:
@@ -357,21 +357,17 @@ public record SwedishGenerator(Rng rng) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void processSlot(Grid grid, SlotVisitor visitor, int idx) {
|
private static void processSlot(Grid grid, SlotVisitor visitor, int idx) {
|
||||||
var d = grid.digitAt(idx);
|
var d = grid.digitAt(idx);
|
||||||
var nbrs16 = OFFSETS[d];
|
var packed = OFFSETS[d].path()[idx];
|
||||||
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;
|
|
||||||
long packedPos = 0;
|
long packedPos = 0;
|
||||||
var n = 0;
|
int k = 0;
|
||||||
|
for (int n = (int) (packed >>> 56), iidx; k < n && k < MAX_WORD_LENGTH; k++) {
|
||||||
while (rr >= 0 && rr < R && cc >= 0 && cc < C && grid.isLetterAt(rr, cc) && n < MAX_WORD_LENGTH) {
|
iidx = (int) ((packed >>> (k * 7)) & 0x7F);
|
||||||
packedPos |= (long) Grid.offset(rr, cc) << (n * 7);
|
if (grid.isClue(iidx)) break;
|
||||||
n++;
|
packedPos |= (long) iidx << (k * 7);
|
||||||
rr += nbrs16.dr();
|
|
||||||
cc += nbrs16.dc();
|
|
||||||
}
|
}
|
||||||
if (n > 0) {
|
if (k > 0) {
|
||||||
visitor.visit((idx << 4) | d, packedPos, n);
|
visitor.visit((idx << 4) | d, packedPos, k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -381,21 +377,10 @@ public record SwedishGenerator(Rng rng) {
|
|||||||
return slots;
|
return slots;
|
||||||
}
|
}
|
||||||
boolean hasRoomForClue(Grid grid, long packed) {
|
boolean hasRoomForClue(Grid grid, long packed) {
|
||||||
//long packed = nbrs16.path()[idx];
|
for (int n = (int) (packed >>> 56), k = 0; k < n && k < MAX_WORD_LENGTH; ) {
|
||||||
int n = (int) (packed >>> 56), k, idx;
|
if (!grid.isLetterAt((int) ((packed >>> (k * 7)) & 0x7F))) break;
|
||||||
for (k = 0; k < n && k < MAX_WORD_LENGTH; ) {
|
if (++k >= MIN_LEN) return true;
|
||||||
idx = (int) ((packed >>> (k * 7)) & 0x7F);
|
|
||||||
if (!grid.isLetterAt(idx)) break;
|
|
||||||
k++;
|
|
||||||
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user