diff --git a/src/main/java/puzzle/SwedishGenerator.java b/src/main/java/puzzle/SwedishGenerator.java index 19bdbb1..bba262e 100644 --- a/src/main/java/puzzle/SwedishGenerator.java +++ b/src/main/java/puzzle/SwedishGenerator.java @@ -285,12 +285,36 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) { static int offset(int r, int c) { return r | (c << 3); } /// the pos will never target a clue public byte letter32At(int pos) { return g[pos]; } - void setLetter(int idx, byte ch) { g[idx] = ch; } + void setLetterLo(int idx, byte ch) { + lo &= ~(1L << idx); + + g[idx] = ch; + } + void setLetterHi(int idx, byte ch) { + hi &= ~(1L << idx & 63); + + g[idx] = ch; + } + void setLetter(int idx, byte ch) { + if ((idx & 64)==0) + setLetterLo(idx, ch); + else + setLetterHi(idx, ch); + } - private void clearletter(int idx) { g[idx] = DASH; } + private void clearletterLo(int idx) { + g[idx] = DASH; + + lo |= (1L << idx); + } + private void clearletterHi(int idx) { + g[idx] = DASH; + + hi |= (1L << idx & 63); + } void undoPlace(long maskLo, long maskHi) { - for (long b = maskLo; b != 0; b &= b - 1) clearletter(Long.numberOfTrailingZeros(b)); - for (long b = maskHi; b != 0; b &= b - 1) clearletter(64 | Long.numberOfTrailingZeros(b)); + for (long b = maskLo; b != 0; b &= b - 1) clearletterLo(Long.numberOfTrailingZeros(b)); + for (long b = maskHi; b != 0; b &= b - 1) clearletterHi(64 | Long.numberOfTrailingZeros(b)); } } @@ -723,24 +747,24 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) { } static long patternForSlot(Grid grid, Slot s) { - /*if ((s.lo & ~grid.lo) == 0 && (s.hi & ~grid.hi) == 0) { + if ((s.lo & ~grid.lo) == 0 && (s.hi & ~grid.hi) == 0) { return 0; - }*/ + } long p = 0; if (s.increasing()) { for (long b = s.lo & ~grid.lo; b != 0; b &= b - 1) { - int idx = Long.numberOfTrailingZeros(b); - int val = grid.g[idx]; - if (val != 0) { + int idx = Long.numberOfTrailingZeros(b); + byte val = grid.g[idx]; + if (val != DASH) { int i = Long.bitCount(s.lo & ((1L << idx) - 1)); p |= ((long) (i * 26 + val)) << (i << 3); } } int offset = Long.bitCount(s.lo); for (long b = s.hi & ~grid.hi; b != 0; b &= b - 1) { - int idx = Long.numberOfTrailingZeros(b); - int val = grid.g[64 | idx]; - if (val != 0) { + int idx = Long.numberOfTrailingZeros(b); + byte val = grid.g[64 | idx]; + if (val != DASH) { int i = offset + Long.bitCount(s.hi & ((1L << idx) - 1)); p |= ((long) (i * 26 + val)) << (i << 3); } @@ -748,17 +772,17 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) { } else { int offset = Long.bitCount(s.hi); for (long b = s.hi & ~grid.hi; b != 0; b &= b - 1) { - int idx = Long.numberOfTrailingZeros(b); - int val = grid.g[64 | idx]; - if (val != 0) { + int idx = Long.numberOfTrailingZeros(b); + byte val = grid.g[64 | idx]; + if (val != DASH) { int i = Long.bitCount(s.hi & ~((1L << idx) | ((1L << idx) - 1))); p |= ((long) (i * 26 + val)) << (i << 3); } } for (long b = s.lo & ~grid.lo; b != 0; b &= b - 1) { - int idx = Long.numberOfTrailingZeros(b); - int val = grid.g[idx]; - if (val != 0) { + int idx = Long.numberOfTrailingZeros(b); + byte val = grid.g[idx]; + if (val != DASH) { int i = offset + Long.bitCount(s.lo & ~((1L << idx) | ((1L << idx) - 1))); p |= ((long) (i * 26 + val)) << (i << 3); } @@ -781,7 +805,7 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) { byte cur = grid.letter32At(idx), ch = Lemma.byteAt(w, i); if (cur == DASH) { maskLo |= (1L << idx); - grid.setLetter(idx, ch); + grid.setLetterLo(idx, ch); } else if (cur != ch) { grid.undoPlace(maskLo, maskHi); return false; @@ -792,7 +816,7 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) { byte cur = grid.letter32At(idx), ch = Lemma.byteAt(w, i); if (cur == DASH) { maskHi |= (1L << (idx & 63)); - grid.setLetter(idx, ch); + grid.setLetterHi(idx, ch); } else if (cur != ch) { grid.undoPlace(maskLo, maskHi); return false; @@ -805,7 +829,7 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) { byte cur = grid.letter32At(idx), ch = Lemma.byteAt(w, i); if (cur == DASH) { maskHi |= (1L << msb); - grid.setLetter(idx, ch); + grid.setLetterHi(idx, ch); } else if (cur != ch) { grid.undoPlace(maskLo, maskHi); return false; @@ -818,7 +842,7 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) { byte cur = grid.letter32At(idx), ch = Lemma.byteAt(w, i); if (cur == DASH) { maskLo |= (1L << msb); - grid.setLetter(idx, ch); + grid.setLetterLo(idx, ch); } else if (cur != ch) { grid.undoPlace(maskLo, maskHi); return false;