introduce bitloops
This commit is contained in:
@@ -3,7 +3,6 @@ package puzzle;
|
||||
import lombok.Getter;
|
||||
import lombok.val;
|
||||
import precomp.Neighbors9x8;
|
||||
import precomp.Neighbors9x8.nbrs_16;
|
||||
import precomp.Neighbors9x8.rci;
|
||||
import puzzle.Export.Bit;
|
||||
import puzzle.Export.Bit1029;
|
||||
@@ -19,6 +18,7 @@ import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.stream.IntStream;
|
||||
import static java.nio.charset.StandardCharsets.*;
|
||||
|
||||
/**
|
||||
@@ -58,7 +58,7 @@ public record SwedishGenerator(Rng rng) {
|
||||
static final char C_DASH = '\0';
|
||||
static final byte _1 = 49, _9 = 57, A = 65, Z = 90, DASH = (byte) C_DASH;
|
||||
static final ThreadLocal<Context> CTX = ThreadLocal.withInitial(Context::new);
|
||||
|
||||
|
||||
static int clamp(int x, int a, int b) { return Math.max(a, Math.min(b, x)); }
|
||||
record Pick(Slot slot, CandidateInfo info, boolean done) { }
|
||||
|
||||
@@ -108,7 +108,7 @@ public record SwedishGenerator(Rng rng) {
|
||||
stats.simplicity = clueMap.isEmpty() ? 0 : stats.simplicity / clueMap.size();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
static final class Context {
|
||||
@@ -186,10 +186,10 @@ public record SwedishGenerator(Rng rng) {
|
||||
if ((idx & 64) == 0) lo &= ~(1L << idx);
|
||||
else hi &= ~(1L << (idx & 63));
|
||||
}
|
||||
boolean isClue(long index) { return ((index & 64) == 0) ? ((lo >>> index) & 1L) != X : ((hi >>> (index & 63)) & 1L) != X; }
|
||||
boolean isClue(int index) { return ((index & 64) == 0) ? ((lo >>> index) & 1L) != X : ((hi >>> (index & 63)) & 1L) != X; }
|
||||
boolean notClue(long index) { return ((index & 64) == 0) ? ((lo >>> index) & 1L) == X : ((hi >>> (index & 63)) & 1L) == X; }
|
||||
boolean notClue(int index) { return ((index & 64) == 0) ? ((lo >>> index) & 1L) == X : ((hi >>> (index & 63)) & 1L) == X; }
|
||||
boolean isClue(long index) { return ((index & 64) == 0) ? ((lo >>> index) & 1L) != X : ((hi >>> (index & 63)) & 1L) != X; }
|
||||
boolean isClue(int index) { return ((index & 64) == 0) ? ((lo >>> index) & 1L) != X : ((hi >>> (index & 63)) & 1L) != X; }
|
||||
boolean notClue(long index) { return ((index & 64) == 0) ? ((lo >>> index) & 1L) == X : ((hi >>> (index & 63)) & 1L) == X; }
|
||||
boolean notClue(int index) { return ((index & 64) == 0) ? ((lo >>> index) & 1L) == X : ((hi >>> (index & 63)) & 1L) == X; }
|
||||
boolean clueless(int idx) {
|
||||
if ((idx & 64) == 0) {
|
||||
val test = (1L << idx);
|
||||
@@ -314,44 +314,18 @@ public record SwedishGenerator(Rng rng) {
|
||||
static record Slot(int key, long lo, long hi) {
|
||||
|
||||
static final int BIT_FOR_DIR = 3;
|
||||
static Slot from(int key, long lo, long hi) { return new Slot(key, lo, hi); }
|
||||
static Slot from(int key, long lo, long hi) { return new Slot(key, lo, hi); }
|
||||
|
||||
public int len() { return Long.bitCount(lo) + Long.bitCount(hi); }
|
||||
public int clueR() { return Grid.r((key >>> BIT_FOR_DIR)); }
|
||||
public int clueIndex() { return key >>> BIT_FOR_DIR; }
|
||||
public int clueC() { return Grid.c((key >>> BIT_FOR_DIR)); }
|
||||
public int dir() { return key & 7; }
|
||||
public boolean horiz() { return horiz(dir()); }
|
||||
public boolean reversed() { return (key & 2) == 0; }
|
||||
public boolean increasing() { return (key & 2) != 0; }
|
||||
public static boolean increasing(int dir) { return (dir & 2) != 0; }
|
||||
public int pos(int i) {
|
||||
if (increasing()) {
|
||||
int bcLo = Long.bitCount(lo);
|
||||
if (i < bcLo) {
|
||||
long temp = lo;
|
||||
for (int k = 0; k < i; k++) temp &= temp - 1;
|
||||
return Long.numberOfTrailingZeros(temp);
|
||||
} else {
|
||||
i -= bcLo;
|
||||
long temp = hi;
|
||||
for (int k = 0; k < i; k++) temp &= temp - 1;
|
||||
return 64 | Long.numberOfTrailingZeros(temp);
|
||||
}
|
||||
} else {
|
||||
int bcHi = Long.bitCount(hi);
|
||||
if (i < bcHi) {
|
||||
long temp = hi;
|
||||
for (int k = 0; k < i; k++) temp &= ~(1L << (63 - Long.numberOfLeadingZeros(temp)));
|
||||
return 64 | (63 - Long.numberOfLeadingZeros(temp));
|
||||
} else {
|
||||
i -= bcHi;
|
||||
long temp = lo;
|
||||
for (int k = 0; k < i; k++) temp &= ~(1L << (63 - Long.numberOfLeadingZeros(temp)));
|
||||
return 63 - Long.numberOfLeadingZeros(temp);
|
||||
}
|
||||
}
|
||||
}
|
||||
public int len() { return Long.bitCount(lo) + Long.bitCount(hi); }
|
||||
public int clueR() { return Grid.r((key >>> BIT_FOR_DIR)); }
|
||||
public int clueIndex() { return key >>> BIT_FOR_DIR; }
|
||||
public int clueC() { return Grid.c((key >>> BIT_FOR_DIR)); }
|
||||
public int dir() { return key & 7; }
|
||||
public boolean horiz() { return horiz(key); }
|
||||
public boolean reversed() { return (key & 2) == 0; }
|
||||
public boolean increasing() { return (key & 2) != 0; }
|
||||
public static boolean increasing(int dir) { return (dir & 2) != 0; }
|
||||
public IntStream walk() { return Gridded.walk((byte) key, lo, hi); }
|
||||
public static boolean horiz(int d) { return (d & 1) == 0; }
|
||||
public static int packSlotDir(int idx, int d) { return (idx << BIT_FOR_DIR) | d; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user