Gather data
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user