import java.util.List; import java.util.ArrayList; import java.util.Iterator; import java.io.OutputStream; class SudokuBeholder implements Iterable { public static class Losning implements Iterable { public static class Verdi { int tall; boolean original; Verdi(int tall, boolean original) { this.tall = tall; this.original = original; } } List verdier = new ArrayList<>(); public void leggTil(int n, boolean original) { verdier.add(new Verdi(n, original)); } public Iterator iterator() { return verdier.iterator(); } } private List losninger = new ArrayList<>(); private int antallLosninger = 0; private Brett brett; private final String colOriginal = (char)27 + "[31;1m"; private final String colReset = (char)27 + "[0m"; SudokuBeholder(Brett brett) { this.brett = brett; } public void leggTil(Losning losning) { if (antallLosninger < 2500) { losninger.add(losning); } antallLosninger += 1; } public int hentAntallLosninger() { return antallLosninger; } public Losning hent(int i) { return losninger.get(i); } public Iterator iterator() { return losninger.iterator(); } public void print(OutputStream out, Losning losning) throws Exception { int x = 0; int y = 1; int modX = brett.storrelse / brett.antallBokserX; int modY = brett.storrelse / brett.antallBokserY; int idx = 0; for (Losning.Verdi verdi: losning) { if (x % modX == 0 && x != 0) { out.write("|".getBytes()); } String str; if (verdi.original && out == System.out) { str = colOriginal+brett.toChar(verdi.tall)+colReset; } else { str = ""+brett.toChar(verdi.tall); } out.write(str.getBytes()); x += 1; if (x >= brett.storrelse) { x = 0; if (y % modY == 0 && y < brett.storrelse) { out.write("\n".getBytes()); for (int i = 0; i < brett.storrelse; ++i) { if (i % modX == 0 && i != 0) { out.write("+".getBytes()); } out.write("-".getBytes()); } } out.write("\n".getBytes()); y += 1; } idx += 1; } } }