Gather data
This commit is contained in:
@@ -1,17 +1,13 @@
|
||||
package puzzle;
|
||||
|
||||
import lombok.experimental.Accessors;
|
||||
import lombok.*;
|
||||
import javax.naming.Context;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* SwedishGenerator.java
|
||||
@@ -21,23 +17,29 @@ import java.util.stream.Stream;
|
||||
* java SwedishGenerator [--seed N] [--pop N] [--gens N] [--tries N] [--words word-list.txt]
|
||||
*/
|
||||
@SuppressWarnings("ALL")
|
||||
public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff) {
|
||||
public record SwedishGenerator(int[] buff) {
|
||||
|
||||
public static final char C_DASH = '\0';
|
||||
static final byte _1 = 49, _9 = 57, A = 65, Z = 90, DASH = (byte) C_DASH;
|
||||
static final int W = Config.PUZZLE_COLS;
|
||||
static final int H = Config.PUZZLE_ROWS;
|
||||
static final int SIZE = W * H;
|
||||
static final int MAX_WORD_LENGTH = Math.min(W, H);
|
||||
static final int MIN_LEN = Config.MIN_LEN;
|
||||
static final int CLUE_SIZE = Config.CLUE_SIZE;
|
||||
static final int SIMPLICITY_DEFAULT_SCORE = 2;
|
||||
static final int MAX_TRIES_PER_SLOT = Config.MAX_TRIES_PER_SLOT;
|
||||
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 boolean isLetter(char ch) { return ch >= 'A' && ch <= 'Z'; }
|
||||
static int clamp(int x, int a, int b) { return Math.max(a, Math.min(b, x)); }
|
||||
static record CandidateInfo(int[] indices, int count) { }
|
||||
|
||||
static record nbrs_8(int x, int y) { }
|
||||
public SwedishGenerator() { this(new int[8124]); }
|
||||
|
||||
public SwedishGenerator(int W, int H) { this(W, H, W * H, Math.min(W, H), new int[10000]); }
|
||||
public SwedishGenerator() { this(9, 8); }
|
||||
|
||||
static final int CLUE_SIZE = 4,
|
||||
SIMPLICITY_DEFAULT_SCORE = 2;
|
||||
static final int MIN_LEN = 2;
|
||||
static final int MAX_TRIES_PER_SLOT = 2000;
|
||||
// Directions for '1'..'6'
|
||||
static final nbrs_8[] OFFSETS = new nbrs_8[7];
|
||||
static final nbrs_8[] STEPS = new nbrs_8[7];
|
||||
static final nbrs_8[] OFFSETS = new nbrs_8[7];
|
||||
static final nbrs_8[] STEPS = new nbrs_8[7];
|
||||
static {
|
||||
// 1: up
|
||||
OFFSETS[1] = new nbrs_8(-1, 0);
|
||||
@@ -58,7 +60,7 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
||||
OFFSETS[6] = new nbrs_8(0, 1);
|
||||
STEPS[6] = new nbrs_8(1, 0);
|
||||
}
|
||||
final static nbrs_8[] nbrs8 = new nbrs_8[]{
|
||||
final static nbrs_8[] nbrs8 = new nbrs_8[]{
|
||||
new nbrs_8(-1, -1),
|
||||
new nbrs_8(-1, 0),
|
||||
new nbrs_8(-1, 1),
|
||||
@@ -68,14 +70,12 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
||||
new nbrs_8(1, 0),
|
||||
new nbrs_8(1, 1)
|
||||
};
|
||||
static final nbrs_8[] nbrs4 = new nbrs_8[]{
|
||||
static final nbrs_8[] nbrs4 = new nbrs_8[]{
|
||||
new nbrs_8(-1, 0),
|
||||
new nbrs_8(1, 0),
|
||||
new nbrs_8(0, -1),
|
||||
new nbrs_8(0, 1)
|
||||
};
|
||||
static final char FIRST_ABC = 'A';
|
||||
static final char LAST_ABC = 'Z';
|
||||
|
||||
static record Context(int[] covH,
|
||||
int[] covV,
|
||||
@@ -89,10 +89,6 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
||||
public Context() { this(new int[256], new int[256], new int[256], new int[256], new BitSet(256), new char[32], new IntList[32], new long[2048]); }
|
||||
}
|
||||
|
||||
static final ThreadLocal<Context> CTX = ThreadLocal.withInitial(Context::new);
|
||||
|
||||
static boolean isLetter(char ch) { return ch >= FIRST_ABC && ch <= LAST_ABC; }
|
||||
|
||||
static final class Rng {
|
||||
|
||||
@Getter private int x;
|
||||
@@ -117,12 +113,9 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
||||
double nextFloat() { return (nextU32() & 0xFFFFFFFFL) / 4294967295.0; }
|
||||
}
|
||||
|
||||
static int clamp(int x, int a, int b) { return Math.max(a, Math.min(b, x)); }
|
||||
static record CandidateInfo(int[] indices, int count) { }
|
||||
|
||||
record Grid(byte[] g, int W) {
|
||||
record Grid(byte[] g) {
|
||||
|
||||
Grid deepCopyGrid() { return new Grid(g.clone(), W); }
|
||||
Grid deepCopyGrid() { return new Grid(g.clone()); }
|
||||
private int offset(int r, int c) { return r * W + c; }
|
||||
boolean isLettercell(int r, int c) { return !isDigitAt(r, c); }
|
||||
char getCharAt(int r, int c) { return (char) (g[offset(r, c)]); }
|
||||
@@ -135,7 +128,7 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
||||
return g.length / W;
|
||||
}
|
||||
}
|
||||
Grid makeEmptyGrid() { return new Grid(new byte[SIZE], W); }
|
||||
static Grid makeEmptyGrid() { return new Grid(new byte[SIZE]); }
|
||||
|
||||
String gridToString(Grid g) {
|
||||
var sb = new StringBuilder();
|
||||
@@ -364,14 +357,13 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
||||
long packedCs = 0;
|
||||
var n = 0;
|
||||
|
||||
while (rr >= 0 && rr < H && cc >= 0 && cc < W) {
|
||||
while (rr >= 0 && rr < H && cc >= 0 && cc < W && n < MAX_WORD_LENGTH) {
|
||||
if (grid.isDigitAt(rr, cc)) break;
|
||||
packedRs |= (long) rr << (n << 2);
|
||||
packedCs |= (long) cc << (n << 2);
|
||||
n++;
|
||||
rr += dr;
|
||||
cc += dc;
|
||||
if (n >= MAX_LEN) break;
|
||||
}
|
||||
if (n > 0) {
|
||||
visitor.visit((r << 8) | (c << 4) | d, packedRs, packedCs, n);
|
||||
@@ -392,12 +384,13 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
||||
int dr = STEPS[di].x, dc = STEPS[di].y;
|
||||
int rr = r + or, cc = c + oc;
|
||||
var run = 0;
|
||||
while (rr >= 0 && rr < H && cc >= 0 && cc < W && (grid.isLettercell(rr, cc)) && run < MAX_LEN) {
|
||||
while (rr >= 0 && rr < H && cc >= 0 && cc < W && (grid.isLettercell(rr, cc)) && run < MAX_WORD_LENGTH) {
|
||||
run++;
|
||||
rr += dr;
|
||||
cc += dc;
|
||||
if (run >= MIN_LEN) return true;
|
||||
}
|
||||
return run >= MIN_LEN;
|
||||
return false;
|
||||
}
|
||||
|
||||
long maskFitness(Grid grid, int[] lenCounts) {
|
||||
@@ -431,14 +424,13 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
||||
long packedCs = 0;
|
||||
var n = 0;
|
||||
|
||||
while (rr >= 0 && rr < H && cc >= 0 && cc < W) {
|
||||
while (rr >= 0 && rr < H && cc >= 0 && cc < W && n < MAX_WORD_LENGTH) {
|
||||
if (grid.isDigitAt(rr, cc)) break;
|
||||
packedRs |= (long) rr << (n << 2);
|
||||
packedCs |= (long) cc << (n << 2);
|
||||
n++;
|
||||
rr += dr;
|
||||
cc += dc;
|
||||
if (n >= MAX_LEN) break;
|
||||
}
|
||||
if (n == 0) continue;
|
||||
hasSlots = true;
|
||||
@@ -667,6 +659,7 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
||||
|
||||
@Data
|
||||
public static final class FillStats {
|
||||
|
||||
public long nodes;
|
||||
public long backtracks;
|
||||
public double seconds;
|
||||
@@ -678,10 +671,10 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
||||
boolean done) { }
|
||||
|
||||
public static record FillResult(boolean ok,
|
||||
Grid grid,
|
||||
HashMap<Integer, Lemma> clueMap,
|
||||
FillStats stats,
|
||||
double simplicity) {
|
||||
Grid grid,
|
||||
HashMap<Integer, Lemma> clueMap,
|
||||
FillStats stats,
|
||||
double simplicity) {
|
||||
|
||||
public FillResult(boolean ok, Grid grid, HashMap<Integer, Lemma> assigned, FillStats stats) {
|
||||
double totalSimplicity = 0;
|
||||
|
||||
Reference in New Issue
Block a user