diff --git a/src/main/java/puzzle/SwedishGenerator.java b/src/main/java/puzzle/SwedishGenerator.java index 62e91c5..06cbf8c 100644 --- a/src/main/java/puzzle/SwedishGenerator.java +++ b/src/main/java/puzzle/SwedishGenerator.java @@ -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; }