diff --git a/src/main/java/puzzle/Export.java b/src/main/java/puzzle/Export.java index 1de8d19..60a310e 100644 --- a/src/main/java/puzzle/Export.java +++ b/src/main/java/puzzle/Export.java @@ -100,7 +100,7 @@ public record Export() { public String[] clue() { return lemma.clue(); } } - public record ExportedPuzzle(List gridv2, WordOut[] words, int difficulty, Rewards rewards) { } + public record ExportedPuzzle(String[] gridv2, WordOut[] words, int difficulty, Rewards rewards) { } public record PuzzleResult(SwedishGenerator swe, Dict dict, Gridded mask, FillResult filled) { @@ -154,13 +154,14 @@ public record Export() { // If nothing placed: return full grid mapped to letters/# only if (placed.isEmpty()) { - var gridv2 = new ArrayList(R); + var gridv2 = new String[R]; for (var r = 0; r < R; r++) { var sb = new StringBuilder(C); for (var c = 0; c < C; c++) { - sb.append(g.isLetterSet(r, c) ? (char) g.byteAt(Grid.offset(r, c)) : '#'); + int idx = Grid.offset(r, c); + sb.append(g.isLetterSet(idx) ? (char) g.byteAt(idx) : '#'); } - gridv2.add(sb.toString()); + gridv2[r] = sb.toString(); } return new ExportedPuzzle(gridv2, new WordOut[0], difficulty, rewards); } @@ -187,8 +188,8 @@ public record Export() { var letterAt = new HashMap(); for (var p : placed) { for (var c : p.cells) { - int rr = Grid.r(c), cc = Grid.c(c); - int idx = Grid.offset(rr,cc); + int rr = Grid.r(c), cc = Grid.c(c); + int idx = Grid.offset(rr, cc); if (inBounds(rr, cc) && g.isLetterSet(idx)) { letterAt.put(Bit.pack(rr, cc), (char) g.byteAt(idx)); } @@ -196,13 +197,13 @@ public record Export() { } // 4) render gridv2 over cropped bounds (out-of-bounds become '#') - var gridv2 = new ArrayList(Math.max(0, maxR - minR + 1)); - for (var r = minR; r <= maxR; r++) { + var gridv2 = new String[Math.max(0, maxR - minR + 1)]; + for (int r = minR, i = 0; r <= maxR; r++, i++) { var row = new StringBuilder(Math.max(0, maxC - minC + 1)); for (var c = minC; c <= maxC; c++) { row.append(letterAt.getOrDefault(Bit.pack(r, c), '#')); } - gridv2.add(row.toString()); + gridv2[i] = row.toString(); } // 5) words output with cropped coordinates diff --git a/src/main/java/puzzle/Main.java b/src/main/java/puzzle/Main.java index 5794184..5d08a37 100644 --- a/src/main/java/puzzle/Main.java +++ b/src/main/java/puzzle/Main.java @@ -387,9 +387,9 @@ public class Main { sb.append(" \"hints\": ").append(puzzle.rewards().hints()).append("\n"); sb.append(" },\n"); sb.append(" \"gridv2\": [\n"); - for (var i = 0; i < puzzle.gridv2().size(); i++) { - sb.append(" \"").append(escapeJson(puzzle.gridv2().get(i))).append("\""); - if (i < puzzle.gridv2().size() - 1) sb.append(","); + for (var i = 0; i < puzzle.gridv2().length; i++) { + sb.append(" \"").append(escapeJson(puzzle.gridv2()[i])).append("\""); + if (i < puzzle.gridv2().length - 1) sb.append(","); sb.append("\n"); } sb.append(" ],\n"); diff --git a/src/test/java/puzzle/ExportFormatTest.java b/src/test/java/puzzle/ExportFormatTest.java index 291bc24..0d0571d 100644 --- a/src/test/java/puzzle/ExportFormatTest.java +++ b/src/test/java/puzzle/ExportFormatTest.java @@ -71,8 +71,8 @@ public class ExportFormatTest { // letterAt only contains letters from placed words. // arrow cells are NOT in letterAt unless they are also part of a word (unlikely). // So (0,0) should be '#' - assertEquals(1, exported.gridv2().size()); - assertEquals("#TEST", exported.gridv2().get(0)); + assertEquals(1, exported.gridv2().length); + assertEquals("#TEST", exported.gridv2()[0]); } @Test @@ -87,7 +87,7 @@ public class ExportFormatTest { assertNotNull(exported); assertEquals(0, exported.words().length); // Should return full grid with '#' - assertEquals(R, exported.gridv2().size()); + assertEquals(R, exported.gridv2().length); for (var row : exported.gridv2()) { assertEquals(C, row.length()); assertTrue(row.matches("#+"));