introduce bitloops
This commit is contained in:
@@ -358,20 +358,16 @@ 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 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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user