From 282ec56f19532f844086a58ce48d4fef64c3221d Mon Sep 17 00:00:00 2001 From: mike Date: Fri, 23 Jan 2026 22:17:13 +0100 Subject: [PATCH] redo --- src/main/java/puzzle/Export.java | 83 +++++-------------- src/main/java/puzzle/Main.java | 2 +- src/main/java/puzzle/Riddle.java | 36 ++++++++ src/test/java/puzzle/MainTest.java | 21 +++-- src/test/java/puzzle/MarkerTest.java | 32 +++---- src/test/java/puzzle/PerformanceTest.java | 7 +- .../java/puzzle/SwedishGeneratorTest.java | 6 +- src/test/java/puzzle/TestDuplication.java | 6 +- 8 files changed, 95 insertions(+), 98 deletions(-) diff --git a/src/main/java/puzzle/Export.java b/src/main/java/puzzle/Export.java index e17b174..8bd056e 100644 --- a/src/main/java/puzzle/Export.java +++ b/src/main/java/puzzle/Export.java @@ -10,20 +10,12 @@ import puzzle.Riddle.ClueSign; import puzzle.Riddle.ExportedPuzzle; import puzzle.Riddle.Placed; import puzzle.Riddle.Rewards; -import puzzle.Riddle.Vestigium; +import puzzle.Riddle.Signa; import puzzle.Riddle.WordOut; import puzzle.SwedishGenerator.FillResult; import puzzle.SwedishGenerator.Grid; import puzzle.SwedishGenerator.Slotinfo; -import static precomp.Const9x8.CLUE_DOWN0; -import static precomp.Const9x8.CLUE_LEFT3; -import static precomp.Const9x8.CLUE_LEFT_TOP4; -import static precomp.Const9x8.CLUE_RIGHT1; -import static precomp.Const9x8.CLUE_RIGHT_TOP5; -import static precomp.Const9x8.CLUE_UP2; -import static puzzle.Clues.createEmpty; import static puzzle.Masker.Slot; -import static puzzle.Masker.isLo; import static puzzle.SwedishGenerator.X; @GenerateShapedCopies( @@ -33,22 +25,22 @@ import static puzzle.SwedishGenerator.X; ) public record Export() { - public static final ThreadLocal BYTES = ThreadLocal.withInitial(() -> new byte[8]); - @Shaped static final String INIT_GRID_OUTPUT = Const9x8.INIT_GRID_OUTPUT; - @Shaped static final int R = Const9x8.R; - @Shaped static final int C = Const9x8.C; - @Shaped static final byte[] INIT_GRID_OUTPUT_ARR = Const9x8.INIT_GRID_OUTPUT_ARR; - @Shaped static final byte[] INIT_GRID_OUTPUT_DASH_ARR = Const9x8.INIT_GRID_OUTPUT_DASH_ARR; - @Shaped static final long MASK_HI = Const9x8.MASK_HI; - @Shaped static final long MASK_LO = Const9x8.MASK_LO; + public record ExportTemplates(byte[] table, byte[] dashTable, byte[] wordBytes) { } - static int HI(int in) { return in | 64; } - static byte LETTER(int in) { return (byte) (in | 64); } - static byte CLUE_CHAR(int s) { return (byte) (s | 48); } - static int INDEX_ROW(int idx) { return idx % R; } - static int INDEX_COL(int idx) { return idx / R; } - static int INDEX(int r, int cols, int c) { return r * cols + c; } - static int INDEX(int idx, int cols) { return INDEX_ROW(idx) * cols + INDEX_COL(idx); } + @Shaped static final int R = Const9x8.R; + @Shaped static final int C = Const9x8.C; + @Shaped static final byte[] INIT_GRID_OUTPUT_ARR = Const9x8.INIT_GRID_OUTPUT_ARR; + @Shaped static final byte[] INIT_GRID_OUTPUT_DASH_ARR = Const9x8.INIT_GRID_OUTPUT_DASH_ARR; + @Shaped static final long MASK_HI = Const9x8.MASK_HI; + @Shaped static final long MASK_LO = Const9x8.MASK_LO; + public static final ThreadLocal BYTES = ThreadLocal.withInitial( + () -> new ExportTemplates(INIT_GRID_OUTPUT_ARR, INIT_GRID_OUTPUT_DASH_ARR, new byte[8])); + static int HI(int in) { return in | 64; } + static byte LETTER(int in) { return (byte) (in | 64); } + static byte CLUE_CHAR(int s) { return (byte) (s | 48); } + static int INDEX_ROW(int idx) { return idx % R; } + static int INDEX_COL(int idx) { return idx / R; } + static int INDEX(int idx, int cols) { return INDEX_ROW(idx) * cols + INDEX_COL(idx); } record Lettrix(int index, byte letter) { @@ -59,47 +51,18 @@ public record Export() { public int index(int cols) { return (row() * cols) + col(); } } public static String gridToString(Clues clues) { - val chars = INIT_GRID_OUTPUT_ARR.clone(); + val chars = BYTES.get().table(); new Signa(clues).forEach(v -> chars[INDEX(v.index(), C + 1)] = CLUE_CHAR(v.clue())); - return new String(chars); - } - public record Signa(@Delegate Clues c) { - - public static Signa of(Mask... cells) { return new Signa(createEmpty()).setClue(cells); } - public Signa setClue(Mask... cells) { - for (var cell : cells) { - if (isLo((cell.index()))) setClueLo(cell.lo(), cell.d()); - else setClueHi(cell.hi(), cell.d()); - } - return this; - } - - public Signa deepCopyGrid() { return new Signa(new Clues(c.lo, c.hi, c.vlo, c.vhi, c.rlo, c.rhi, c.xlo, c.xhi)); } - @Delegate public Stream stream() { - val stream = Stream.builder(); - for (var l = c.lo & ~c.xlo & ~c.rlo & c.vlo; l != X; l &= l - 1) stream.accept(new Vestigium(Long.numberOfTrailingZeros(l), CLUE_RIGHT1)); - for (var l = c.lo & ~c.xlo & ~c.rlo & ~c.vlo; l != X; l &= l - 1) stream.accept(new Vestigium(Long.numberOfTrailingZeros(l), CLUE_DOWN0)); - for (var l = c.lo & ~c.xlo & c.rlo & ~c.vlo; l != X; l &= l - 1) stream.accept(new Vestigium(Long.numberOfTrailingZeros(l), CLUE_UP2)); - for (var l = c.lo & ~c.xlo & c.rlo & c.vlo; l != X; l &= l - 1) stream.accept(new Vestigium(Long.numberOfTrailingZeros(l), CLUE_LEFT3)); - for (var l = c.lo & c.xlo & ~c.rlo & ~c.vlo; l != X; l &= l - 1) stream.accept(new Vestigium(Long.numberOfTrailingZeros(l), CLUE_LEFT_TOP4)); - for (var l = c.lo & c.xlo & ~c.rlo & c.vlo; l != X; l &= l - 1) stream.accept(new Vestigium(Long.numberOfTrailingZeros(l), CLUE_RIGHT_TOP5)); - - for (var h = c.hi & ~c.xhi & ~c.rhi & c.vhi; h != X; h &= h - 1) stream.accept(new Vestigium(HI(Long.numberOfTrailingZeros(h)), CLUE_RIGHT1)); - for (var h = c.hi & ~c.xhi & ~c.rhi & ~c.vhi; h != X; h &= h - 1) stream.accept(new Vestigium(HI(Long.numberOfTrailingZeros(h)), CLUE_DOWN0)); - for (var h = c.hi & ~c.xhi & c.rhi & ~c.vhi; h != X; h &= h - 1) stream.accept(new Vestigium(HI(Long.numberOfTrailingZeros(h)), CLUE_UP2)); - for (var h = c.hi & ~c.xhi & c.rhi & c.vhi; h != X; h &= h - 1) stream.accept(new Vestigium(HI(Long.numberOfTrailingZeros(h)), CLUE_LEFT3)); - for (var h = c.hi & c.xhi & ~c.rhi & ~c.vhi; h != X; h &= h - 1) stream.accept(new Vestigium(HI(Long.numberOfTrailingZeros(h)), CLUE_LEFT_TOP4)); - for (var h = c.hi & c.xhi & ~c.rhi & c.vhi; h != X; h &= h - 1) stream.accept(new Vestigium(HI(Long.numberOfTrailingZeros(h)), CLUE_RIGHT_TOP5)); - - return stream.build(); - } + val result = new String(chars); + new Signa(clues).forEach(v -> chars[INDEX(v.index(), C + 1)] = ' '); + return result; } record Puzzle(@Delegate Grid grid, Clues cl) implements Stream { public Puzzle(Clues clues) { this(Masker.toGrid(clues), clues); } - public Puzzle(Signa clues) { this(clues.c); } + public Puzzle(Signa clues) { this(clues.c()); } public @Delegate Stream stream() { val stream = Stream.builder(); for (var l = grid.lo & MASK_LO & ~cl.lo; l != X; l &= l - 1) stream.accept(Lettrix.from(Long.numberOfTrailingZeros(l), grid.g)); @@ -116,7 +79,7 @@ public record Export() { puzzle.stream().forEach((l) -> sb[l.index(C + 1)] = l.human()); return new String(sb); } - public String cluesGridToString() { return gridToString(clues.c); } + public String cluesGridToString() { return gridToString(clues.c()); } public String gridRenderHuman() { return String.join("\n", exportGrid(_ -> (byte) ' ', INIT_GRID_OUTPUT_DASH_ARR).split("\n")); } public String gridGridToString() { return exportGrid(d1 -> d1, INIT_GRID_OUTPUT_ARR); } public ExportedPuzzle exportFormatFromFilled(Rewards rewards, rci[] rcis) { @@ -159,7 +122,7 @@ public record Export() { var grid = new String(template).split("\n"); // 5) words output with cropped coordinates - val bytes = BYTES.get(); + val bytes = BYTES.get().wordBytes(); var wordsOut = Arrays.stream(placed).map(p -> new WordOut( p.lemma(), p.startRow() - MINR, diff --git a/src/main/java/puzzle/Main.java b/src/main/java/puzzle/Main.java index 400a258..93846a2 100644 --- a/src/main/java/puzzle/Main.java +++ b/src/main/java/puzzle/Main.java @@ -15,7 +15,7 @@ import puzzle.Riddle.WordOut; import puzzle.SwedishGenerator.Rng; import static puzzle.Export.Puzzle; import static puzzle.Export.PuzzleResult; -import static puzzle.Export.Signa; +import static puzzle.Riddle.Signa; import static puzzle.SwedishGenerator.Dict; import static puzzle.SwedishGenerator.Slotinfo; import static puzzle.SwedishGenerator.fillMask; diff --git a/src/main/java/puzzle/Riddle.java b/src/main/java/puzzle/Riddle.java index e0417ab..883f23a 100644 --- a/src/main/java/puzzle/Riddle.java +++ b/src/main/java/puzzle/Riddle.java @@ -10,6 +10,7 @@ import puzzle.SwedishGenerator.Slotinfo; import java.util.Arrays; import java.util.function.IntSupplier; import java.util.stream.IntStream; +import java.util.stream.Stream; import static precomp.Const9x8.CLUE_DOWN0; import static precomp.Const9x8.CLUE_LEFT3; import static precomp.Const9x8.CLUE_LEFT_TOP4; @@ -17,6 +18,9 @@ import static precomp.Const9x8.CLUE_NONE; import static precomp.Const9x8.CLUE_RIGHT1; import static precomp.Const9x8.CLUE_RIGHT_TOP5; import static precomp.Const9x8.CLUE_UP2; +import static puzzle.Clues.createEmpty; +import static puzzle.Masker.isLo; +import static puzzle.SwedishGenerator.X; public class Riddle { public static IntStream cellWalk(int base, long lo, long hi) { @@ -138,4 +142,36 @@ public class Riddle { byte replace(byte data); } + + public record Signa(@Delegate Clues c) { + + public static Signa of(Mask... cells) { return new Signa(createEmpty()).setClue(cells); } + public Signa setClue(Mask... cells) { + for (var cell : cells) { + if (isLo((cell.index()))) setClueLo(cell.lo(), cell.d()); + else setClueHi(cell.hi(), cell.d()); + } + return this; + } + + public Signa deepCopyGrid() { return new Signa(new Clues(c.lo, c.hi, c.vlo, c.vhi, c.rlo, c.rhi, c.xlo, c.xhi)); } + @Delegate public Stream stream() { + val stream = Stream.builder(); + for (var l = c.lo & ~c.xlo & ~c.rlo & c.vlo; l != X; l &= l - 1) stream.accept(new Vestigium(Long.numberOfTrailingZeros(l), CLUE_RIGHT1)); + for (var l = c.lo & ~c.xlo & ~c.rlo & ~c.vlo; l != X; l &= l - 1) stream.accept(new Vestigium(Long.numberOfTrailingZeros(l), CLUE_DOWN0)); + for (var l = c.lo & ~c.xlo & c.rlo & ~c.vlo; l != X; l &= l - 1) stream.accept(new Vestigium(Long.numberOfTrailingZeros(l), CLUE_UP2)); + for (var l = c.lo & ~c.xlo & c.rlo & c.vlo; l != X; l &= l - 1) stream.accept(new Vestigium(Long.numberOfTrailingZeros(l), CLUE_LEFT3)); + for (var l = c.lo & c.xlo & ~c.rlo & ~c.vlo; l != X; l &= l - 1) stream.accept(new Vestigium(Long.numberOfTrailingZeros(l), CLUE_LEFT_TOP4)); + for (var l = c.lo & c.xlo & ~c.rlo & c.vlo; l != X; l &= l - 1) stream.accept(new Vestigium(Long.numberOfTrailingZeros(l), CLUE_RIGHT_TOP5)); + + for (var h = c.hi & ~c.xhi & ~c.rhi & c.vhi; h != X; h &= h - 1) stream.accept(new Vestigium(Export.HI(Long.numberOfTrailingZeros(h)), CLUE_RIGHT1)); + for (var h = c.hi & ~c.xhi & ~c.rhi & ~c.vhi; h != X; h &= h - 1) stream.accept(new Vestigium(Export.HI(Long.numberOfTrailingZeros(h)), CLUE_DOWN0)); + for (var h = c.hi & ~c.xhi & c.rhi & ~c.vhi; h != X; h &= h - 1) stream.accept(new Vestigium(Export.HI(Long.numberOfTrailingZeros(h)), CLUE_UP2)); + for (var h = c.hi & ~c.xhi & c.rhi & c.vhi; h != X; h &= h - 1) stream.accept(new Vestigium(Export.HI(Long.numberOfTrailingZeros(h)), CLUE_LEFT3)); + for (var h = c.hi & c.xhi & ~c.rhi & ~c.vhi; h != X; h &= h - 1) stream.accept(new Vestigium(Export.HI(Long.numberOfTrailingZeros(h)), CLUE_LEFT_TOP4)); + for (var h = c.hi & c.xhi & ~c.rhi & c.vhi; h != X; h &= h - 1) stream.accept(new Vestigium(Export.HI(Long.numberOfTrailingZeros(h)), CLUE_RIGHT_TOP5)); + + return stream.build(); + } + } } diff --git a/src/test/java/puzzle/MainTest.java b/src/test/java/puzzle/MainTest.java index d613fed..ca6cf4d 100644 --- a/src/test/java/puzzle/MainTest.java +++ b/src/test/java/puzzle/MainTest.java @@ -8,7 +8,6 @@ import org.junit.jupiter.api.Test; import puzzle.Export.Lettrix; import puzzle.Export.Puzzle; import puzzle.Export.PuzzleResult; -import puzzle.Export.Signa; import puzzle.Main.Opts; import puzzle.Riddle.Rewards; import puzzle.SwedishGenerator.Rng; @@ -97,7 +96,7 @@ public class MainTest { }}; @Test void testExtractSlots() { - var clues = Signa.of(r0c0d1); + var clues = Riddle.Signa.of(r0c0d1); var grid = new Puzzle(clues); val g = grid.grid().g; GridBuilder.placeWord(grid.grid(), g, r0c0d1.slotKey, (1L << OFF_0_1) | (1L << OFF_0_2), 0, AB); @@ -125,7 +124,7 @@ public class MainTest { @Test void testForEachSlot() { var count = new AtomicInteger(0); - Masker.forEachSlot(Signa.of(r0c0d1).c(), (key, lo, hi) -> { + Masker.forEachSlot(Riddle.Signa.of(r0c0d1).c(), (key, lo, hi) -> { count.incrementAndGet(); assertEquals(8, Long.bitCount(lo) + Long.bitCount(hi)); assertEquals(0, Masker.IT[Long.numberOfTrailingZeros(lo)].r()); @@ -144,7 +143,7 @@ public class MainTest { } @Test public void testGridBasics() { - var clues = Signa.of(r2c1d2); + var clues = Riddle.Signa.of(r2c1d2); var grid = new Puzzle(clues); r1c1.or(r0c1).lo(); // Test set/get @@ -177,7 +176,7 @@ public class MainTest { } @Test public void testCluesDeepCopy() { - var clues = Signa.of(r0c0d1, r0c1d2, r1c0d3, r1c1d0); + var clues = Riddle.Signa.of(r0c0d1, r0c1d2, r1c0d3, r1c1d0); var copy = clues.deepCopyGrid(); var clueMap = clues.stream().collect(Collectors.toMap(Riddle.Vestigium::index, Riddle.Vestigium::clue)); @@ -190,11 +189,11 @@ public class MainTest { } @Test public void testMini() { - Assertions.assertTrue(Signa.of(r1c1d3).isClueLo(OFF_1_1)); + Assertions.assertTrue(Riddle.Signa.of(r1c1d3).isClueLo(OFF_1_1)); } @Test void testFiller2() { - var mask = Signa.of( + var mask = Riddle.Signa.of( r0c0d1, r0c3d0, r0c4d0, r0c5d0, r0c6d0, r0c7d0, r0c8d0, r1c0d1, @@ -204,7 +203,7 @@ public class MainTest { r5c0d3, r6c0d3, r7c0d2, r7c1d2, r7c2d2, r7c8d3 - ); + ); Assertions.assertEquals(20, mask.clueCount()); val map = mask.stream().collect(Collectors.toMap(Riddle.Vestigium::index, Riddle.Vestigium::clue)); Assertions.assertEquals(20, map.size()); @@ -216,7 +215,7 @@ public class MainTest { void testFiller() { System.out.println(DictData950.DICT950.index().length); val rng = new Rng(-343913721); - var mask = Signa.of( + var mask = Riddle.Signa.of( r0c3d3, r0c6d3, r0c7d0, r0c8d0, r1c1d1, r2c1d1, @@ -225,13 +224,13 @@ public class MainTest { r5c1d1, r6c1d1, r6c8d2, r7c0d2, r7c1d1, r7c4d2, r7c5d2, r7c8d3 - ); + ); var slotInfo = Masker.slots(mask.c(), DictData950.DICT950.index(), DictData950.DICT950.reversed()); var grid = Masker.grid(slotInfo); var filled = fillMask(rng, slotInfo, grid.lo, grid.hi, grid.g); Assertions.assertTrue(filled.ok(), "Puzzle generation failed (not ok)"); Assertions.assertEquals(17, Slotinfo.wordCount(0, slotInfo), "Number of assigned words changed"); - Assertions.assertEquals("BEADEMT", Lemma.asWord(slotInfo[0].assign().w, Export.BYTES.get())); + Assertions.assertEquals("BEADEMT", Lemma.asWord(slotInfo[0].assign().w, Export.BYTES.get().wordBytes())); Assertions.assertEquals(74732156493031040L, grid.lo); Assertions.assertEquals(193L, grid.hi); var g = new Puzzle(grid, mask.c()); diff --git a/src/test/java/puzzle/MarkerTest.java b/src/test/java/puzzle/MarkerTest.java index 799a4b6..c10fa49 100644 --- a/src/test/java/puzzle/MarkerTest.java +++ b/src/test/java/puzzle/MarkerTest.java @@ -4,7 +4,7 @@ import lombok.val; import org.junit.jupiter.api.Test; import puzzle.Export.Puzzle; import puzzle.Export.PuzzleResult; -import puzzle.Export.Signa; +import puzzle.Riddle.Signa; import puzzle.Riddle.Rewards; import puzzle.SwedishGenerator.Assign; import puzzle.SwedishGenerator.FillResult; @@ -99,14 +99,14 @@ public class MarkerTest { } @Test void testSimilarity() { - var a = Signa.of(r0c0d1, r2c1d0).c(); - var b = Signa.of(r0c0d1, r2c1d0).c(); + var a = Riddle.Signa.of(r0c0d1, r2c1d0).c(); + var b = Riddle.Signa.of(r0c0d1, r2c1d0).c(); // Identity assertEquals(1.0, Masker.similarity(a, b), 0.001); // Different direction - var c = Signa.of(r0c0d0, r2c1d0); + var c = Riddle.Signa.of(r0c0d0, r2c1d0); assertTrue(Masker.similarity(a, c.c()) < 1.0); // Completely different @@ -122,10 +122,10 @@ public class MarkerTest { assertTrue(masker.isValid(Clues.createEmpty())); // Valid clue: Right from (0,0) in 9x8 grid. Length is 8. - assertTrue(masker.isValid(Signa.of(r0c0d1).c())); + assertTrue(masker.isValid(Riddle.Signa.of(r0c0d1).c())); // Invalid clue: Right from (0,7) in 9x8 grid. Length is 1 (too short if MIN_LEN >= 2). - assertFalse(masker.isValid(Signa.of(r0c7d1).c())); + assertFalse(masker.isValid(Riddle.Signa.of(r0c7d1).c())); } @Test @@ -157,18 +157,18 @@ public class MarkerTest { // Clue 1: (0,0) Right. Slot cells: (0,1), (0,2), (0,3), (0,4), (0,5), (0,6), (0,7), (0,8) // Clue 2: (1,2) Up. Slot cells: (0,2) // Intersection is exactly 1 cell (0,2). Valid. - assertTrue(masker.isValid(Signa.of(r0c0d1, r2c2d2).c())); + assertTrue(masker.isValid(Riddle.Signa.of(r0c0d1, r2c2d2).c())); // Clue 3: (1,1) Right. Slot cells: (1,2), (1,3), ... // No intersection with Clue 1 or 2. Valid. - assertTrue(masker.isValid(Signa.of(r0c0d1, r2c2d2, r1c1d1).c())); + assertTrue(masker.isValid(Riddle.Signa.of(r0c0d1, r2c2d2, r1c1d1).c())); // Now create a violation: two slots sharing 2 cells. // We can do this with Corner Down and another clue. // Clue A: (0,0) Corner Down. Starts at (0,1) goes down: (0,1), (1,1), (2,1), (3,1), ... // Clue B: (0,2) Corner Down Left. Starts at (0,1) goes down: (0,1), (1,1), (2,1), ... // They share MANY cells starting from (0,1). - assertFalse(masker.isValid(Signa.of(r0c0d4, r0c2d5).c())); + assertFalse(masker.isValid(Riddle.Signa.of(r0c0d4, r0c2d5).c())); } @Test @@ -250,7 +250,7 @@ public class MarkerTest { } @Test void testCornerDownSlot() { - var clues = Signa.of(r0c0d4); + var clues = Riddle.Signa.of(r0c0d4); // Clue op (0,0), type 4 (Corner Down) assertEquals(r0c0d4.d, clues.getDir(r0c0d4.index)); @@ -274,14 +274,14 @@ public class MarkerTest { @Test void testCornerDownExtraction() { - var slots = Masker.slots(Signa.of(r0c0d4).c(), DictData950.DICT950); + var slots = Masker.slots(Riddle.Signa.of(r0c0d4).c(), DictData950.DICT950); assertEquals(1, slots.length); assertEquals(r0c0d4.d, Masker.Slot.dir(slots[0].key())); } @Test void testCornerDownLeftSlot() { - var clues = Signa.of(r0c1d5); + var clues = Riddle.Signa.of(r0c1d5); assertEquals(r0c1d5.d, clues.getDir(r0c1d5.index)); @@ -304,13 +304,13 @@ public class MarkerTest { @Test void testCornerDownLeftExtraction() { - var slots = Masker.slots(Signa.of(r0c1d5).c(), DictData950.DICT950.index(), DictData950.DICT950.reversed()); + var slots = Masker.slots(Riddle.Signa.of(r0c1d5).c(), DictData950.DICT950.index(), DictData950.DICT950.reversed()); assertEquals(1, slots.length); assertEquals(r0c1d5.d, Masker.Slot.dir(slots[0].key())); } @Test void testExportFormatFromFilled() { - val clues = Signa.of(r0c0d1, r0c5d3); + val clues = Riddle.Signa.of(r0c0d1, r0c5d3); var grid = new Puzzle(clues); // key = (cellIndex << 2) | (direction) @@ -378,7 +378,7 @@ public class MarkerTest { @Test void testShardToClue() { - var bytes = Export.BYTES.get(); + var bytes = Export.BYTES.get().wordBytes(); for (var length = 2; length <= 8; length++) { val entry = DictData950.DICT950.index()[length]; if (entry == null) continue; @@ -399,7 +399,7 @@ public class MarkerTest { @Test void testSpecificWords() { // These words are known to be in the CSV and likely in the dictionary - var bytes = Export.BYTES.get(); + var bytes = Export.BYTES.get().wordBytes(); var testWords = new String[]{ "EEN", "NAAR", "IEDEREEN" }; for (var wStr : testWords) { var w = Lemma.from(wStr); diff --git a/src/test/java/puzzle/PerformanceTest.java b/src/test/java/puzzle/PerformanceTest.java index 69895c9..abc1c7c 100644 --- a/src/test/java/puzzle/PerformanceTest.java +++ b/src/test/java/puzzle/PerformanceTest.java @@ -5,7 +5,6 @@ import anno.DictGen; import anno.Dictionaries; import lombok.val; import org.junit.jupiter.api.Test; -import puzzle.Export.Signa; import puzzle.SwedishGenerator.Rng; import puzzle.SwedishGenerator.Slotinfo; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -113,7 +112,7 @@ public class PerformanceTest { void testIncrementalComplexity() { // Use the complex mask from Main.java - var mask = Signa.of( + var mask = Riddle.Signa.of( r0c0d1, r0c5d0, r0c6d0, r0c7d0, r0c8d0, r1c0d1, r2c0d0, r2c1d0, r2c3d0, r2c4d1, @@ -122,7 +121,7 @@ public class PerformanceTest { r5c2d2, r5c4d1, r6c2d1, r7c0d2, r7c1d2, r7c2d1, r7c7d2, r7c8d2 - ); + ); val allSlots = Masker.slots(mask.c(), DICT900); //mask.toGrid() System.out.println("[DEBUG_LOG] \n--- Incremental Complexity Test ---"); @@ -143,7 +142,7 @@ public class PerformanceTest { val rng = new Rng(42); // A single horizontal slot at (0,0) - val mask = Signa.of(r0c0d1); + val mask = Riddle.Signa.of(r0c0d1); val slots = Masker.slots(mask.c(), DICT800); System.out.println("[DEBUG_LOG] \n--- Single Slot Resolution ---"); diff --git a/src/test/java/puzzle/SwedishGeneratorTest.java b/src/test/java/puzzle/SwedishGeneratorTest.java index a7d71f0..5040541 100644 --- a/src/test/java/puzzle/SwedishGeneratorTest.java +++ b/src/test/java/puzzle/SwedishGeneratorTest.java @@ -11,7 +11,7 @@ import precomp.Neighbors9x8; import puzzle.DictJavaGeneratorMulti.DictEntryDTO.IntListDTO; import puzzle.Export.Lettrix; import puzzle.Export.Puzzle; -import puzzle.Export.Signa; +import puzzle.Riddle.Signa; import puzzle.Masker.Slot; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -126,7 +126,7 @@ public class SwedishGeneratorTest { @Test void testPatternForSlotAllLetters() { - var grid = new Puzzle(Signa.of(r0c0d1)); + var grid = new Puzzle(Riddle.Signa.of(r0c0d1)); GridBuilder.placeWord(grid.grid(), grid.grid().g, r0c0d1.slotKey, r0c1.or(r0c2).or(r0c3).lo(), X, ABC); val map = grid.collect(Collectors.toMap(Lettrix::index, Lettrix::letter)); assertEquals(LETTER_A, map.get(OFF_0_1)); @@ -246,7 +246,7 @@ public class SwedishGeneratorTest { void testForEachSlotAndExtractSlots() { // This should detect a slot starting at 0,1 with length 2 (0,1 and 0,2) var dict = DictJavaGeneratorMulti.Dicts.makeDict(WORDS2); - var slots = Masker.extractSlots(Signa.of(r0c0d1).c(), dict.index(), dict.reversed()); + var slots = Masker.extractSlots(Riddle.Signa.of(r0c0d1).c(), dict.index(), dict.reversed()); assertEquals(1, slots.length); var s = slots[0]; diff --git a/src/test/java/puzzle/TestDuplication.java b/src/test/java/puzzle/TestDuplication.java index 5cff99b..99fe1df 100644 --- a/src/test/java/puzzle/TestDuplication.java +++ b/src/test/java/puzzle/TestDuplication.java @@ -6,8 +6,8 @@ import gen.Test123X_Neighbors9x8; import lombok.val; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import puzzle.Export.Signa; import puzzle.Riddle.Rewards; +import puzzle.Riddle.Signa; import puzzle.SwedishGenerator.Rng; import puzzle.dict800_4.DictData800_4; import java.util.stream.Collectors; @@ -31,7 +31,7 @@ public class TestDuplication { } @Test void testFiller2() { - var mask = Signa.of( + var mask = Riddle.Signa.of( r0c0d4, r0c2d0, r1c0d1, r2c0d1, @@ -45,7 +45,7 @@ public class TestDuplication { grid.lo = Masker_Neighbors3x4.MASK_LO & ~mask.c().lo; grid.hi = Masker_Neighbors3x4.MASK_HI & ~mask.c().hi; var grid1 = new ExportX_Const3x4.Puzzle(grid, mask.c()); - var result = new ExportX_Const3x4.PuzzleResult(new ExportX_Const3x4.Signa(mask.c()), grid1, slots, filled); + var result = new ExportX_Const3x4.PuzzleResult(new Signa(mask.c()), grid1, slots, filled); if (filled.ok()) { System.out.println(filled); val res = result.exportFormatFromFilled(new Rewards(0, 0, 0), Masker_Neighbors3x4.IT);