Skip to content

Commit

Permalink
added UniqueSequence rule
Browse files Browse the repository at this point in the history
  • Loading branch information
Zomis committed Jan 3, 2015
1 parent 84c5ed7 commit 77de281
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 3 deletions.
10 changes: 7 additions & 3 deletions src/test/java/net/zomis/minesweeper/analyze/bounded/Binero.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

Expand Down Expand Up @@ -57,14 +56,19 @@ public static AnalyzeFactory<Integer> binero(InputStream file) throws IOExceptio
}

private static void setupBinero(AnalyzeFactory<Integer> fact, int size) {
List<List<Integer>> cols = new ArrayList<List<Integer>>();
List<List<Integer>> rows = new ArrayList<List<Integer>>();
for (int x = 0; x < size; x++) {
fact.addRule(new FieldRule<Integer>(null, createDiagonal(0, x, size, 1, 0), size / 2));
fact.addRule(new FieldRule<Integer>(null, createDiagonal(x, 0, size, 0, 1), size / 2));
cols.add(createDiagonal(x, 0, size, 0, 1));
rows.add(createDiagonal(0, x, size, 1, 0));

sliding(fact, 0, x, size, 1, 0, 3);
sliding(fact, x, 0, size, 0, 1, 3);
}

fact.addRule(new UniqueSequence<Integer>(0, cols));
fact.addRule(new UniqueSequence<Integer>(0, rows));
}

private static void sliding(AnalyzeFactory<Integer> puzzle, int x, int y, int size, int offsetX, int offsetY, int count) {
Expand All @@ -80,7 +84,7 @@ private static void sliding(AnalyzeFactory<Integer> puzzle, int x, int y, int si
}
}

private static Collection<Integer> createDiagonal(int x, int y, int size, int offsetX, int offsetY) {
private static List<Integer> createDiagonal(int x, int y, int size, int offsetX, int offsetY) {
List<Integer> fields = new ArrayList<Integer>();
while (x < size && y < size && x >= 0 && y >= 0) {
fields.add(pos(x, y, size));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package net.zomis.minesweeper.analyze.bounded;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.ListIterator;
import java.util.Map.Entry;
import java.util.Set;

import net.zomis.minesweeper.analyze.FieldGroup;
import net.zomis.minesweeper.analyze.FieldRule;
import net.zomis.minesweeper.analyze.GroupValues;
import net.zomis.minesweeper.analyze.SimplifyResult;

public class UniqueSequence<T> extends FieldRule<T> {

private final List<List<T>> list;

public UniqueSequence(T cause, List<List<T>> fields) {
super(cause, new ArrayList<T>(), 0);
this.list = fields;
}

@Override
public boolean isEmpty(GroupValues<T> knownValues) {
for (List<T> i : list) {
for (T t : i) {
Integer value = getSetValue(t, knownValues);
if (value == null) {
return false;
}
}
}
return true;
}

@Override
public FieldGroup<T> getSmallestFieldGroup() {
return null;
}

@Override
public SimplifyResult simplify(GroupValues<T> knownValues) {
// TODO: Listener for when something is added to knownValues? To be able to detect directly if rule is still OK or not. Likely speed-up.
List<Set<Integer>> setValues = new ArrayList<Set<Integer>>();
for (List<T> row : list) {
if (!addSet(setValues, row, knownValues)) {
System.out.println("fail");
return SimplifyResult.FAILED_TOO_BIG_RESULT;
}
}

return SimplifyResult.NO_EFFECT;
}

@Override
public UniqueSequence<T> copy() {
return new UniqueSequence<T>(getCause(), list);
}

private boolean addSet(List<Set<Integer>> setValues, List<T> row, GroupValues<T> knownValues) {

// loop through row, for each check if it has a value of 1 in the `knownValues`,
// convert the *index*es of the positions to a Set and add to setValues
ListIterator<T> it = row.listIterator();
Set<Integer> indexSet = new HashSet<Integer>();
while (it.hasNext()) {
int index = it.nextIndex();
T pos = it.next();
Integer setValue = getSetValue(pos, knownValues);
if (setValue == null) {
return true;
}
if (setValue == 1) {
indexSet.add(index);
}
}
return setValues.add(indexSet);
}

private Integer getSetValue(T pos, GroupValues<T> knownValues) {
for (Entry<FieldGroup<T>, Integer> ee : knownValues.entrySet()) {
if (ee.getKey().contains(pos)) {
return ee.getValue() / ee.getKey().size();
}
}
return null;
}

}

0 comments on commit 77de281

Please sign in to comment.