diff --git a/src/main/java/puzzle/ExportFormat.java b/src/main/java/puzzle/ExportFormat.java index c754661..725387b 100644 --- a/src/main/java/puzzle/ExportFormat.java +++ b/src/main/java/puzzle/ExportFormat.java @@ -81,7 +81,7 @@ public final class ExportFormat { for (var p : placed) { for (var rc : p.cells) { int rr = rc[0], cc = rc[1]; - if (inBounds(H, W, rr, cc) && isLetter(g.getCharAt(rr, cc))) { + if (inBounds(H, W, rr, cc) && g.isLetterAt(rr, cc)) { letterAt.put(pack(rr, cc), g.getCharAt(rr, cc)); } } diff --git a/src/main/java/puzzle/SwedishGenerator.java b/src/main/java/puzzle/SwedishGenerator.java index 1344ced..73321af 100644 --- a/src/main/java/puzzle/SwedishGenerator.java +++ b/src/main/java/puzzle/SwedishGenerator.java @@ -82,52 +82,39 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN) { static int clamp(int x, int a, int b) { return Math.max(a, Math.min(b, x)); } - static final int BITS_PER_CELL = 1; - record Grid(byte[] g, int H, int W) { Grid deepCopyGrid() { return new Grid(g.clone(), H, W); } - int getOffset(int r, int c) { return (r * W + c) * BITS_PER_CELL; } + int getOffset(int r, int c) { return r * W + c; } - int getCellValue(int r, int c) { - int offset = getOffset(r, c); - int val = g[offset]; - return val; + boolean isLettercell(int r, int c) { + return isLetterCell(getCharAt(r,c)); } - char getCharAt(int r, int c) { - int val = getCellValue(r, c); - if (val == 0) return '#'; - if (val >= 1 && val <= 26) return (char) ('A' + val - 1); - if (val >= 27 && val <= 32) return (char) ('1' + val - 27); - return 0; + return (char) (g[getOffset(r, c)] & 0xFF); } void setCharAt(int r, int c, char ch) { - int offset = getOffset(r, c); - int val = 0; - if (ch >= 'A' && ch <= 'Z') val = ch - 'A' + 1; - else if (ch == '#') val = 0; - else if (ch >= '1' && ch <= '6') val = ch - '1' + 27; - g[offset] = (byte) val; + g[getOffset(r, c)] = (byte) ch; } boolean isLetterAt(int r, int c) { - int val = getCellValue(r, c); - return val >= 1 && val <= 26; + char ch = getCharAt(r, c); + return ch >= 'A' && ch <= 'Z'; } boolean isDigitAt(int r, int c) { - int val = getCellValue(r, c); - return val >= 27 && val <= 32; + char ch = getCharAt(r, c); + return ch >= '1' && ch <= '6'; } } // ---------------- Grid helpers ---------------- Grid makeEmptyGrid() { - var g = new byte[H * W];// * BITS_PER_CELL); + var g = new byte[H * W]; + Arrays.fill(g, (byte) '#'); return new Grid(g, H, W); } @@ -374,7 +361,7 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN) { int dr = STEPS[di][0], dc = STEPS[di][1]; int rr = r + or, cc = c + oc; var run = 0; - while (rr >= 0 && rr < H && cc >= 0 && cc < W && isLetterCell(grid.getCharAt(rr, cc)) && run < MAX_LEN) { + while (rr >= 0 && rr < H && cc >= 0 && cc < W && (grid.isLettercell(rr, cc)) && run < MAX_LEN) { run++; rr += dr; cc += dc; @@ -684,17 +671,16 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN) { for (var i = 0; i < s.len; i++) { int r = s.rs[i], c = s.cs[i]; - int val = grid.getCellValue(r, c); + char cur = grid.getCharAt(r, c); var ch = w.charAt(i); - if (val == 0) { // '#' + if (cur == '#') { urs[n] = r; ucs[n] = c; up[n] = '#'; n++; grid.setCharAt(r, c, ch); } else { - int targetVal = ch - 'A' + 1; - if (val != targetVal) { + if (cur != ch) { // rollback immediate changes for (var j = 0; j < n; j++) grid.setCharAt(urs[j], ucs[j], up[j]); return null;