introduce bitloops

This commit is contained in:
mike
2026-01-14 11:37:40 +01:00
parent c1706e1bf7
commit 8e049b3fa5
3 changed files with 62 additions and 65 deletions

View File

@@ -82,7 +82,7 @@ public class SwedishGeneratorTest {
grid.setLetterLo(1, LETTER_B);
grid.setLetterLo(2, LETTER_C);
var slot = Slot.from(18 << Slot.BIT_FOR_DIR | (CLUE_RIGHT), 7L, 0L);
var pattern = patternForSlot(grid, slot);
var pattern = patternForSlot(grid, slot.key(), slot.lo(), slot.hi());
assertEquals(1L | (28L << 8) | (55L << 16), pattern);
}
@@ -93,7 +93,7 @@ public class SwedishGeneratorTest {
grid.setLetterLo(OFF_0_0, LETTER_A);
grid.setLetterLo(2, LETTER_C);
var slot = Slot.from(1 << Slot.BIT_FOR_DIR | (CLUE_RIGHT), 7L, 0L);
var pattern = patternForSlot(grid, slot);
var pattern = patternForSlot(grid, slot.key(), slot.lo(), slot.hi());
assertEquals(1L | (0L << 8) | (55L << 16), pattern);
}
@@ -102,7 +102,7 @@ public class SwedishGeneratorTest {
void testPatternForSlotAllDashes() {
var grid = createEmpty();
var slot = Slot.from(1 << Slot.BIT_FOR_DIR | (CLUE_RIGHT), 7L, 0L);
var pattern = patternForSlot(grid, slot);
var pattern = patternForSlot(grid, slot.key(), slot.lo(), slot.hi());
assertEquals(0L, pattern);
}
@@ -112,7 +112,7 @@ public class SwedishGeneratorTest {
var grid = createEmpty();
grid.setLetterLo(OFF_0_0, LETTER_A);
var slot = Slot.from(1 << Slot.BIT_FOR_DIR | (CLUE_RIGHT), 7L, 0L);
var pattern = patternForSlot(grid, slot);
var pattern = patternForSlot(grid, slot.key(), slot.lo(), slot.hi());
assertEquals(1L, pattern);
}
@@ -330,23 +330,23 @@ public class SwedishGeneratorTest {
void testPlaceWord() {
var grid = createEmpty();
// Slot at OFF_0_0 length 3, horizontal (right)
var key = (OFF_0_0 << Slot.BIT_FOR_DIR) | (CLUE_RIGHT);
var lo = (1L << OFF_0_0) | (1L << OFF_0_1) | (1L << OFF_0_2);
var s = Slot.from(key, lo, 0L);
var w1 = ABC;
var key = (OFF_0_0 << Slot.BIT_FOR_DIR) | (CLUE_RIGHT);
var lo = (1L << OFF_0_0) | (1L << OFF_0_1) | (1L << OFF_0_2);
var s = Slot.from(key, lo, 0L);
var w1 = ABC;
// 1. Successful placement in empty grid
assertTrue(placeWord(grid, s, w1));
assertTrue(placeWord(grid, s.key(), s.lo(), s.hi(), w1));
assertEquals(LETTER_A, grid.letter32At(OFF_0_0));
assertEquals(LETTER_B, grid.letter32At(OFF_0_1));
assertEquals(LETTER_C, grid.letter32At(OFF_0_2));
// 2. Successful placement with partial overlap (same characters)
assertTrue(placeWord(grid, s, w1));
assertTrue(placeWord(grid, s.key(), s.lo(), s.hi(), w1));
// 3. Conflict: place "ABD" where "ABC" is
var w2 = ABD;
assertFalse(placeWord(grid, s, w2));
assertFalse(placeWord(grid, s.key(), s.lo(), s.hi(), w2));
// Verify grid is unchanged (still "ABC")
assertEquals(LETTER_A, grid.letter32At(OFF_0_0));
assertEquals(LETTER_B, grid.letter32At(OFF_0_1));
@@ -355,7 +355,7 @@ public class SwedishGeneratorTest {
// 4. Partial placement then conflict (rollback)
grid = createEmpty();
grid.setLetterLo(OFF_0_2, LETTER_X); // Conflict at the end
assertFalse(placeWord(grid, s, w1));
assertFalse(placeWord(grid, s.key(), s.lo(), s.hi(), w1));
// Verify grid is still empty (except for 'X')
assertFalse(grid.lisLetterAtLo(OFF_0_0));
assertFalse(grid.lisLetterAtLo(OFF_0_1));
@@ -366,13 +366,13 @@ public class SwedishGeneratorTest {
void testBacktrackingHelpers() {
var grid = createEmpty();
// Slot at 0,1 length 2
var key = (OFF_0_0 << Slot.BIT_FOR_DIR) | (CLUE_RIGHT);
var lo = (1L << OFF_0_1) | (1L << OFF_0_2);
var s = Slot.from(key, lo, 0L);
var w = AZ;
val low = grid.lo;
val top = grid.hi;
var placed = placeWord(grid, s, w);
var key = (OFF_0_0 << Slot.BIT_FOR_DIR) | (CLUE_RIGHT);
var lo = (1L << OFF_0_1) | (1L << OFF_0_2);
var s = Slot.from(key, lo, 0L);
var w = AZ;
val low = grid.lo;
val top = grid.hi;
var placed = placeWord(grid, s.key(), s.lo(), s.hi(), w);
assertTrue(placed);
assertEquals(LETTER_A, grid.letter32At(OFF_0_1));
assertEquals(LETTER_Z, grid.letter32At(OFF_0_2));
@@ -392,10 +392,10 @@ public class SwedishGeneratorTest {
assertTrue(Slot.increasing(CLUE_DOWN)); // Down
assertFalse(Slot.increasing(CLUE_UP)); // Up
var sInc = Slot.from((0 << Slot.BIT_FOR_DIR) | CLUE_RIGHT, 1L, 0L);
assertTrue(sInc.increasing());
var sDec = Slot.from((0 << Slot.BIT_FOR_DIR) | CLUE_LEFT, 1L, 0L);
assertFalse(sDec.increasing());
var sInc = Slot.from((0) | CLUE_RIGHT, 1L, 0L);
assertTrue(Slot.increasing(sInc.key()));
var sDec = Slot.from((0) | CLUE_LEFT, 1L, 0L);
assertFalse(Slot.increasing(sDec.key()));
// 2. Test slotScore
val counts = new byte[SIZE];