introduce bitloops

This commit is contained in:
mike
2026-01-16 22:46:04 +01:00
parent ecbc408cce
commit 91722ecc60
4 changed files with 202 additions and 124 deletions

View File

@@ -18,6 +18,11 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static puzzle.SwedishGenerator.*;
import static puzzle.SwedishGeneratorTest.*;
import static puzzle.SwedishGeneratorTest.Idx.IDX_0_0;
import static puzzle.SwedishGeneratorTest.Idx.IDX_0_1;
import static puzzle.SwedishGeneratorTest.Idx.IDX_1_0;
import static puzzle.SwedishGeneratorTest.Idx.IDX_1_1;
import static puzzle.SwedishGeneratorTest.Idx.IDX_2_1;
import static puzzle.SwedishGeneratorTest.OFF_0_0;
import static puzzle.SwedishGeneratorTest.OFF_0_1;
import static puzzle.SwedishGeneratorTest.OFF_0_2;
@@ -41,7 +46,7 @@ public class MainTest {
var clues = Clues.createEmpty();
val key = Slot.packSlotKey(OFF_0_0, CLUE_RIGHT);
clues.setClue(OFF_0_0, CLUE_RIGHT);
clues.setClueLo(IDX_0_0.lo, CLUE_RIGHT);
var grid = new Gridded(clues.toGrid());
val g = grid.grid().g;
placeWord(grid.grid(), g, key, (1L << OFF_0_1) | (1L << OFF_0_2), 0, AB);
@@ -69,7 +74,7 @@ public class MainTest {
@Test
void testForEachSlot() {
var clues = Clues.createEmpty();
clues.setClue(OFF_0_0, CLUE_RIGHT);
clues.setClueLo(IDX_0_0.lo, CLUE_RIGHT);
var count = new AtomicInteger(0);
clues.forEachSlot((key, lo, hi) -> {
count.incrementAndGet();
@@ -90,7 +95,7 @@ public class MainTest {
public void testGridBasics() {
var clues = Clues.createEmpty();
val key = Slot.packSlotKey(OFF_2_1, CLUE_UP);
clues.setClue(OFF_2_1, CLUE_UP);
clues.setClueLo(IDX_2_1.lo, CLUE_UP);
var grid = new Gridded(clues.toGrid());
// Test set/get
@@ -98,47 +103,47 @@ public class MainTest {
val arr = grid.stream(clues).collect(Collectors.toMap(LetterAt::index, LetterAt::letter));
Assertions.assertEquals(LETTER_A, arr.get(OFF_1_1));
Assertions.assertEquals(LETTER_Z, arr.get(OFF_0_1));
Assertions.assertEquals(CLUE_UP, clues.digitAt(OFF_2_1));
Assertions.assertEquals(CLUE_UP, (byte) clues.digitAtLo(OFF_2_1));
// Test isLetterAt
Assertions.assertTrue(clues.notClue(OFF_0_0));
Assertions.assertTrue(clues.notClue(OFF_1_2));
Assertions.assertTrue(clues.notClue(OFF_2_3));
Assertions.assertFalse(clues.isClue(OFF_1_1));
Assertions.assertFalse(clues.isClueLo(OFF_1_1));
// Test isDigitAt
Assertions.assertFalse(clues.isClue(0));
Assertions.assertTrue(clues.isClue(OFF_2_1));
Assertions.assertEquals(CLUE_UP, clues.digitAt(OFF_2_1));
Assertions.assertFalse(clues.isClue(OFF_2_3));
Assertions.assertFalse(clues.isClue(OFF_1_1));
Assertions.assertFalse(clues.isClueLo(OFF_0_0));
Assertions.assertTrue(clues.isClueLo(OFF_2_1));
Assertions.assertEquals(CLUE_UP, (byte) clues.digitAtLo(OFF_2_1));
Assertions.assertFalse(clues.isClueLo(OFF_2_3));
Assertions.assertFalse(clues.isClueLo(OFF_1_1));
// Test isLettercell
Assertions.assertTrue(clues.notClue(OFF_0_0)); // 'A' is letter
Assertions.assertTrue(clues.isClue(OFF_2_1)); // digit
Assertions.assertTrue(clues.isClueLo(OFF_2_1)); // digit
Assertions.assertTrue(clues.notClue(OFF_1_1)); // '#' is lettercell
}
@Test
public void testCluesDeepCopy() {
var grid = Clues.createEmpty();
grid.setClue(OFF_0_0, (byte) 1);
grid.setClue(OFF_0_1, (byte) 2);
grid.setClue(OFF_1_0, (byte) 3);
grid.setClue(OFF_1_1, (byte) 0);
grid.setClueLo(IDX_0_0.lo, (byte) 1);
grid.setClueLo(IDX_0_1.lo, (byte) 2);
grid.setClueLo(IDX_1_0.lo, (byte) 3);
grid.setClueLo(IDX_1_1.lo, (byte) 0);
var copy = grid.deepCopyGrid();
Assertions.assertEquals((byte) 1, copy.digitAt(0));
Assertions.assertEquals(1, copy.digitAtLo(0));
copy.setClue(0, (byte) 3);
Assertions.assertEquals((byte) 3, copy.digitAt(0));
Assertions.assertEquals((byte) 1, grid.digitAt(0)); // Original should be unchanged
copy.setClueLo(IDX_0_0.lo, (byte) 3);
Assertions.assertEquals(3, copy.digitAtLo(0));
Assertions.assertEquals(1, grid.digitAtLo(0)); // Original should be unchanged
}
@Test
public void testMini() {
val idx = OFF_1_1;
val idx = IDX_1_1;
var clues = Clues.createEmpty();
clues.setClue(idx, CLUE_LEFT);
Assertions.assertTrue(clues.isClue(idx));
clues.setClueLo(idx.lo, CLUE_LEFT);
Assertions.assertTrue(clues.isClueLo(idx.index));
}
@Test
void testMaskerCreation() {