From 352e8c79caf0ce51f123c506468c3aab0c4b7d92 Mon Sep 17 00:00:00 2001 From: mike Date: Wed, 14 Jan 2026 08:04:17 +0100 Subject: [PATCH] introduce bitloops --- src/main/java/puzzle/Export.java | 27 ++++++++++++++++----------- src/main/java/puzzle/Main.java | 4 ++-- src/test/java/puzzle/MainTest.java | 2 +- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/puzzle/Export.java b/src/main/java/puzzle/Export.java index c4cc77e..3371a2b 100644 --- a/src/main/java/puzzle/Export.java +++ b/src/main/java/puzzle/Export.java @@ -110,32 +110,37 @@ public record Export() { } //public boolean isLetterSet(int idx) { return isLetter(g[idx]); } char NOT_CLUE_NOT_LETTER_TO(byte b, char fallback) { return isLetter(b) ? (char) b : fallback; } - String gridToString() { + String gridToString(Clues clues) { 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((char) grid.letter32At(Grid.offset(r, c))); + for (var c = 0; c < C; c++) { + var offset = Grid.offset(r, c); + if (clues.isClue(offset)) + sb.append((char) (48 | clues.digitAt(offset))); + else + sb.append((char) grid.letter32At(offset)); + } } return sb.toString(); } - public String renderHuman() { - return String.join("\n", exportGrid(_ -> ' ', '#')); + public String renderHuman(Clues clues) { + return String.join("\n", exportGrid(clues, _ -> ' ', '#')); } - public boolean notClue(int c) { return grid.notClue(c); } @FunctionalInterface interface Replacar { - record Cell(Grid grid, int index, byte data) { } + record Cell(Grid grid, Clues clues, int index, byte data) { } char replace(Cell c); } - public String[] exportGrid(Replacar clueChar, char emptyFallback) { + public String[] exportGrid(Clues clues, Replacar clueChar, char emptyFallback) { var out = new String[R]; for (var r = 0; r < R; r++) { var sb = new StringBuilder(C); for (var c = 0; c < C; c++) { var offset = Grid.offset(r, c); - if (grid.isClue(offset)) { - sb.append(clueChar.replace(new Cell(grid, offset, grid.letter32At(offset)))); + if (clues.isClue(offset)) { + sb.append(clueChar.replace(new Cell(grid, clues, offset, clues.digitAt(offset)))); } else { sb.append(NOT_CLUE_NOT_LETTER_TO(grid.letter32At(offset), emptyFallback)); } @@ -199,7 +204,7 @@ public record Export() { // If nothing placed: return full grid mapped to letters/# only if (placed.isEmpty()) { - return new ExportedPuzzle(g.exportGrid(_ -> '#', '#'), new WordOut[0], difficulty, rewards); + return new ExportedPuzzle(g.exportGrid(mask.mask, _ -> '#', '#'), new WordOut[0], difficulty, rewards); } // 2) bounding box around all word cells + arrow cells, with 1-cell margin @@ -224,7 +229,7 @@ public record Export() { var letterAt = new HashMap(); for (var p : placed) { for (var c : p.cells) { - if (inBounds(c) && g.notClue(c)) { + if (inBounds(c) && mask.notClue(c)) { letterAt.put(c, (char) g.letter32At(c)); } } diff --git a/src/main/java/puzzle/Main.java b/src/main/java/puzzle/Main.java index 1d543e1..871bc3a 100644 --- a/src/main/java/puzzle/Main.java +++ b/src/main/java/puzzle/Main.java @@ -94,10 +94,10 @@ public class Main { System.out.print(indentLines(res.mask().gridToString(), " ")); section("Grid (raw)"); - System.out.print(indentLines(res.filled().grid().gridToString(), " ")); + System.out.print(indentLines(res.filled().grid().gridToString(res.mask().mask()), " ")); section("Grid (human)"); - System.out.print(indentLines(res.filled().grid().renderHuman(), " ")); + System.out.print(indentLines(res.filled().grid().renderHuman(res.mask().mask()), " ")); var exported = res.exportFormatFromFilled(1, new Rewards(50, 2, 1)); diff --git a/src/test/java/puzzle/MainTest.java b/src/test/java/puzzle/MainTest.java index 6c99044..5c3b5df 100644 --- a/src/test/java/puzzle/MainTest.java +++ b/src/test/java/puzzle/MainTest.java @@ -198,7 +198,7 @@ public class MainTest { System.out.println("[DEBUG_LOG] Simplicity: " + res.filled().stats().simplicity); System.out.println("[DEBUG_LOG] ClueMap Size: " + res.filled().wordCount()); System.out.println("[DEBUG_LOG] Grid:"); - System.out.println(res.filled().grid().renderHuman()); + System.out.println(res.filled().grid().renderHuman(res.mask().mask())); break; } }