From 5bfea6f11609da3533651970dcac0ad11cd82ae0 Mon Sep 17 00:00:00 2001 From: mike Date: Fri, 9 Jan 2026 03:11:49 +0100 Subject: [PATCH] Gather data --- src/main/java/puzzle/ExportFormat.java | 4 +- src/main/java/puzzle/SwedishGenerator.java | 54 ++++++++-------------- src/test/java/puzzle/MainTest.java | 5 -- 3 files changed, 21 insertions(+), 42 deletions(-) diff --git a/src/main/java/puzzle/ExportFormat.java b/src/main/java/puzzle/ExportFormat.java index e240c4b..e0f46bc 100644 --- a/src/main/java/puzzle/ExportFormat.java +++ b/src/main/java/puzzle/ExportFormat.java @@ -66,7 +66,7 @@ public record ExportFormat() { for (var r = 0; r < R; r++) { var sb = new StringBuilder(C); for (var c = 0; c < C; c++) { - sb.append(g.isLetterAt(r, c) ? g.getCharAt(r, c) : '#'); + sb.append(g.isLetterAt(r, c) ? (char) g.byteAt(r, c) : '#'); } gridv2.add(sb.toString()); } @@ -97,7 +97,7 @@ public record ExportFormat() { for (var c : p.cells) { int rr = Grid.r(c), cc = Grid.c(c); if (inBounds(rr, cc) && g.isLetterAt(rr, cc)) { - letterAt.put(pack(rr, cc), g.getCharAt(rr, cc)); + letterAt.put(pack(rr, cc), (char) g.byteAt(rr, cc)); } } } diff --git a/src/main/java/puzzle/SwedishGenerator.java b/src/main/java/puzzle/SwedishGenerator.java index d8628df..c0cfca8 100644 --- a/src/main/java/puzzle/SwedishGenerator.java +++ b/src/main/java/puzzle/SwedishGenerator.java @@ -1,5 +1,4 @@ package puzzle; - import lombok.Data; import lombok.Getter; import puzzle.ExportFormat.Bit; @@ -138,7 +137,6 @@ public record SwedishGenerator(int[] buff) { static int offset(int r, int c) { return r | (c << 3); } Grid deepCopyGrid() { return new Grid(g.clone()); } char getCharAt(int r, int c) { return (char) (g[offset(r, c)]); } - char getCharAt(int pos) { return (char) (g[pos]); } byte byteAt(int r, int c) { return g[offset(r, c)]; } byte byteAt(int pos) { return g[pos]; } byte byteAtStatic(int r, int c) { return g[offset(r, c)]; } @@ -167,7 +165,7 @@ public record SwedishGenerator(int[] buff) { var sb = new StringBuilder(); for (var r = 0; r < R; r++) { if (r > 0) sb.append('\n'); - for (var c = 0; c < C; c++) sb.append(g.getCharAt(r, c)); + for (var c = 0; c < C; c++) sb.append((char) g.byteAt(r, c)); } return sb.toString(); } @@ -177,7 +175,7 @@ public record SwedishGenerator(int[] buff) { for (var r = 0; r < R; r++) { if (r > 0) sb.append('\n'); for (var c = 0; c < C; c++) { - sb.append(g.isDigitAt(r, c) ? ' ' : g.getCharAt(r, c)); + sb.append(g.isDigitAt(r, c) ? ' ' : (char) g.byteAt(r, c)); } } return sb.toString(); @@ -417,18 +415,6 @@ public record SwedishGenerator(int[] buff) { } return false; } - boolean hasRoomForClue(Grid grid, int r, int c, char d) { - var nbrs16 = OFFSETS[d - '0']; - int rr = r + nbrs16.r, cc = c + nbrs16.c; - var run = 0; - while (rr >= 0 && rr < R && cc >= 0 && cc < C && (grid.isLettercell(rr, cc)) && run < MAX_WORD_LENGTH) { - run++; - rr += nbrs16.dr; - cc += nbrs16.dc; - if (run >= MIN_LEN) return true; - } - return false; - } long maskFitness(Grid grid, int[] lenCounts) { long penalty = 0; @@ -479,16 +465,14 @@ public record SwedishGenerator(int[] buff) { if (!hasSlots) return 1_000_000_000L; int idx, h, v; - for (var r = 0; r < R; r++) - for (var c = 0; c < C; c++) { - idx = Grid.offset(r, c); - if (grid.isDigitAt(idx)) continue; - h = covH[idx]; - v = covV[idx]; - if (h == 0 && v == 0) penalty += 1500; - else if (h > 0 && v > 0) { /* ok */ } else if (h + v == 1) penalty += 200; - else penalty += 600; - } + for (idx = 0; idx < SIZE; idx++) { + if (grid.isDigitAt(idx)) continue; + h = covH[idx]; + v = covV[idx]; + if (h == 0 && v == 0) penalty += 1500; + else if (h > 0 && v > 0) { /* ok */ } else if (h + v == 1) penalty += 200; + else penalty += 600; + } // clue clustering (8-connected) var seen = ctx.seen; @@ -540,9 +524,9 @@ public record SwedishGenerator(int[] buff) { return penalty; } - Grid randomMask(Rng rng) { - var g = makeEmptyGrid(); - int placed = 0, guard = 0; + SwedishGenerator.Grid randomMask(SwedishGenerator.Rng rng) { + var g = makeEmptyGrid(); + int placed = 0, guard = 0; while (placed < TARGET_CLUES && guard++ < 4000) { var idx = Grid.offset(rng.randint(0, R - 1), @@ -592,7 +576,7 @@ public record SwedishGenerator(int[] buff) { for (var r = 0; r < R; r++) for (var c = 0; c < C; c++) { - if (out.isDigitAt(r, c) && !hasRoomForClue(out, r, c, out.getCharAt(r, c))) out.clear(r, c); + if (out.isDigitAt(r, c) && !hasRoomForClue(out, Grid.offset(r, c), OFFSETS[out.digitAt(r, c)])) out.clear(r, c); } return out; } @@ -730,11 +714,11 @@ public record SwedishGenerator(int[] buff) { public int lastMRV; } - record Pick(Slot slot, CandidateInfo info, boolean done) { } + record Pick(SwedishGenerator.Slot slot, SwedishGenerator.CandidateInfo info, boolean done) { } public static record FillResult(boolean ok, Grid grid, - HashMap clueMap, + HashMap clueMap, FillStats stats, double simplicity) { @@ -766,7 +750,7 @@ public record SwedishGenerator(int[] buff) { int idx = s.pos(i); var cur = grid.byteAt(idx); var ch = w.byteAt(i); - if (cur == C_DASH) { + if (cur == DASH) { mask |= (1 << i); grid.setByteAt(idx, ch); } else if (cur != ch) { @@ -782,7 +766,7 @@ public record SwedishGenerator(int[] buff) { return 1; } - public FillResult fillMask(Rng rng, Grid mask, DictEntry[] dictIndex, + public FillResult fillMask(Rng rng, Grid mask, SwedishGenerator.DictEntry[] dictIndex, int logEveryMs, int timeLimitMs, boolean verbose) { boolean multiThreaded = Thread.currentThread().getName().contains("pool"); var grid = mask.deepCopyGrid(); @@ -938,7 +922,7 @@ public record SwedishGenerator(int[] buff) { boolean match = true; for (var i = 0; i < patLen; i++) { - if (pat[i] != C_DASH && pat[i] != w.byteAt(i)) { + if (pat[i] != DASH && pat[i] != w.byteAt(i)) { match = false; break; } diff --git a/src/test/java/puzzle/MainTest.java b/src/test/java/puzzle/MainTest.java index ca1d4c9..6531ca5 100644 --- a/src/test/java/puzzle/MainTest.java +++ b/src/test/java/puzzle/MainTest.java @@ -1,19 +1,14 @@ package puzzle; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import puzzle.Main.PuzzleResult; -import puzzle.SwedishGenerator.Dict; -import puzzle.SwedishGenerator.Lemma; import puzzle.SwedishGenerator.Rng; import puzzle.SwedishGenerator.Slot; import java.util.concurrent.atomic.AtomicInteger; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import static puzzle.Main.indentLines; -import static puzzle.SwedishGenerator.C_DASH; import static puzzle.SwedishGenerator.DASH; public class MainTest {