introduce bitloops

This commit is contained in:
mike
2026-01-14 10:39:06 +01:00
parent cb2935e0f5
commit 66bd8193ef
4 changed files with 32 additions and 14 deletions

View File

@@ -108,7 +108,10 @@ public record Export() {
}
}
//public boolean isLetterSet(int idx) { return isLetter(g[idx]); }
char NOT_CLUE_NOT_LETTER_TO(byte b, char fallback) { return b == SwedishGenerator.DASH ? fallback : (char) (64 | b); }
char NOT_CLUE_NOT_LETTER_TO(byte b, char fallback) {
if (b == SwedishGenerator.DASH) throw new RuntimeException();
return (char) (64 | b);
}
String gridToString(Clues clues) {
var sb = new StringBuilder();
for (var r = 0; r < R; r++) {
@@ -117,8 +120,10 @@ public record Export() {
var offset = Grid.offset(r, c);
if (clues.isClue(offset))
sb.append((char) (48 | clues.digitAt(offset)));
else
else if (grid.lisLetterAtLo(offset))
sb.append((char) (64 | grid.letter32At(offset)));
else
sb.append(' ');
}
}
return sb.toString();
@@ -140,8 +145,10 @@ public record Export() {
var offset = Grid.offset(r, c);
if (clues.isClue(offset)) {
sb.append(clueChar.replace(new Cell(grid, clues, offset, clues.digitAt(offset))));
} else {
} else if (grid.lisLetterAt(offset)) {
sb.append(NOT_CLUE_NOT_LETTER_TO(grid.letter32At(offset), emptyFallback));
} else {
sb.append(emptyFallback);
}
}
out[r] = sb.toString();
@@ -229,7 +236,8 @@ public record Export() {
var letterAt = new HashMap<Integer, Character>();
for (var p : placed) {
for (var c : p.cells) {
if (inBounds(c) && mask.notClue(c)) {
if (!inBounds(c)) throw new RuntimeException();
if (mask.notClue(c) && g.lisLetterAt(c)) {
letterAt.put(c, (char) (64 | g.letter32At(c)));
}
}

View File

@@ -285,6 +285,14 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) {
static int offset(int r, int c) { return r | (c << 3); }
/// the pos will never target a clue
public byte letter32At(int pos) { return g[pos]; }
public boolean lisLetterAt(int pos) {
if ((pos & 64) == 0)
return lisLetterAtLo(pos);
return lisLetterAtHi(pos);
}
public boolean lisLetterAtLo(int pos) { return (lo & (1L << pos)) != 0; }
public boolean lisLetterAtHi(int pos) { return (hi & (1L << (pos & 63))) != 0; }
void setLetterLo(int idx, byte ch) {
lo |= (1L << idx);
@@ -313,8 +321,11 @@ public record SwedishGenerator(Rng rng, int[] stack, Clues cache) {
hi &= ~(1L << (idx & 63));
}
void undoPlace(long maskLo, long maskHi) {
for (long b = maskLo; b != 0; b &= b - 1) clearletterLo(Long.numberOfTrailingZeros(b));
for (long b = maskHi; b != 0; b &= b - 1) clearletterHi(64 | Long.numberOfTrailingZeros(b));
lo &= ~maskLo;
hi &= ~maskHi;
/*for (long b = maskLo; b != 0; b &= b - 1) clearletterLo(Long.numberOfTrailingZeros(b));
for (long b = maskHi; b != 0; b &= b - 1) clearletterHi(64 | Long.numberOfTrailingZeros(b));*/
}
}