introduce bitloops

This commit is contained in:
mike
2026-01-12 21:29:06 +01:00
parent 4784fa7180
commit 8e7b29a2d3
6 changed files with 27 additions and 12 deletions

View File

@@ -68,6 +68,7 @@ public final class CsvIndexService
return lineToSimpel(SC.get().getLine(index)); return lineToSimpel(SC.get().getLine(index));
return -1; return -1;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Failed to get clues for index " + index, e); throw new RuntimeException("Failed to get clues for index " + index, e);
} }
} }
@@ -77,6 +78,7 @@ public final class CsvIndexService
return lineToClue(SC.get().getLine(index)); return lineToClue(SC.get().getLine(index));
return new String[0]; return new String[0];
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Failed to get clues for index " + index, e); throw new RuntimeException("Failed to get clues for index " + index, e);
} }
} }

View File

@@ -159,15 +159,17 @@ public record Export() {
public void clear() { Arrays.fill(bits, 0L); } public void clear() { Arrays.fill(bits, 0L); }
} }
record Placed(long lemma, char direction, int slotKey, int[] cells) { record Placed(long lemma, int slotKey, int[] cells) {
public static final char HORIZONTAL = 'h'; static final char[] DIRECTION = { '\0', Placed.VERTICAL, Placed.HORIZONTAL, Placed.VERTICAL, Placed.HORIZONTAL, Placed.VERTICAL };
static final char VERTICAL = 'v'; public static final char HORIZONTAL = 'h';
static final char VERTICAL = 'v';
public int arrowCol() { return Grid.c(Slot.clueIndex(slotKey)); } public int arrowCol() { return Grid.c(Slot.clueIndex(slotKey)); }
public int arrowRow() { return Grid.r(Slot.clueIndex(slotKey)); } public int arrowRow() { return Grid.r(Slot.clueIndex(slotKey)); }
public int startRow() { return Grid.r(cells[0]); } public int startRow() { return Grid.r(cells[0]); }
public int startCol() { return Grid.c(cells[0]); } public int startCol() { return Grid.c(cells[0]); }
public boolean isReversed() { return !Slot.increasing(slotKey); } public boolean isReversed() { return !Slot.increasing(slotKey); }
public char direction() { return DIRECTION[Slot.dir(slotKey)]; }
} }
public record Rewards(int coins, int stars, int hints) { } public record Rewards(int coins, int stars, int hints) { }
@@ -185,15 +187,11 @@ public record Export() {
boolean inBounds(int idx) { return idx >= 0 && idx < SwedishGenerator.SIZE; } boolean inBounds(int idx) { return idx >= 0 && idx < SwedishGenerator.SIZE; }
Placed extractPlacedFromSlot(Slot s, long lemma) { Placed extractPlacedFromSlot(Slot s, long lemma) {
var d = s.dir();
var cells = s.walk().toArray(); var cells = s.walk().toArray();
char[] DIRECTION = { '\0', Placed.VERTICAL, Placed.HORIZONTAL, Placed.VERTICAL, Placed.HORIZONTAL, Placed.VERTICAL };
return new Placed( return new Placed(
lemma, lemma,
DIRECTION[d],
s.key(), s.key(),
cells cells
); );
@@ -258,7 +256,7 @@ public record Export() {
p.lemma, p.lemma,
p.startRow() - MIN_R, p.startRow() - MIN_R,
p.startCol() - MIN_C, p.startCol() - MIN_C,
p.direction, p.direction(),
p.arrowRow() - MIN_R, p.arrowRow() - MIN_R,
p.arrowCol() - MIN_C, p.arrowCol() - MIN_C,
p.isReversed() p.isReversed()

View File

@@ -82,6 +82,7 @@ public final class HintScores {
try { try {
score = scoreFn.applyAsInt(word); score = scoreFn.applyAsInt(word);
} catch (RuntimeException ex) { } catch (RuntimeException ex) {
ex.printStackTrace();
// If scoring fails, decide your policy: skip or set 0. // If scoring fails, decide your policy: skip or set 0.
// Here: skip row. // Here: skip row.
continue; continue;

View File

@@ -125,6 +125,7 @@ public class Main {
else rebuildIndex(); else rebuildIndex();
info("indexUpdated : " + INDEX_FILE); info("indexUpdated : " + INDEX_FILE);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace();
err("Failed to write: " + FILE_NAME); err("Failed to write: " + FILE_NAME);
err("Reason : " + e.getMessage()); err("Reason : " + e.getMessage());
System.exit(2); System.exit(2);
@@ -344,6 +345,15 @@ public class Main {
} }
static PuzzleResult attempt(Rng rng, Dict dict, Opts opts) { static PuzzleResult attempt(Rng rng, Dict dict, Opts opts) {
try {
return _attempt(rng, dict, opts);
} catch (Exception e) {
e.printStackTrace();
System.err.println("Failed to operate" + e.getMessage());
return null;
}
}
static PuzzleResult _attempt(Rng rng, Dict dict, Opts opts) {
TOTAL_ATTEMPTS.incrementAndGet(); TOTAL_ATTEMPTS.incrementAndGet();
var swe = new SwedishGenerator(rng); var swe = new SwedishGenerator(rng);
var mask = swe.generateMask(opts.pop, opts.gens, Math.max(opts.pop, (int) Math.floor(opts.pop * 1.5))); var mask = swe.generateMask(opts.pop, opts.gens, Math.max(opts.pop, (int) Math.floor(opts.pop * 1.5)));
@@ -422,6 +432,7 @@ public class Main {
Files.writeString(indexPath, content, StandardCharsets.UTF_8); Files.writeString(indexPath, content, StandardCharsets.UTF_8);
info("indexUpdated : " + indexPath); info("indexUpdated : " + indexPath);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace();
err("Failed to update index.json: " + e.getMessage()); err("Failed to update index.json: " + e.getMessage());
} }
} }
@@ -462,10 +473,12 @@ public class Main {
var pathInIndex = "/puzzles/" + filename; var pathInIndex = "/puzzles/" + filename;
records.add(toIndexRecordJson(id, pathInIndex, date, theme, difficulty, createdAt)); records.add(toIndexRecordJson(id, pathInIndex, date, theme, difficulty, createdAt));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace();
err("Failed to read " + path + ": " + e.getMessage()); err("Failed to read " + path + ": " + e.getMessage());
} }
}); });
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace();
err("Failed to list puzzles: " + e.getMessage()); err("Failed to list puzzles: " + e.getMessage());
return; return;
} }
@@ -476,6 +489,7 @@ public class Main {
Files.writeString(indexPath, content, StandardCharsets.UTF_8); Files.writeString(indexPath, content, StandardCharsets.UTF_8);
info("Successfully rebuilt index.json with " + records.size() + " records."); info("Successfully rebuilt index.json with " + records.size() + " records.");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace();
err("Failed to write index.json: " + e.getMessage()); err("Failed to write index.json: " + e.getMessage());
} }
} }

View File

@@ -318,7 +318,7 @@ public record SwedishGenerator(Rng rng) {
public int clueIndex() { return clueIndex(key); } public int clueIndex() { return clueIndex(key); }
public static int clueIndex(int key) { return key >>> BIT_FOR_DIR; } public static int clueIndex(int key) { return key >>> BIT_FOR_DIR; }
public int clueC() { return Grid.c((key >>> BIT_FOR_DIR)); } public int clueC() { return Grid.c((key >>> BIT_FOR_DIR)); }
public int dir() { return key & 7; } public static int dir(int key) { return key & 7; }
public boolean horiz() { return horiz(key); } public boolean horiz() { return horiz(key); }
public boolean reversed() { return (key & 2) == 0; } public boolean reversed() { return (key & 2) == 0; }
public boolean increasing() { return (key & 2) != 0; } public boolean increasing() { return (key & 2) != 0; }

View File

@@ -147,10 +147,10 @@ public class SwedishGeneratorTest {
lo |= 1L << Grid.offset(4, 5); lo |= 1L << Grid.offset(4, 5);
var s = Slot.from(key, lo, 0L); var s = Slot.from(key, lo, 0L);
System.out.println("[DEBUG_LOG] s.dir() = " + s.dir()); System.out.println("[DEBUG_LOG] s.dir() = " + Slot.dir(s.key()));
assertEquals(2, s.clueR()); assertEquals(2, s.clueR());
assertEquals(3, s.clueC()); assertEquals(3, s.clueC());
assertEquals(3, s.dir()); assertEquals(3, Slot.dir(s.key()));
assertFalse(s.horiz()); assertFalse(s.horiz());
var cells = s.walk().toArray(); var cells = s.walk().toArray();
assertEquals(2, Grid.r(cells[0])); assertEquals(2, Grid.r(cells[0]));
@@ -259,7 +259,7 @@ public class SwedishGeneratorTest {
assertTrue(s.len() >= 2); assertTrue(s.len() >= 2);
assertEquals(0, s.clueR()); assertEquals(0, s.clueR());
assertEquals(0, s.clueC()); assertEquals(0, s.clueC());
assertEquals(2, s.dir()); assertEquals(2, Slot.dir(s.key()));
} }
@Test @Test