BLISS solver

Programs which generate, solve, and analyze Sudoku puzzles

BLISS solver

Postby Mathimagics » Fri Nov 15, 2019 12:27 pm

The BLISS solver is a product of some thoughts I had, following recent conversations with SpAce about the nature of "guessing".

Guessing, and T&E have of course been discussed in depth before. One particular thread from 2013 in particular has plenty to say about it:

http://forum.enjoysudoku.com/one-flew-over-the-backdoors-t31086-45.html

BLISS is a "Basic Logical Implication & Singles Solver". It is strictly non-recursive, and apart from Singles uses just one additional "technique", the logical implication. When all singles have been exhausted, we test all candidates (r,c,d) as follows:

  • Let PM be the current pencilmark state. Let PM1 be the state obtained from setting (r,c) = d, then checking for singles(DoSingles). Let PM0 the corresponding state obtained from (r,c) != d + DoSingles.
  • if any cell is solved, (rr, cc) = dd, in both PM0 and PM1, but not in PM, then the implication is that (rr, cc) = dd
  • if for any cell (rr, cc) = dd is eliminated in both PM0 and PM1, but not in PM, then the implication is that (rr, cc) != dd

This process is repeated for all unsolved cells, and until such time as we find no implications, OR we stumble across a backdoor. For, if the puzzle is valid, and it is only valid puzzles I am interested in, then any PM1 or PM0 can be a fully solved puzzle. So the "B" in BLISS could equally stand for backdoors, as they are simply a by-product of the solving process.

Clearly BLISS will solve any puzzle that has a singles backdoor, and of course any "singles only" puzzle, so we will restrict the discussion to those puzzles which are NOT singles only, and do not have a singles backdoor of size 1. I am interested in exploring how BLISS copes with "hard" puzzles.

I will post some more details below, and an example. But before I go on, I need to ask a question!

In the thread mentioned above, we have the following:

denis_berthier wrote:Another vaguely related topic is the depth of T&E necessary to solve any puzzle. Contrary to the backdoor size 2 conjecture, the T&E(2) conjecture has resisted all the newly found hard 9x9 puzzles.

Backdoor size and T&E depth correspond to opposite views of solving:

  • backdoor size is the minimum number of values that must be guessed in order to solve a puzzle with Singles only
  • T&E-depth is the minimum depth of T&E that must be used in order to be able to solve a puzzle with Singles only without accepting any guessing (a candidate is accepted as a value iff all the other candidates for the same CSP variable have been proven to be impossible)


I understand the "backdoor 2 conjecture" is ancient history, of course, in fact my learned colleague Mladen has produced 279 puzzles with no backdoor 3's. More on that later.

But the "T&E(2) conjecture" intrigues me. BLISS can work with pairs of cells, of course, so let's call that "BLISS(2)". My question is, is single-cell mode BLISS effectively a "T&E(1)" solver, and would BLISS(2) be equivalent to "T&E(2)"? Can it really be described as a "T&E" solver at all?

Cheers
MM
Last edited by Mathimagics on Fri Nov 15, 2019 1:21 pm, edited 1 time in total.
User avatar
Mathimagics
2017 Supporter
 
Posts: 1482
Joined: 27 May 2015
Location: Canberra

BLISS solver - Bivalues, 2-cell mode

Postby Mathimagics » Fri Nov 15, 2019 12:46 pm

The rules for 2-cell implication checking, ie BLISS(2):

  • Let PM be the current pencilmark state. Let PM0 to PM3 be the states obtained from the 4 possible combinations - setting (ra,ca) =/!= da + (rb,cb) =/!= db, then checking for singles (DoSingles). Note that some combinations might not be valid.
  • if any cell is solved, (rr, cc) = dd, in all valid PM0-3, but not in PM, then the implication is that (rr, cc) = dd
  • if for any cell (rr, cc) = dd is eliminated in all valid PM0-3, but not in PM, then the implication is that (rr, cc) != dd

Two examples from champagne's PH1910 collection. They both have backdoor size 2, but are solved with BLISS(1). The bracketed items identify the primary cell being tested.

Example #1:
Code: Select all
P: ........1.....2.3...4.536...3........6......74...683...4..865..5..9.4...8....5.2. (ng = 210)
 (1c) [ 3r1c1] r1c3 != 6
 (1c) [ 6r1c1] r2c3 != 6
 (1c) [ 8r4c3] r1c3 != 8, r2c3 != 8
 (1c) [ 1r4c6] r4c4 != 1, r4c5 != 1, r5c4 != 1, r5c5 != 1, r6c4 != 1
 (1c) [ 9r1c1] solved
S: 983647251615892734274153698738421965162539847459768312341286579526974183897315426


Example #2:
Code: Select all
P: 1.......6.5.7...8...3...4.....2.8.9.....1.3...8..5....6..9......7...5.2...4.....1 (ng = 58)
 (1c) [ 7r1c3] r3c1 ^= 2, r3c1 ^= 9
 (1c) [78r3c1] r1c3 ^= 2, r1c3 ^= 9
 (1c) [ 9r5c6] r1c6 ^= 9, r2c6 ^= 9, r3c6 ^= 9
 (1c) [ 2r6c7] r6c1 ^= 2, r6c3 ^= 2
 (1c) [ 8r8c4] BD
S: 128594736459736182763182459317248695542619378986357214635921847871465923294873561
Last edited by Mathimagics on Fri Nov 15, 2019 1:20 pm, edited 1 time in total.
User avatar
Mathimagics
2017 Supporter
 
Posts: 1482
Joined: 27 May 2015
Location: Canberra

paired propagation.

Postby StrmCkr » Fri Nov 15, 2019 1:04 pm

i had in previous generations of my coded solver an activatable hidden function which was my own theory from way back in the day. {if u happened to hit the right key it would trigger}

"Paired Propagation"
- the basic theory was a bi-local cell could be pair up with a set of candidates shared by both cells completing it as a N cells with N digits.

then draw the sub-mask of the affected links from these 2 cells as a projected pair : the sub-mask either generates a contradiction in N-sets,
and occasionally could formed a solid solution. {a back door}

the contradiction sub-nets is what i was after as these eliminations are still valid in a muti-solution grid {and the pair could be part of a UR pattern}
the contradiction proved that both cells couldn't be that particular combination of paired digits in the examined cells.
then use the information given from the starting state of the cells

A (1+n) or B(1+n)
A (1or2) or B (1 +n)
based on configurations that guarantee both cells are a pair we could eliminate the tested "n" candidate from specific cells
perform eliminations and carry forward:

I never was able to implement a way to precreate the N set network the projected pair was tied to make this a logic based technique instead of a "trial" and "error" as i had it coded to test bed it so its a project i have shelved for 10 years.
Some do, some teach, the rest look it up.
User avatar
StrmCkr
 
Posts: 1088
Joined: 05 September 2006

Re: BLISS solver

Postby Mathimagics » Fri Nov 15, 2019 2:56 pm

StrmCkr wrote: ... its a project i have shelved for 10 years.


Sounds interesting!

But what I have described above is a much simpler, and really fundamental, logic system. In fact I am almost certain somebody must have already tried something very much like it.
User avatar
Mathimagics
2017 Supporter
 
Posts: 1482
Joined: 27 May 2015
Location: Canberra

Re: BLISS solver

Postby dobrichev » Fri Nov 15, 2019 10:20 pm

Hi Jim,

After reading the referred above thread you know that I am the worse consultant on this matter.

Nevertheless I will give you an example code from SE and try to discuss. Read the first long comment and the last several rows.
Hidden Text: Show
Code: Select all
    /**
     * From the potential <code>p</code>, compute the consequences from
     * both states.
     * <p>
     * More precisely, <code>p</code> is first assumed to be correct
     * ("on"), and then to be incorrect ("off"); and the following sets are
     * created:
     * <ul>
     * <li><b><code>onToOn</code></b> the set of potentials that must be "on"
     * when <code>p</code> is "on"
     * <li><b><code>onToOff</code></b> the set of potentials that must be "off"
     * when <code>p</code> is "on"
     * <li><b><code>offToOn</code></b> the set of potentials that must be "on"
     * when <code>p</code> is "off"
     * <li><b><code>offToOff</code></b> the set of potentials that must be "off"
     * when <code>p</code> is "off"
     * </ul>
     * Then the following rules are applied:
     * <ul>
     * <li>If a potential belongs to both <code>onToOn</code> and <code>onToOff</code>,
     * the potential <code>p</code> cannot be "on" because it would implie a potential
     * to be both "on" and "off", which is an absurd.
     * <li>If a potential belongs to both <code>offToOn</code> and <code>offToOff</code>,
     * the potential <code>p</code> cannot be "off" because it would implie a potential
     * to be both "on" and "off", which is an absurd.
     * <li>If a potential belongs to both <code>onToOn</code> and <code>offToOn</code>,
     * this potential must be "on", because it is implied to be "on" by the two possible
     * states of <code>p</code>.
     * <li>If a potential belongs to both <code>onToOff</code> and <code>offToOff</code>,
     * this potential must be "off", because it is implied to be "off" by the two possible
     * states of <code>p</code>.
     * </ul>
     * Note that if a potential belongs to all the four sets, the Sudoku has no solution.
     * This is not checked.
     * @param grid the grid
     * @param p the potential to gather hints from
     * @param accu the accumulator for hints
     * @param onToOn an empty set, filled with potentials that get on if the given
     * potential is on.
     * @param onToOff an empty set, filled with potentials that get off if the given
     * potential is on.
     * @throws InterruptedException
     */
    private void doBinaryChaining(Grid grid, Potential pOn, Potential pOff,
            List<ChainingHint> result, LinkedSet<Potential> onToOn,
            LinkedSet<Potential> onToOff, boolean doReduction, boolean doContradiction) {

        Potential[] absurdPotential = null;
        LinkedSet<Potential> offToOn = new LinkedSet<Potential>();
        LinkedSet<Potential> offToOff = new LinkedSet<Potential>();

        /*
         * Circular Forcing Chains (hypothesis implying its negation)
         * are already covered by Cell Forcing Chains, and are therefore
         * not checked for.
         */

        // Test p = "on"
        onToOn.add(pOn);
        absurdPotential = doChaining(grid, onToOn, onToOff);
        if (doContradiction && absurdPotential != null) {
            // p cannot hold its value, because else it would lead to a contradiction
            BinaryChainingHint hint = createChainingOffHint(absurdPotential[0], absurdPotential[1],
                    pOn, pOn, true);
            if (hint.isWorth())
                result.add(hint);
        }

        // Test p = "off"
        offToOff.add(pOff);
        absurdPotential = doChaining(grid, offToOn, offToOff);
        if (doContradiction && absurdPotential != null) {
            // p must hold its value, because else it would lead to a contradiction
            BinaryChainingHint hint = createChainingOnHint(grid, absurdPotential[0], absurdPotential[1],
                    pOff, pOff, true);
            if (hint.isWorth())
                result.add(hint);
        }

        if (doReduction) {
            // Check potentials that must be on in both case
            for (Potential pFromOn : onToOn) {
                Potential pFromOff = offToOn.get(pFromOn);
                if (pFromOff != null) {
                    BinaryChainingHint hint = createChainingOnHint(grid, pFromOn, pFromOff, pOn, pFromOn, false);
                    if (hint.isWorth())
                        result.add(hint);
                }
            }

            // Check potentials that must be off in both case
            for (Potential pFromOn : onToOff) {
                Potential pFromOff = offToOff.get(pFromOn);
                if (pFromOff != null) {
                    BinaryChainingHint hint = createChainingOffHint(pFromOn, pFromOff, pOff, pFromOff, false);
                    if (hint.isWorth())
                        result.add(hint);
                }
            }
        }

    }

    private void doRegionChainings(Grid grid, List<ChainingHint> result, Cell cell,
            int value, LinkedSet<Potential> onToOn, LinkedSet<Potential> onToOff) {
        for (int regionTypeIndex = 0; regionTypeIndex < 3; regionTypeIndex++) {
            Grid.Region region = Grid.getRegionAt(regionTypeIndex, cell.getIndex());
            BitSet potentialPositions = region.getPotentialPositions(grid, value);

            // Is this region worth ?
            int cardinality = potentialPositions.cardinality();
            if (cardinality == 2 || (isMultipleEnabled && cardinality > 2)) {
                int firstPos = potentialPositions.nextSetBit(0);
                Cell firstCell = region.getCell(firstPos);

                // Do we meet region for the first time ?
                if (firstCell.equals(cell)) {
                    Map<Integer, LinkedSet<Potential>> posToOn =
                        new HashMap<Integer, LinkedSet<Potential>>();
                    Map<Integer, LinkedSet<Potential>> posToOff =
                        new HashMap<Integer, LinkedSet<Potential>>();
                    LinkedSet<Potential> regionToOn = new LinkedSet<Potential>();
                    LinkedSet<Potential> regionToOff = new LinkedSet<Potential>();

                    // Iterate on potential positions within the region
                    for (int pos = potentialPositions.nextSetBit(0); pos >= 0;
                            pos = potentialPositions.nextSetBit(pos + 1)) {
                        Cell otherCell = region.getCell(pos);
                        if (otherCell.equals(cell)) {
                            posToOn.put(pos, onToOn);
                            posToOff.put(pos, onToOff);
                            regionToOn.addAll(onToOn);
                            regionToOff.addAll(onToOff);
                        } else {
                            Potential other = new Potential(otherCell, value, true);
                            LinkedSet<Potential> otherToOn = new LinkedSet<Potential>();
                            LinkedSet<Potential> otherToOff = new LinkedSet<Potential>();
                            otherToOn.add(other);
                            doChaining(grid, otherToOn, otherToOff);
                            posToOn.put(pos, otherToOn);
                            posToOff.put(pos, otherToOff);
                            regionToOn.retainAll(otherToOn);
                            regionToOff.retainAll(otherToOff);
                        }
                    }

                    // Gather results
                    for (Potential p : regionToOn) {
                        RegionChainingHint hint = createRegionReductionHint(grid, region, value,
                                p, posToOn);
                        if (hint.isWorth())
                            result.add(hint);
                    }
                    for (Potential p : regionToOff) {
                        RegionChainingHint hint = createRegionReductionHint(grid, region, value,
                                p, posToOff);
                        if (hint.isWorth())
                            result.add(hint);
                    }
                } // First meet
            } // cardinality >= 3
        } // for Region
    }

... and their calls
    private List<ChainingHint> getMultipleChainsHintListForCell(Grid grid, Cell cell, int cardinality) {
        List<ChainingHint> result = new ArrayList<ChainingHint>();
        // Prepare storage and accumulator for "Cell Reduction"
        Map<Integer, LinkedSet<Potential>> valueToOn =
            new HashMap<Integer, LinkedSet<Potential>>();
        Map<Integer, LinkedSet<Potential>> valueToOff =
            new HashMap<Integer, LinkedSet<Potential>>();
        LinkedSet<Potential> cellToOn = null;
        LinkedSet<Potential> cellToOff = null;

        // Iterate on all potential values that are not alone
        for (int value = 1; value <= 9; value++) {
            if (grid.hasCellPotentialValue(cell.getIndex(), value)) {
                // Do Binary chaining (same potential either on or off)
                Potential pOn = new Potential(cell, value, true);
                Potential pOff = new Potential(cell, value, false);
                LinkedSet<Potential> onToOn = new LinkedSet<Potential>();
                LinkedSet<Potential> onToOff = new LinkedSet<Potential>();
                boolean doDouble = (cardinality >= 3 && !isNisho && isDynamic);
                boolean doContradiction = isDynamic || isNisho;
                doBinaryChaining(grid, pOn, pOff, result, onToOn, onToOff, doDouble, doContradiction);

                if (!isNisho) {
                    // Do region chaining
                    doRegionChainings(grid, result, cell, value, onToOn, onToOff);
                }

                // Collect results for cell chaining
                valueToOn.put(value, onToOn);
                valueToOff.put(value, onToOff);
                if (cellToOn == null) {
                    cellToOn = new LinkedSet<Potential>();
                    cellToOff = new LinkedSet<Potential>();
                    cellToOn.addAll(onToOn);
                    cellToOff.addAll(onToOff);
                } else {
                    cellToOn.retainAll(onToOn);
                    cellToOff.retainAll(onToOff);
                }
            }
        } // for value

        if (!isNisho) {
            // Do Cell reduction
            if (cardinality == 2 || (isMultipleEnabled && cardinality > 2)) {
                for (Potential p : cellToOn) {
                    CellChainingHint hint = createCellReductionHint(grid, cell, p, valueToOn);
                    if (hint.isWorth())
                        result.add(hint);
                }
                for (Potential p : cellToOff) {
                    CellChainingHint hint = createCellReductionHint(grid, cell, p, valueToOff);
                    if (hint.isWorth())
                        result.add(hint);
                }
            }
        }
       return result;
    }

... and the main loop
    private List<ChainingHint> getMultipleChainsHintList(Grid grid) {
        List<ChainingHint> result = new ArrayList<ChainingHint>();
        //boolean noParallel = true; //debug, hide the class member noParallel
        //boolean noParallel = false;
        boolean noParallel = this.noParallel || Settings.getInstance().getNumThreads() == 1;
        List<Cell> cellsToProcess = new ArrayList<Cell>();
        // Iterate on all empty cells
        for (int i = 0; i < 81; i++) {
            if (grid.getCellValue(i) == 0) { // the cell is empty
               int cardinality = grid.getCellPotentialValues(i).cardinality();
                if (cardinality > 2 || (cardinality > 1 && isDynamic)) {
                  Cell cell = Grid.getCell(i);
                  result.addAll(getMultipleChainsHintListForCell(grid, cell, cardinality));
                 } // Cardinality > 1
            } // if empty
        } // for i



In the code above you can find that the action which for you and me is guessing, for the Nicolas is getMultipleChainsHintList.
doBinaryChaining is a process close to yours.
The difference is that it is called several times in different modes.
Firstly called mode does only part of the job and is considered easier.
On failure in finding eliminations the next mode is called, which does more of the job and is considered harder, and so on.

The outermost loop at the bottom is just to show you that the guessing is done over all candidates.

SAT fans call your eliminations Clause learning with conflict analysis. Backdoors hitting doesn't use this logic.

Exclusion of the recursion (nesting) from your zoo limits the power of the solver to far below the hardest puzzles.
dobrichev
2016 Supporter
 
Posts: 1777
Joined: 24 May 2010

Re: BLISS solver

Postby Mathimagics » Sat Nov 16, 2019 5:29 am

Hello Mladen!

dobrichev wrote:After reading the referred above thread you know that I am the worse consultant on this matter.

:lol:

Ok, I have made the following logical deductions from that code extract:

  • the potential to create obfuscatory code in C++ is unlimited
  • I will never ever get involved with SE
  • doBinaryChaining is indeed the fundamental BLISS process. Its obfuscation is in the use of 4 "sets" to do the work of 2 bitmasks. Bitmasks avoid the absurdities - can a bit be both 0 and 1?

BLISS uses your excellent solver, by the way. I added an entrypoint dSolvePM(inPM, outPM) to dSolver (my fsss2). The solver runs in "no guessing" mode, so just does doEliminations at the top level only, so it's effectively DoSingles.

DoSingles returns -1 (contradiction), 0 (normal), or 1 (all cells solved). For case 0 it also converts the final grid[*] state to pencilmarks and returns these in outPM.

doBinaryChaining thus corresponds to BLISS1(CPM, r, c, d) which is basically this:

Code: Select all
   PM1 = SetValue(CPM, r, c,d);  // CPM = current pencilmark state
   PM0 = ElimValue(CPM, r, c, d);

   switch (dSolvePM(PM1, PM1)) {
      case -1:  // add elimination (r,c) != d and exit
      case  1:  // solved!! exit thru the back door
      case  0:  // normal (valid but unsolved)
      }

   switch (dSolvePM(PM0, PM0)) {
      case -1:  // add implication (r, c) = d and exit
      case  1:  // solved!! exit thru the back door
      case  0:  // normal
      }

   // 
   // proceed with bitwise comparison of CPM, PM0, PM1 as per specs
   //
   ...


SAT fans call your eliminations Clause learning with conflict analysis. Backdoors hitting doesn't use this logic.

But if SAT, during this process, encountered a solution, it would surely report "Satisfiable" immediately and terminate, wouldn't it?

BLISS does the same. It could of course, conceal the discovery ... presumably SE ignores them, if in fact it even discovers them.

Exclusion of the recursion (nesting) from your zoo limits the power of the solver to far below the hardest puzzles.

True, but with BLISS(2), which does cell-pair testing (equivalent to one nesting level, I suppose) we solve all BUT the hardest.

With BLISS(2) over 99% of the puzzles in PH1910 are solved, as they have backdoor 2's, which a 2-cell test will always discover. Of those few that don't have a backdoor 2 (15763 puzzles), BLISS(2) solves 2036 of those by finding enough BLISS(1) eliminations to create a backdoor 2.
User avatar
Mathimagics
2017 Supporter
 
Posts: 1482
Joined: 27 May 2015
Location: Canberra

Re: BLISS solver

Postby tarek » Sat Nov 16, 2019 7:43 am

Mathimagics wrote:presumably SE ignores them, if in fact it even discovers them.
SE is good at concealing things. It will discover the solution again and again and then present what it thinks is the best discovery!
User avatar
tarek
 
Posts: 3416
Joined: 05 January 2006

Re: BLISS solver

Postby Mathimagics » Sat Nov 16, 2019 9:52 am

Yes, I thought that might be the case.

SE of course is not intentionally a solver. On the other hand, when it comes to solving techniques, ignorance is BLISS ... 8-)
User avatar
Mathimagics
2017 Supporter
 
Posts: 1482
Joined: 27 May 2015
Location: Canberra

Re: BLISS solver

Postby dobrichev » Sat Nov 16, 2019 11:28 am

Mathimagics wrote:
  • the potential to create obfuscatory code in C++ is unlimited

Worse. This is Java. Bitsets have dynamic size and work slow because you have no control on runtime and can't disable attempt to "optimize" the bitmap after each update by truncating the all-zero words at the end.
The SE implementation heavily relies on compressed sparse matrices of the pencilmarks which doesn't work well on hardest and pencilmark-only puzzles.
Mathimagics wrote:
  • I will never ever get involved with SE

Excellent!
Mathimagics wrote:
  • doBinaryChaining is indeed the fundamental BLISS process. Its obfuscation is in the use of 4 "sets" to do the work of 2 bitmasks. Bitmasks avoid the absurdities - can a bit be both 0 and 1?

From memory, Champagne uses interleaved odd/even bit set for results of the assumption and its negation, then compares neighbour bits after shifting by one position.
Surely this is a fundamental solving technique.
It can be simply described from scratch as you did in your starting post.
It isn't a human solver applicable in it simplest form. Attempting to crumble it to families of human solver techniques leads to what happened with SE. (BTW SE is a great marketing hit in this sense - it mysteriously assigns a rating to any vanilla puzzle and nobody can trace why one puzzle is more difficult than other, even after stepping trough the unhuman logic in the abyss of inherited classes and interfaces.)
Of course you can leave it as computer-solver technique but still complicate it by introducing terms like ribbons and garters, strictly defining them by circularly referencing each other, and writing a book.

Mathimagics wrote:BLISS uses your excellent solver, by the way.

Thank you.
In the recent editions I've added (or improved?) "no guessing" mode, as well as several fixes to locked candidates which (still at compile time) can be included or excluded from the "singles" family.

Mathimagics wrote:
SAT fans call your eliminations Clause learning with conflict analysis. Backdoors hitting doesn't use this logic.

But if SAT, during this process, encountered a solution, it would surely report "Satisfiable" immediately and terminate, wouldn't it?

Nothing wrong there - you are asking "Can you find any solution?" and it answers "Yes".

Mathimagics wrote:.. with BLISS(2), which does cell-pair testing (equivalent to one nesting level, I suppose) we solve all BUT the hardest.

If you apply BLISS(2) only after BLISS(1) fails to make progress, then it looks fine - a simple well-defined extension, BLISS(N).

Could you try some pencilmark-only puzzles?
dobrichev
2016 Supporter
 
Posts: 1777
Joined: 24 May 2010

Re: BLISS solver

Postby Mathimagics » Sat Nov 16, 2019 12:25 pm

dobrichev wrote:If you apply BLISS(2) only after BLISS(1) fails to make progress, then it looks fine - a simple well-defined extension, BLISS(N).
Yes, that's just how I do it.

dobrichev wrote:Could you try some pencilmark-only puzzles?
Certainly! I need firstly to work on the BLISS(2) logic further, as it currently fails to find some species of logical implications. BLISS is fine, the ignorance is mine! 8-)

Can you point me to a suitable set of PM puzzles to test?

Cheers
MM
User avatar
Mathimagics
2017 Supporter
 
Posts: 1482
Joined: 27 May 2015
Location: Canberra

Re: BLISS solver

Postby dobrichev » Sat Nov 16, 2019 1:14 pm

Helper functions for pencilmark-only puzzles:
https://github.com/dobrichev/PencilmarkSudoku/blob/master/pencilmarks.h has fromChars81(), fromChars729(), and toChars729().
Here, the implementations in fsss2.h and fsss2.cpp use this structure. Also int noGuess::reduce(pencilmarks& p) probably implements what you need (and already did).

Pencilmark-only puzzles
http://forum.enjoysudoku.com/post283578.html#p283578 One that starts with SE=12.9 elimination
http://forum.enjoysudoku.com/post235787.html#p235787 The 11 Tarek's Minimal singles backdoor size 6 puzzles
http://forum.enjoysudoku.com/post283762.html#p283762 A high-clue one

and 4 more
Hidden Text: Show
Code: Select all
1.34.678912345678...345678..2.4.6789123.5.7891....6.8....456789.....6.8.1.3..6789123456.8.123456789123.567..1234.678912345.78.1234567891234.6.8.123456.8.123..6789.234567.9..345..8..23.5.7.9.23.5.789.23.5...912.456789123456789..3.5..89.2345.78912345...912345.78912345..8.12345678912..56.8.1.3456.89.2345678.1234.6.891.34.678912345...912.45.7.91..45.7...2..5.78..2345.789....567.9.2.4..78...3456.8..2345678912345.7.912.4.6789123456789.2..567.912345678912.45678..234.67.9123456789.234567891234567891.34.678..234.67891234567891.3.567891.34.6789123456789.....6..91234.6789.23..6.891234567891..45..89..34567891234567..1...5.7.91234567.91234.6.891.345678912..5..89.....67891..456.8..2.4..78.1.34.6.8.1..456.8..2.4....91.3456.8912.456789   210
1.34.678912345678...345678..2.4.6789123.5.7891....6.8...3456789.....6.8.1.3..6789123456.8.123456789123.567..1234.678912345.78.1234567891234.6.8.123.56.8.123..6789.234567.9..345..8..23.5.7.9.23.5.789.23.5...912.456789123456789..3.5..89.2345.78912345...912345.78912345..8.12345678912..56.8.1.3456.89.2345678.1234.6.891.34.678912345...912.45.7.91..45.7...2..5.78..2345.789....567.9.2.4..78...3456.8..2345678912345.7.912.4.6789123456789.2..567.912345678912.45678..234.67.9123456789.234567891234567891.34.678..234.67891234567891.3.567891.34.6789123456789.....6..91234.6789.23..6.891234567891..45..89..34567891234567..1...5.7.91234567.91234.6.891.345678912..5..89.....67891..456.8..2.4..78.1.34.6.8.1..456.8..2.4....91.3456.8912.456789   210
1.34.678912345678...345678..2.4.6789123.5.7891....6.8...3456789.....6.8.1.3..6789123456.8.123456789123.567..1234.678912345.78.1234567891234.6.8.123.56.8.123..6789.234567.9..345..8..23.5.7.9.23.5.789.23.5...912.456789123456789..3.5...9.2345.78912345...912345.78912345..8.12345678912..56.8.1.3456.89.2345678.1234.6.891.34.678912345...912.45.7.91..45.7...2..5.78..2345.789....567.9.2.4..78...3456.8..2345678912345.7.91234.6789123456789.2..567.912345678912.45678..234.67.9123456789.234567891234567891.34.678..234.67891234567891.3.567891.34.6789123456789.....6..91234.6789.23..6.891234567891..45..89..34567891234567..1...5.7.91234567.91234.6.891.345678912..5..89.....67891..456.8..2.4..78.1.34.6.8.1..456.8..2.4....91.3456.8912.456789   210
1.34.678912345678...345678..2.4.6789123.5.7891....6.8...3456789.......8.1.3..6789123456.8.123456789123.567..1234.678912345678.1234567891234.6.8.123.56.8.123..6789.234567.9..345..8..23.5.7.9.23.5.789.23.5...912.456789123456789..3.5..89.2345.78912345...912345.78912345..8.12345678912..56.8.1.3456.89.2345678.1234.6.891234.678912345...912.45.7.91..45.7...2..5.78..2345.789....567.9.2.4..78...3456.8..2345678912345.7.91234.6789123456789.2..567.912345678912.45678..234.67.9123456789.234567891234567891.34.678..234.67891234567891.3.567891.34.6789123456789.....6.891234.6789.23..6.891234567891..45..89..34567891234567..1...5.7.91.34567.91234.6.891.345678912..5..89.....67891..456.8..2.4..78.1.34.6.8.1..456.8..2.4....91.3456.8912.45678.   209


and 78 more
Hidden Text: Show
Code: Select all
123456789123456789123456789..3456789123456789123456789...4..7..123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6..91234567891234567891234567891..45.7..1234567891234567891234567891..45.78912.4...89123456789123456789123456789123456789.......891234567891234567891234567891234567891234567891.3.567..1.3.56.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........8.123456789123456789123456789..3456.89123456789
123456789123456789123456789..3456789123456789123456789...4..7..123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6..91234567891234567891234567891..45.7..1234567891234567891234567891..45.78912.4...89123456789123456789123456789123456789........91234567891234567891234567891234567891234567891.3.567..1.3.56.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........89123456789123456789123456789..3456.89123456789
123456789123456789123456789..3456789123456789123456789...4..7..123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6..91234567891234567891234567891..45.78.1234567891234567891234567891..4..78912.4...89123456789123456789123456789123456789.......891234567891234567891234567891234567891234567891.3.567..1.3.56.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........8.123456789123456789123456789..3456.89123456789
123456789123456789123456789..3456789123456789123456789...4..7..123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6..91234567891234567891234567891..45.78.1234567891234567891234567891..4..78912.4...89123456789123456789123456789123456789........91234567891234567891234567891234567891234567891.3.567..1.3.56.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........89123456789123456789123456789..3456.89123456789
123456789123456789123456789..3456789123456789123456789...4..7..123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89..3..6..9123456789123456789..3..6..91234567891234567891234567891..45.78.1234567891234567891234567891..4..78912.4...89123456789123456789123456789123456789........91234567891234567891234567891234567891234567891.3.567..1.3.56.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3.56...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........89123456789123456789123456789..34.6.89123456789
123456789123456789123456789..3456789123456789123456789......7..1234567891234567891234567891.3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6..91234567891234567891234567891..45.7..1234567891234567891234567891..45.78912.4...89123456789123456789123456789123456789.......891234567891234567891234567891234567891234567891.34567..1.3..6.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........8.123456789123456789123456789..3456.89123456789
123456789123456789123456789..3456789123456789123456789......7..1234567891234567891234567891.3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6..91234567891234567891234567891..45.7..1234567891234567891234567891..45.78912.4...89123456789123456789123456789123456789........91234567891234567891234567891234567891234567891.34567..1.3..6.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........89123456789123456789123456789..3456.89123456789
123456789123456789123456789..3456789123456789123456789......7..1234567891234567891234567891.3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6..91234567891234567891234567891..45.78.1234567891234567891234567891..4..78912.4...89123456789123456789123456789123456789........91234567891234567891234567891234567891234567891.34567..1.3..6.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........89123456789123456789123456789..3456.89123456789
123456789123456789123456789..3456789123456789123456789......7..123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6..91234567891234567891234567891..45.7..1234567891234567891234567891..45.78912.4...89123456789123456789123456789123456789.......891234567891234567891234567891234567891234567891.34567..1.3.56.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........8.123456789123456789123456789..3456.89123456789
123456789123456789123456789..3456789123456789123456789......7..123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6..91234567891234567891234567891..45.7..1234567891234567891234567891..45.78912.4...89123456789123456789123456789123456789........91234567891234567891234567891234567891234567891.34567..1.3.56.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........89123456789123456789123456789..3456.89123456789
123456789123456789123456789..3456789123456789123456789......7..123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6..91234567891234567891234567891..45.78.1234567891234567891234567891..4..78912.4...89123456789123456789123456789123456789.......891234567891234567891234567891234567891234567891.34567..1.3.56.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........8.123456789123456789123456789..3456.89123456789
123456789123456789123456789..3456789123456789123456789......7..123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6..91234567891234567891234567891..45.78.1234567891234567891234567891..4..78912.4...89123456789123456789123456789123456789........91234567891234567891234567891234567891234567891.34567..1.3.56.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........89123456789123456789123456789..3456.89123456789
123456789123456789123456789..3456789123456789123456789......7..123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89..3..6..9123456789123456789..3..6..91234567891234567891234567891..45.7..1234567891234567891234567891..45.78912.4...89123456789123456789123456789123456789........91234567891234567891234567891234567891234567891.34567..1.3.56.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3.56...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........89123456789123456789123456789..34.6.89123456789
123456789123456789123456789..3456789123456789123456789......7..123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89..3..6..9123456789123456789..3..6..91234567891234567891234567891..45.78.1234567891234567891234567891..4..78912.4...89123456789123456789123456789123456789.......891234567891234567891234567891234567891234567891.34567..1.3.56.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3.56...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........8.123456789123456789123456789..34.6.89123456789
123456789123456789123456789..3456789123456789123456789......7..123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789123456789123456789123456789..3..6.891234567891234567891234...8.1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89..3..6..9123456789123456789..3..6..91234567891234567891234567891..45.78.1234567891234567891234567891..4..78912.4...89123456789123456789123456789123456789........91234567891234567891234567891234567891234567891.34567..1.3.56.891234567891234567891234567891234567891..4..7..123456789123456789123456789..3.56...123456789..3..6.89.23..6.8.123456789123456789123456789123456789123456789..3..6.8.1.3.56.8........89123456789123456789123456789..34.6.89123456789
123456789123456789123456789..34.67..123456789123456789......7..1234567891234567891234567891.3.56.8.1234567891234567891234567891234567891234567891234567891234567891234567891.3..6.8.1234567891234567891234.6..91234567891.....78.123456789123456789123456789123456789123456789..3..6....23..6..9123456789123456789..3..6..91234567891234567891234567891..45.78.1234567891234567891234567891.....7891.34.6.89123456789123456789123456789123456789123456789123456789..3..6.8.123456789123456789123456789......7..1..45.7..123456789.234567..12..567.91234567891234567891.3.567..123456789123456789123456789.2.4..7...234.6....2.......12345678912345678912345678912345678912345678912345678.1..45.78.123456789123456789123456789123456789..3.5..89123456789
123456789.23.56...12345678912345678912345678912345678912.4..7..1234567891234567891234567891.3.56...1234567891......8.123456789123456789123456789123456789123456789123456789123.56.8.1234567891234567891234.6.8.1234567891........1234567891234567891234567891234567891234567891.3..6.8..2...6...123456789123456789..3..6.891234567891234567891234567891..45.78.1234567891234567891234567891..4..7891.34...89123456789123456789123456789123456789123.56.89123456789123456789123456789123456789123456789..3..67..1234567891234567891234567891234567891234567891.34..7..123456789123456789123456789.23..6...123456789123..6.8..2.......123456789123456789123456789123456789123456789..3..6.....3.567...23.56.8.123456789123456789123456789..3.56...123456789
123456789.23.56789123456789123456789123456789123456789...4..78.123456789123456789123456789..3.5....1234567891.3.5..8.123456789123456789123456789123456789123456789123456789123.56.891234567891234567891234.6...1234567891.34..78.123456789123456789123456789123456789123456789..3..6.89.2...6...123456789123456789...4.6.891234567891234567891234567891..45.78.123456789123456789123456789.......8....4...8.1234567891234567891234567891234567891.3.56.89123456789123456789123456789123456789123456789.....67..123456789123456789123456789123456789123456789..34..78.123456789123456789123456789.23.56...123456789123..6.89.2.......123456789123456789123456789123456789123456789..3.56.......567...23.56.8.123456789123456789123456789..3456..9123456789
123456789.23.5..8.12345678912345678912345678912345678912.4..78.1234567891234567891234567891...5..8.1234567891.3..6..9123456789123456789123456789123456789123456789123456789.......8.123456789123456789123..6.891234567891.3....8.123456789123456789123456789123456789123456789..3..6..9.2...6..9123456789123456789..3..6.891234567891234567891234567891..45.7891234567891234567891234567891......8.1.34...89123456789123456789123456789123456789..3..6..9123456789123456789123456789123456789123456789..3..67..123456789123456789123.567.9.2..567.91234567891..45.789123456789123456789123456789.23.56.8.123456789.23..6....2.......123456789123456789123456789123456789123456789.23.56.8.1.3.567..123456789123456789123456789123456789..3456.89123456789
123456789.2.4..78.123456789..34..7..123456789123456789...4..7..123456789123456789123456789.23.56.891234567891.345....123456789123456789123456789123456789123456789123456789123....8.1234567891234567891.3......1234567891..4..7..1234567891234567891234567891234567891234567891.34.678...3..67..123456789123456789..3456.89123456789123456789.2.....891..45.7891234567891234567891234567891..4..7891.345..891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891.....7..12..5..891234567891.345.78.123456789123456789...4..7..1234567891234567891234567891234567891..4..7..123456789.23456.8.1234567891234567891234567891234567891234567891234567891..45.7..1.3456.8.123456789123456789123456789..3456...123456789
123456789.2.4..78.123456789..34..7..123456789123456789...4..7..123456789123456789123456789.23.56.891234567891.345..8.123456789123456789123456789123456789123456789123456789123....8.1234567891234567891.3......1234567891..4..7..1234567891234567891234567891234567891234567891.34.678...3..67..123456789123456789..3456.89123456789123456789.2.....891..45.7891234567891234567891234567891..4..7891.345..891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891.....7..12..5..891234567891.345.78.123456789123456789...4..7..1234567891234567891234567891234567891..4..7..123456789.23456.8.1234567891234567891234567891234567891234567891234567891..45.7....3456.8.123456789123456789123456789..3456...123456789
123456789.2.4..789123456789..34..7..123456789123456789...4..7..123456789123456789123456789.23.56.891234567891.345....123456789123456789123456789123456789123456789123456789123....8.1234567891234567891.3......1234567891..4..7..1234567891234567891234567891234567891234567891.34.678...3..67..123456789123456789..3456.89123456789123456789.......891..45.7891234567891234567891234567891..4..7891.345..891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891.....7..12..5..891234567891.345.78.123456789123456789...4..7..1234567891234567891234567891234567891..4..7..123456789.23456.8.1234567891234567891234567891234567891234567891234567891..45.7..1.3456.8.123456789123456789123456789..3456...123456789
123456789.2.4..789123456789..34..7..123456789123456789...4..7..123456789123456789123456789.23.56.891234567891.345..8.123456789123456789123456789123456789123456789123456789123....8.1234567891234567891.3......1234567891..4..7..1234567891234567891234567891234567891234567891.34.678...3..67..123456789123456789..3456.89123456789123456789.......891..45.7891234567891234567891234567891..4..7891.345..891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891.....7..12..5..891234567891.345.78.123456789123456789...4..7..1234567891234567891234567891234567891..4..7..123456789.23456.8.1234567891234567891234567891234567891234567891234567891..45.7....3456.8.123456789123456789123456789..3456...123456789
123456789.2....78912345678912345.7891234567891234567891.....7..123456789123456789123456789.23.56.891234567891.3.5....123456789123456789123456789123456789123456789123456789123....89123456789123456789..3......1234567891.3......1234567891234567891234567891234567891234567891.3.56789..3..67.9123456789123456789..34.6..9123456789123456789.......891..45..891234567891234567891234567891..4..7891.34.6.891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891.34.67..123456789123456789123456789123456789..3..6...1.34.67....3..6...1234567891234567891234567891..45.7..123456789.234.6...1234567891234567891234567891234567891234567891234567891...5.7..123.56.89123456789123456789123456789..3456...123456789
123456789.2....78912345678912345.7891234567891234567891.....7..123456789123456789123456789.23.56.891234567891.3.5....123456789123456789123456789123456789123456789123456789123....89123456789123456789..3......1234567891.3......1234567891234567891234567891234567891234567891.3..6789..3..67.9123456789123456789..3..6..9123456789123456789.......891..45..891234567891234567891234567891..4..7891.3456.891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891.34.67..123456789123456789123456789123456789..3..6...1.34.67....3..6...1234567891234567891234567891..45.7..123456789.234.6...1234567891234567891234567891234567891234567891234567891...5.7..123.56.89123456789123456789123456789..3456...123456789
123456789.2....78912345678912345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.3.5...9123456789123456789123456789123456789123456789123456789.......891234567891234567891.34.6.891234567891.3...78.123456789123456789123456789123456789123456789..3.....9..3..6..9123456789123456789..34.6..9123456789123456789.......8912.45.789123456789123456789123456789...4...89..34.6..91234567891234567891234567891234567891234567891234567891.345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9.....6..9123456789123456789..3..6...1234567891234567891234567891.34.67..123456789.23456.89123456789123456789123456789123456789123456789.23.56.891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....789123456789.2345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.345...9123456789123456789123456789123456789123456789123456789.......891234567891234567891.34.6.891234567891.3...78.123456789123456789123456789123456789123456789..3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......8912.45.789123456789123456789123456789...4...89..34.6..91234567891234567891234567891234567891234567891234567891.345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9.....6..9123456789123456789..3..6...1234567891234567891234567891.34.67..123456789.23456.89123456789123456789123456789123456789123456789.23.56.891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....789123456789.2345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.345...9123456789123456789123456789123456789123456789123456789.......891234567891234567891.34.6.891234567891.3...78.123456789123456789123456789123456789123456789..3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......8912.45.789123456789123456789123456789...4...89..34.6..91234567891234567891234567891234567891234567891234567891.345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9........9123456789123456789..3..6..91234567891234567891234567891.34.67..123456789.23456.89123456789123456789123456789123456789123456789.23.56.891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....789123456789.2345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.345...9123456789123456789123456789123456789123456789123456789.......891234567891234567891.34.6.891234567891.3...78.123456789123456789123456789123456789123456789..3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......891..45.789123456789123456789123456789...4...89..34.6..912345678912345678912345678912345678912345678912345678912345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9........9123456789123456789..3..6..91234567891234567891234567891.34.67..123456789.23456.89123456789123456789123456789123456789123456789.23.56.891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.123456789123456789123456789123.56.891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3.....9..3..6..9123456789123456789..34.6..9123456789123456789.......891..45.789123456789123456789123456789...4...89..34.6..912345678912345678912345678912345678912345678912345678912345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9.....6..9123456789123456789..3..6...123456789123456789123456789...4..7..123456789.23456.89123456789123456789123456789123456789123456789.234.67891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.123456789123456789123456789123.56.891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3.....9..3..6..9123456789123456789..34.6..9123456789123456789.......891..45.789123456789123456789123456789...4...89..34.6..912345678912345678912345678912345678912345678912345678912345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9........9123456789123456789..3..6..9123456789123456789123456789...4..7..123456789.23456.89123456789123456789123456789123456789123456789.234.67891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......8912.45.789123456789123456789123456789...4...89..34.6..91234567891234567891234567891234567891234567891234567891.345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9.....6..9123456789123456789..3..6...123456789123456789123456789..34..7..123456789.23456.89123456789123456789123456789123456789123456789.234567891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......8912.45.789123456789123456789123456789...4...89..34.6..91234567891234567891234567891234567891234567891234567891.345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9........9123456789123456789..3..6..9123456789123456789123456789..34..7..123456789.23456.89123456789123456789123456789123456789123456789.234567891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......891..45.789123456789123456789123456789...4...89..34.6..912345678912345678912345678912345678912345678912345678912345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9........9123456789123456789..3..6..9123456789123456789123456789..34..7..123456789.23456.89123456789123456789123456789123456789123456789.234567891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......891..45.789123456789123456789123456789...4...89..34.6..9123456789123456789123456789123456789123456789123456789123.5678.123456789123456789123456789...45.7.9123456789123456789..3.5...9........9123456789123456789..3..6..91234567891234567891234567891.34..7..123456789.23456.89123456789123456789123456789123456789123456789.23456.891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......891..45..89123456789123456789123456789...4...89..34.6..9123456789123456789123456789123456789123456789123456789123.5678.123456789123456789123456789...45.7.9123456789123456789..3.5...9........9123456789123456789..3..6..91234567891234567891234567891.34..7..123456789.23456.89123456789123456789123456789123456789123456789.234567891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3.....9..3..6..9123456789123456789..34.6..9123456789123456789.......891..45.789123456789123456789123456789...4...89..34.6..912345678912345678912345678912345678912345678912345678912345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9.....6..9123456789123456789..3..6...123456789123456789123456789..34..7..123456789.23456.89123456789123456789123456789123456789123456789.234567891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.123456789123456789123456789.2..5..891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......891..45.789123456789123456789123456789...4...89..34.6..912345678912345678912345678912345678912345678912345678912345678.123456789123456789123456789...45.7.91234567891234567891.3.5...9........9123456789123456789..3..6..9123456789123456789123456789..34..7..123456789.23456.89123456789123456789123456789123456789123456789.234567891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.123456789123456789123456789.2..5..891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......891..45.789123456789123456789123456789...4...89..34.6..9123456789123456789123456789123456789123456789123456789123.5678.123456789123456789123456789...45.7.91234567891234567891.3.5...9........9123456789123456789..3..6..91234567891234567891234567891.34..7..123456789.23456.89123456789123456789123456789123456789123456789.23456.891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.123456789123456789123456789.2..5..891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3.....9..3..6..9123456789123456789..34.6.89123456789123456789........91..45.789123456789123456789123456789...4...89..34.6..912345678912345678912345678912345678912345678912345678912345678.123456789123456789123456789...45.7.91234567891234567891.3.5...9.....6..9123456789123456789..3..6...1234567891234567891234567891.34.67..123456789.23456.89123456789123456789123456789123456789123456789.23.56.891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.123456789123456789123456789.2..5..891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3.....9..3..6..9123456789123456789..34.6.89123456789123456789........91..45.789123456789123456789123456789...4...89..34.6..912345678912345678912345678912345678912345678912345678912345678.123456789123456789123456789...45.7.91234567891234567891.3.5...9........9123456789123456789..3..6..91234567891234567891234567891.34.67..123456789.23456.89123456789123456789123456789123456789123456789.23.56.891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.123456789123456789123456789.2..5..891234567891.3.5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3.....9..3..6..9123456789123456789..34.6.89123456789123456789........91..45.789123456789123456789123456789...4...89..34.6..9123456789123456789123456789123456789123456789123456789123.5678.123456789123456789123456789...45.7.91234567891234567891.3.5...9.....6..9123456789123456789..3..6...1234567891234567891234567891.34..7..123456789.23456.89123456789123456789123456789123456789123456789.23456.891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.912345678912345.7.9123456789123456789......78.123456789123456789123456789.2..5..891234567891...5...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.1234567891234567891234567891234567891234567891.3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......891..45.789123456789123456789123456789...4...89..34.6..912345678912345678912345678912345678912345678912345678912345678.123456789123456789123456789...45.7.91234567891234567891.3.5...9........9123456789123456789..3..6..9123456789123456789123456789..34..7..123456789.23456.89123456789123456789123456789123456789123456789.234567891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.9123456789.2345.7.9123456789123456789......78.123456789123456789123456789123.56.891234567891.345...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......8912.45.789123456789123456789123456789...4...89..34.6..91234567891234567891234567891234567891234567891234567891.345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9.....6..9123456789123456789..3..6...123456789123456789123456789...4..7..123456789.23456.89123456789123456789123456789123456789123456789.234.67891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.9123456789.2345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.345...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3..6..9.....6..9123456789123456789..34.6..9123456789123456789.......8912.45.789123456789123456789123456789...4...89..34.6..91234567891234567891234567891234567891234567891234567891.345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9.....6..9123456789123456789..3..6...123456789123456789123456789..34..7..123456789.23456.89123456789123456789123456789123456789123456789.234567891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.9123456789.2345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.345...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3.....9..3..6..9123456789123456789..34.6..9123456789123456789.......891..45.789123456789123456789123456789...4...89..34.6..912345678912345678912345678912345678912345678912345678912345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9.....6..9123456789123456789..3..6...123456789123456789123456789..34..7..123456789.23456.89123456789123456789123456789123456789123456789.234567891.345678.123456789123456789123456789123456789..3..6...123456789
123456789.2....7.9123456789.2345.7.9123456789123456789......78.12345678912345678912345678912..5..891234567891.345...9123456789123456789123456789123456789123456789123456789123....891234567891234567891.34.6..91234567891.3...78.123456789123456789123456789123456789123456789..3.....9..3..6..9123456789123456789..34.6..9123456789123456789.......891..45.789123456789123456789123456789...4...89..34.6..912345678912345678912345678912345678912345678912345678912345678.123456789123456789123456789...45.7.9123456789123456789..3.5...9........9123456789123456789..3..6..9123456789123456789123456789..34..7..123456789.23456.89123456789123456789123456789123456789123456789.234567891.345678.123456789123456789123456789123456789..3..6...123456789
12..5678..23..67.9123456789123456789123456789123456789...4..78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123..6.89123456789123456789123....8.1234567891..4..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6.89123456789123456789..3..6..912.45.789123456789123456789123456789...4...891234...891234567891234567891234567891234567891234567891234567891.345678.123456789123456789123456789..3.567..1234567891234567891234567891234..789123456789...4..7..123456789123456789123456789.23..6...123456789.23..6.89.2.....8.123456789123456789123456789123456789123456789..3..6.8...3.56.8........8.123456789123456789123456789..3456.8.123456789
12..5678..23..67.9123456789123456789123456789123456789...4..78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123..6.89123456789123456789123....8.1234567891..4..78.123456789123456789123456789123456789123456789..3..6.89.23..6..9123456789123456789..3..6.89123456789123456789..3..6..912.45.789123456789123456789123456789.......891234...891234567891234567891234567891234567891234567891234567891.345678.123456789123456789123456789..3.567..1234567891234567891234567891234.6789123456789...4..78.123456789123456789123456789.23..6...123456789.23..6.8..2.....8.123456789123456789123456789123456789123456789..3..6.8...3.56.8........8.123456789123456789123456789..3456.8.123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....891234567891234567891234.6..91234567891.3....8.123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789..34.6.891234567891234567891234567891..4..78.123456789123456789123456789.......8.1..4...8.123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789....5.7.9123456789123456789....5..89.....6.89123456789123456789...4567.9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891.345.78........89123456789123456789123456789..34.6.8.123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....891234567891234567891234.6..91234567891.3....8.123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789...4.6.891234567891234567891234567891..4..78.123456789123456789123456789.......8.1..4...8.123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...45.7.9123456789123456789....5..89.....6.89123456789123456789..3456..9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891.345.78........89123456789123456789123456789..34...89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....891234567891234567891234.6..91234567891.3....8.123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789...4.6.891234567891234567891234567891..4..78.123456789123456789123456789.......8.1..4...8.123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...45.7.9123456789123456789....5..89.....6.89123456789123456789...4567.9123456789123456789123456789.2.4.6.......56.89.2..56.891234567891234567891234567891234567891234567891234567891.345.78........89123456789123456789123456789..34.6.89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....891234567891234567891234.6..91234567891.3....8.123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789...4.6.891234567891234567891234567891..4..78.123456789123456789123456789.......8.1..4...8.123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789....5.7.9123456789123456789....5..89.....6.89123456789123456789..34567.9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891.345.78........89123456789123456789123456789..34...89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....891234567891234567891234.6..91234567891.3....8.123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789.....6.891234567891234567891234567891..4..78.123456789123456789123456789.......8.1.34.6.89123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...4567.9123456789123456789....5..89.....6.89123456789123456789....56..9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891..45.78........89123456789123456789123456789..3.56.89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....891234567891234567891234.6..91234567891.3....8.123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789.....6.891234567891234567891234567891..4..78.123456789123456789123456789.......8.1.34.6.89123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...4567.9123456789123456789....5...9.....6.89123456789123456789....56..9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891..45.78.....5..89123456789123456789123456789..3.56.89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....891234567891234567891234.6..91234567891.3....8.123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789.....6.891234567891234567891234567891..4..78.123456789123456789123456789.......8.1.34...89123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...45.7.9123456789123456789....5..89.....6.89123456789123456789..34567.9123456789123456789123456789.2.4.6.......56.89.2..56.891234567891234567891234567891234567891234567891234567891..45.78........89123456789123456789123456789..3.5..89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....891234567891234567891234.6..91234567891.3....8.123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789.....6.891234567891234567891234567891..4..78.123456789123456789123456789.......8.1..4.6.89123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...4567.9123456789123456789....5..89.....6.89123456789123456789....56..9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891..45.78........89123456789123456789123456789..3456.89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....891234567891234567891234.6..91234567891.3....8.123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789.....6.891234567891234567891234567891..4..78.123456789123456789123456789.......8.1..4.6.89123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...4567.9123456789123456789....5...9.....6.89123456789123456789....56..9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891..45.78.....5..89123456789123456789123456789..3456.89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....89123456789123456789123..6..91234567891.3......123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789.....6.891234567891234567891234567891..4..78.1234567891234567891234567891......8.1..4...89123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...45.7.9123456789123456789....5..89.....6.89123456789123456789..3456..9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891..45.78........89123456789123456789123456789..345..89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....89123456789123456789123..6..91234567891.3......123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789.....6.891234567891234567891234567891..4..78.1234567891234567891234567891......8.1..4...89123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...45.7.9123456789123456789....5..89.....6.89123456789123456789...456..9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891..45.78........89123456789123456789123456789..3456.89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789123.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....89123456789123456789123..6..91234567891.3......123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789.....6.891234567891234567891234567891..4..78.1234567891234567891234567891......8.1..4...89123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789....5.7.9123456789123456789....5..89.....6.89123456789123456789..34567.9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891..45.78........89123456789123456789123456789..345..89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.12345678912345678912345678912..56.891234567891234567891234567891234567891234567891234567891234567891234567891.3....891234567891234567891234.6..91234567891.3....8.123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789...4.6.891234567891234567891234567891..4..78.123456789123456789123456789.......8.1..4...8.123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...45.7.9123456789123456789....5..89.....6.89123456789123456789...4567.9123456789123456789123456789.2.4.6.......56.89.2..56.891234567891234567891234567891234567891234567891234567891.345.78........89123456789123456789123456789..3456.89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789.23.56.89123456789123456789123456789123456789123456789123456789123456789123456789123....89123456789123456789123..6..91234567891.3......123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789.....6.891234567891234567891234567891..45.78.1234567891234567891234567891......8.1..4.6.89123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...4567.9123456789123456789....5..89.....6.89123456789123456789....56..9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891..45.78........89123456789123456789123456789..3456.89123456789
12..56789.2.....8912345678912345678912345678912345678912....78.123456789123456789123456789.23.56.89123456789123456789123456789123456789123456789123456789123456789123456789.23....891234567891234567891234.6..91234567891.3....8.123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789.....6.891234567891234567891234567891..45.78.123456789123456789123456789.......8.1..4.6.89123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...4567.9123456789123456789....5..89.....6.89123456789123456789....56..9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891..45.78........89123456789123456789123456789..3456.89123456789
12..56789.2......912345678912345678912345678912345678912....78.12345678912345678912345678912..56.89123456789123456789123456789123456789123456789123456789123456789123456789123....891234567891234567891234.6..91234567891.3....8.123456789123456789123456789123456789123456789..3.56..9.23..6...123456789123456789...4.6.891234567891234567891234567891..4..78.123456789123456789123456789.......8.1..4...8.123456789123456789123456789123456789..3.56..9123456789123456789123456789123456789123456789...45.7.9123456789123456789....5..89.....6.89123456789123456789...4567.9123456789123456789123456789.2.4.6.......56.89.2..56.891234567891234567891234567891234567891234567891234567891.345.78........89123456789123456789123456789..3456.89123456789
12..5.789.2......912345678912345678912345678912345678912....78.123456789123456789123456789.23.56.89123456789123456789123456789123456789123456789123456789123456789123456789.23....891234567891234567891234.6..91234567891.3...78.123456789123456789123456789123456789123456789..3.56.89.23..6...123456789123456789...4.6.891234567891234567891234567891..45.78.123456789123456789123456789.......8.1..4...8.123456789123456789123456789123456789..3.56.89123456789123456789123456789123456789123456789...45.7.9123456789123456789....5...9.....6..9123456789123456789..3456..9123456789123456789123456789.2.4.67......56.89.2..56.891234567891234567891234567891234567891234567891234567891..45.78.....5..89123456789123456789123456789..345..89123456789
1..4.....123456789123456789...4.....1234567891234567891..4..7..1234567891234567891234567891.3.56..9123456789123456789123456789123456789123456789123456789123456789123456789123.56.891234567891234567891234.....1234567891.34..7..123456789123456789123456789123456789123456789..34.6..9.23..6..9123456789123456789..3..6..91234567891234567891234567891........1234567891234567891234567891..45.7891234...89123456789123456789123456789123456789..34.6..91234567891234567891234567891234567891234567891.345.7..1234567891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..34.6....23..6...123456789123456789123456789123456789123456789..3.5678.1.3.5..8..234.6.89123456789123456789123456789..3456.8.123456789
1..4.....123456789123456789...4.....1234567891234567891..4..7..1234567891234567891234567891.3.56..91234567891234567891234567891234567891234567891234567891234567891234567891.3.56.891234567891234567891234.....1234567891.34..78.123456789123456789123456789123456789123456789..34.6..9.23..6..9123456789123456789..3..6..91234567891234567891234567891........1234567891234567891234567891..45.7891234...89123456789123456789123456789123456789..34.6..91234567891234567891234567891234567891234567891.345.7..1234567891234567891234567891234567891234567891..4..7..123456789123456789123456789..3..6...123456789..34.6....23..6...123456789123456789123456789123456789123456789..3.5678.1.3.5.....23456.89123456789123456789123456789..3456.8.123456789
1..4..78.123456789123456789..345.78.1234567891234567891..4..78.1234567891234567891234567891.3.56.8.123456789123456789123456789123456789123456789123456789123456789123456789.......8.1234567891234567891.3....8.1234567891......8.123456789123456789123456789123456789123456789..3..6.89..3..6..9123456789123456789........91234567891234567891234567891..45.78.1234567891234567891234567891......891.345..8912345678912345678912345678912345678912345678912345678912345678.1234567891234567891234567891.3.567..123456789123456789..3.5..8.1234567891234567891..45.78.123456789123456789123456789.23..6.8.12345678.123456789.23.56.8.123456789123456789123456789123456789123456789..3..6.8...3.56.....3.56.8.123456789123456789123456789..3.56..9123456789
1...5.7..1234567891234567891..4..78.123456789123456789......7..123456789123456789123456789....56...1234567891234567891234567891234567891234567891234567891234567891234567891.3.56.891234567891234567891234.6.891234567891.....78.123456789123456789123456789123456789123456789..34...89.23..6..9123456789123456789.....6..91234567891234567891234567891...5.7..1234567891234567891234567891..4..7891.34.6..912345678912345678912345678912345678912345678912345678912345678.1234567891234567891234567891.3.567..12345678912345678912345678912....7891234567891234567891....67.9123456789123456789..3.56...1.34567..123456789.234.....123456789123456789123456789123456789123456789..3.56.....3.5.....23.56.8.123456789123456789123456789..3.56..9123456789
1...5.78.1234567891234567891.345.78.1234567891234567891..4..78.123456789123456789123456789..3.56.8.123456789123456789123456789123456789123456789123456789123456789123456789.......8.1234567891234567891.3....8.1234567891......8.123456789123456789123456789123456789123456789..3..6.89..3..6...123456789123456789.....6..91234567891234567891234567891..45.78.1234567891234567891234567891......89..345..8912345678912345678912345678912345678912345678912345678912345678.1234567891234567891234567891.3.567..123456789123456789..3.5..8.1234567891234567891..45.78.123456789123456789123456789.23..6.8.12345678.123456789.23.56.8.123456789123456789123456789123456789123456789..3..6.8...3.56.....3.56.8.123456789123456789123456789..3.56..9123456789
1...5.78.1234567891234567891.34..7..1234567891234567891..4..78.123456789123456789123456789....5....123456789123456789123456789123456789123456789123456789123456789123456789..3.5..8.123456789123456789..3......1234567891.34..78.123456789123456789123456789123456789123456789..3456.89..3..6..9123456789123456789.......89123456789123456789..3.56.8912.45.789123456789123456789123456789.......8912345..891234567891234567891234567891234567891234567891234567891.34.678.123456789123456789123456789..3..67..12345678912345678912.45.7..123456789123456789...4..78.123456789123456789123456789..3.56.8.123456789123456789.23..6...123456789123456789123456789123456789123456789..3.56.8.1.3.567...23456.89123456789123456789123456789..3456..9123456789
1...5.78.1234567891234567891.34..7..1234567891234567891..4..78.123456789123456789123456789....5....123456789123456789123456789123456789123456789123456789123456789123456789..3.5..8.123456789123456789..3......1234567891.34..78.123456789123456789123456789123456789123456789..3456.89..3..6..9123456789123456789.......89123456789123456789..3.56.8912.45.789123456789123456789123456789.......8912345..891234567891234567891234567891234567891234567891234567891.34.678.123456789123456789123456789..3..67..1234567891234567891..45.7..123456789123456789...4..78.123456789123456789123456789..3.56.8.123456789123456789.23.56...123456789123456789123456789123456789123456789..3.56.8.1.3.567...23456.89123456789123456789123456789..3456..9123456789
1...5.78.1234567891234567891.34..7..1234567891234567891..4..78.123456789123456789123456789....5....123456789123456789123456789123456789123456789123456789123456789123456789..3.5..8.123456789123456789..3......1234567891.34..78.123456789123456789123456789123456789123456789..34.6.89..3..6..9123456789123456789.......89123456789123456789..3.56.8912.45.789123456789123456789123456789.......8912345..891234567891234567891234567891234567891234567891234567891.34.678.123456789123456789123456789..3..67..12345678912345678912.45.78.123456789123456789...4..78.123456789123456789123456789..3.56.8.123456789123456789.23..6...123456789123456789123456789123456789123456789..3.56.8.1.3.567...23456.89123456789123456789123456789..3456..9123456789
1...5.78.1234567891234567891.34..7..1234567891234567891..4..78.123456789123456789123456789....5....123456789123456789123456789123456789123456789123456789123456789123456789..3.5..8.123456789123456789..3..6...1234567891.34..78.123456789123456789123456789123456789123456789..3456.89.....6..9123456789123456789.......89123456789123456789..3.56.8912.45.789123456789123456789123456789.......8912345..891234567891234567891234567891234567891234567891234567891.34.678.123456789123456789123456789..3..67..12345678912345678912.45.7..123456789123456789...4..78.123456789123456789123456789..3.56.8.123456789123456789.23..6...123456789123456789123456789123456789123456789..3.56.8.1.3.567...23456.89123456789123456789123456789..3456..9123456789
1...5.78.1234567891234567891.34..7..1234567891234567891..4..78.123456789123456789123456789....5....123456789123456789123456789123456789123456789123456789123456789123456789..3.5..8.123456789123456789..3..6...1234567891.34..78.123456789123456789123456789123456789123456789..3456.89.....6..9123456789123456789.......89123456789123456789..3.56.8912.45.789123456789123456789123456789.......8912345..891234567891234567891234567891234567891234567891234567891.34.678.123456789123456789123456789..3..67..1234567891234567891..45.7..123456789123456789...4..78.123456789123456789123456789..3.56.8.123456789123456789.23.56...123456789123456789123456789123456789123456789..3.56.8.1.3.567...23456.89123456789123456789123456789..3456..9123456789
1...5.78.1234567891234567891.34..7..1234567891234567891..4..78.123456789123456789123456789....5....123456789123456789123456789123456789123456789123456789123456789123456789..3.5..8.123456789123456789..3..6...1234567891.34..78.123456789123456789123456789123456789123456789..34.6.89.....6..9123456789123456789.......89123456789123456789..3.56.8912.45.789123456789123456789123456789.......8912345..891234567891234567891234567891234567891234567891234567891.34.678.123456789123456789123456789..3.567..12345678912345678912.45.78.123456789123456789...4..78.123456789123456789123456789..3.56.8.123456789123456789.23..6...123456789123456789123456789123456789123456789..3.56.8...3.56....23456.89123456789123456789123456789..3456..9123456789
1...5.78.1234567891234567891..4..78.1234567891234567891.....7..1234567891234567891234567891...56..91234567891234567891234567891234567891234567891234567891234567891234567891...56.891234567891234567891.34.6.8.1234567891.....78.123456789123456789123456789123456789123456789..3456.89..3..6..9123456789123456789........91234567891234567891....6..912.45.7891234567891234567891234567891.....78912345..891234567891234567891234567891234567891234567891234567891.345678.123456789123456789123456789...45.7..1..45.7..123456789...45..8.1234567891234567891..45.78.12345678912345678912345678912345678912.4567..123456789.23.56.8.1234567891234567891234567891234567891234567891....678.1...5678........8.123456789123456789123456789..3456.89123456789
dobrichev
2016 Supporter
 
Posts: 1777
Joined: 24 May 2010

Re: BLISS solver

Postby Mathimagics » Sat Nov 16, 2019 4:04 pm

Thanks Mladen!

I have ironed out the wrinkles in BLISS(2). It was failing to recognize some special cases, which need to be added to the specification:
The rules for 2-cell implication checking, ie BLISS(2):

  • Let PM be the current pencilmark state. Let PM0 to PM3 be the states obtained from the 4 possible combinations - setting (ra,ca) =/!= da + (rb,cb) =/!= db, then checking for singles (DoSingles). Note that some combinations might not be valid.
  • if any cell is solved, (rr, cc) = dd, in all valid PM0-3, but not in PM, then the implication is that (rr, cc) = dd
  • if for any cell (rr, cc) = dd is eliminated in all valid PM0-3, but not in PM, then the implication is that (rr, cc) != dd


We need to look at the following special cases:

  • when only 1 of the 4 x PMn results is valid, then the corresponding candidate pair ((ra,ca) # da + (rb,cb) # db) is implicit. The "#" denotes "=" or "!=", depending on the PM#
  • if da = db = d, and PM1 & PM2 are valid, but PM0 & PM3 are not, then we have an implied "pseudo-bilocal", ie (ra,ca) = d XOR (rb,cb) = d. Thus, if the 2 cells are in the same row, col or box, then d can be eliminated from other cells in the normal fashion.

BLISS now solves 2126 of the 15763 backdoor 3 puzzles in PH1910. In a few cases (10), it finds enough BLISS(2) eliminations to complete the solution with BLISS(1). An example:

Code: Select all
P: ........1.....234...3.1.25.....6..7...5..3..2.8.7.......4..1..51...9.6..95.8.....
 (2c) [7r7c7, 8r8c9] r7c7 != 7, r8c9 != 8 (*)
 (2c) [7r1c1, 7r1c2] r1c1 != 7, r1c2 != 7 (*)
 (2c) [9r1c7, 8r1c8] r1c7 != 9, r1c8 != 8 (*)
 (2c) [7r1c3, 7r1c6] r1c3 != 7, r1c6 != 7 (*)
 (2c) [4r5c1, 1r5c2] r5c1 != 4, r5c2 != 1 (*)
 (2c) [4r9c7, 1r9c8] r2c9 ^= 7
 (2c) [4r9c7, 1r9c8] r2c9 ^= 7
 (2c) [6r1c1, 9r5c2] r1c1 != 6, r5c2 != 9 (*)
 (1c) [69r1c8]       r1c2 ^= 6
 (1c) [69r1c8]       r1c3 ^= 6
 (1c) [69r1c8]       r1c4 ^= 6
 (1c) [ 6r1c6]       r1c8  = 6
 (1c) [ 7r1c5]       r1c7  = 7
 (1c) [ 1r2c2]       r2c3 ^= 1, r4c2 ^= 1
 (1c) [ 6r2c3]       r3c4  = 6
 (1c) [ 5r1c1]       r1c4 ^= 5, r1c5 ^= 5, r1c6 ^= 5, r2c1 ^= 5
 (1c) [ 2r1c2]       r7c2 ^= 2
 (1c) [ 2r1c3]       r1c2 ^= 4
 (1c) [ 8r1c3]       r2c1  = 7
 (1c) [ 2r1c2]       BD
S: 529438761716952348843617259491265873675183492382749516264371985138594627957826134


I note that Easter Monster is (unsurprisingly) not solvable with BLISS(2). What is remarkable is that it offers up absolutely nothing, no eliminations that can be deduced with BLISS(2).
User avatar
Mathimagics
2017 Supporter
 
Posts: 1482
Joined: 27 May 2015
Location: Canberra

Re: BLISS solver

Postby Mathimagics » Sun Nov 17, 2019 4:12 am

@Mladen: I couldn't really use anything in your PencilMarks.h file. I am using the "short int" interface of the original fsss2 for PM solving.

I have done some PM-only puzzle testing.

At one extreme, we have tarek's "backdoor 6" examples. I notice that normal dSolve (ie with guessing) requires over 500,000 guesses for the first 3 cases, so it is no surprise that BLISS can find no eliminations from these. They really are extreme!

Mladen's 637-candidate (still a record?) puzzle, on the other hand, is solved with BLISS(1). This suggests it might be P&P solvable. The dSolve guess count is 8 for this one.

"PM637 log": Show
Code: Select all
PM candidates = 637, givens = 0
 (1c) [27r7c8]       r1c3 ^= 2
 (1c) [27r7c8]       r1c4 ^= 2
 (1c) [27r7c8]       r1c7 ^= 3
 (1c) [27r7c8]       r1c8 ^= 2, r1c8 ^= 3, r1c8 ^= 7
 (1c) [27r7c8]       r1c9 ^= 3, r1c9 ^= 5
 (1c) [27r7c8]       r2c1 ^= 3
 (1c) [27r7c8]       r2c2 ^= 3
 (1c) [15r2c2]       r2c7 ^= 5
 (1c) [15r2c2]       r5c5 ^= 5
 (1c) [15r2c2]       r8c2 ^= 5
 (1c) [15r2c2]       r8c5 ^= 5
 (1c) [27r7c8]       r1c1 ^= 4, r1c1 ^= 5
 (1c) [27r7c8]       r1c2 ^= 1, r1c2 ^= 4, r1c2 ^= 5, r1c2 ^= 7
 (1c) [ 5r1c3]       r1c5  = 5
 (1c) [27r7c8]       r1c3 ^= 4
 (1c) [27r7c8]       r1c4  = 4
 (1c) [27r7c8]       r1c6 ^= 1, r1c6 ^= 7
 (1c) [27r7c8]       r2c1 ^= 5
 (1c) [27r7c8]       r2c2  = 5
 (1c) [27r7c8]       r2c3 ^= 2, r2c3 ^= 3
 (1c) [27r7c8]       r2c4 ^= 2, r2c4 ^= 3, r2c4 ^= 8
 (1c) [27r7c8]       r2c5 ^= 1, r2c5 ^= 3
 (1c) [27r7c8]       r2c6 ^= 1, r2c6 ^= 3, r2c6 ^= 7
 (1c) [ 1r3c4]       r3c1 ^= 1, r3c2 ^= 1, r3c3 ^= 1, r3c7 ^= 1, r3c8 ^= 1,
                     r3c9 ^= 1
 (1c) [ 1r1c1]       r4c1 ^= 1, r5c1 ^= 1, r6c1 ^= 1, r7c1 ^= 1, r8c1 ^= 1,
                     r9c1 ^= 1
 (1c) [14r5c2]       r8c3 ^= 5
 (1c) [14r5c2]       r8c8 ^= 1
 (1c) [27r7c8]       r2c7 ^= 3, r2c7 ^= 4
 (1c) [27r7c8]       r2c8  = 3
 (1c) [27r7c8]       r3c2 ^= 7
 (1c) [27r7c8]       r3c3 ^= 2
 (1c) [27r7c8]       r3c4  = 1
 (1c) [27r7c8]       r3c6 ^= 7
 (1c) [67r2c3]       r1c1 ^= 6
 (1c) [67r2c3]       r1c2 ^= 6
 (1c) [67r2c3]       r1c3 ^= 6
 (1c) [67r2c3]       r1c6  = 6
 (1c) [ 1r1c1]       r2c9 ^= 8
 (1c) [67r2c3]       r2c1 ^= 6
 (1c) [67r2c3]       r2c7 ^= 6
 (1c) [67r2c3]       r2c9 ^= 6
 (1c) [79r2c4]       r2c1 ^= 7
 (1c) [79r2c4]       r2c7 ^= 7
 (1c) [79r2c4]       r2c9 ^= 7
 (1c) [27r7c8]       r3c7  = 5
 (1c) [ 1r1c1]       r1c2 ^= 8, r1c3 ^= 8, r1c7 ^= 1, r1c7 ^= 8
 (1c) [ 1r1c1]       r1c8  = 8
 (1c) [ 1r1c1]       r1c9 ^= 1, r2c1 ^= 1
 (1c) [ 4r2c1]       r2c9 ^= 4, r3c1 ^= 4, r3c2 ^= 4, r3c3 ^= 4, r4c1 ^= 4,
                     r6c1 ^= 4, r7c1 ^= 4, r8c1 ^= 4, r9c1 ^= 4
 (1c) [ 8r2c5]       r3c6 ^= 8
 (1c) [ 1r2c7]       r4c9 ^= 1, r6c9 ^= 1
 (1c) [29r3c6]       r1c2  = 2
 (1c) [79r1c7]       r2c7 ^= 9
 (1c) [79r1c7]       r2c9 ^= 9
 (1c) [79r1c7]       r3c8 ^= 7, r3c8 ^= 9
 (1c) [79r1c7]       r3c9 ^= 7, r3c9 ^= 9
 (1c) [ 8r2c5]       r2c6 ^= 2
 (1c) [ 2r2c5]       r3c6  = 2
 (1c) [46r3c8]       r3c9  = 6
 (1c) [12r2c7]       r2c9  = 1
 (1c) [ 1r4c8]       r4c7 ^= 1, r6c7 ^= 1
 (1c) [27r7c8]       r4c1 ^= 5, r4c1 ^= 6
 (1c) [27r7c8]       r4c2 ^= 6, r4c2 ^= 7
 (1c) [27r7c8]       r4c3 ^= 2
 (1c) [27r7c8]       r4c4  = 6
 (1c) [27r7c8]       r4c6 ^= 3, r4c6 ^= 7
 (1c) [27r7c8]       r4c8 ^= 2, r4c8 ^= 7
 (1c) [27r7c8]       r4c9 ^= 5
 (1c) [27r7c8]       r5c1 ^= 5
 (1c) [27r7c8]       r5c3 ^= 2
 (1c) [27r7c8]       r5c4 ^= 2, r5c4 ^= 5, r5c4 ^= 8
 (1c) [79r2c4]       r6c4 ^= 7, r6c4 ^= 9
 (1c) [79r2c4]       r7c4 ^= 7, r7c4 ^= 9
 (1c) [79r2c4]       r8c4 ^= 7, r8c4 ^= 9
 (1c) [79r2c4]       r9c4 ^= 7, r9c4 ^= 9
 (1c) [27r7c8]       r5c6 ^= 3, r5c6 ^= 7
 (1c) [ 3r6c4]       r6c1 ^= 3, r6c2 ^= 3, r6c7 ^= 3, r6c9 ^= 3
 (1c) [27r7c8]       r5c8 ^= 2, r5c8 ^= 7
 (1c) [27r7c8]       r5c9 ^= 5
 (1c) [27r7c8]       r6c1 ^= 5
 (1c) [27r7c8]       r6c2 ^= 7
 (1c) [27r7c8]       r6c3 ^= 2
 (1c) [ 2r7c3]       r6c4  = 3
 (1c) [ 2r7c3]       r6c6 ^= 7, r6c8 ^= 2, r6c8 ^= 7, r6c9 ^= 5, r7c1 ^= 2,
                     r7c1 ^= 5, r7c1 ^= 7, r7c2 ^= 7
 (1c) [ 2r7c3]       r7c4  = 5
 (1c) [ 2r7c3]       r7c5 ^= 2
 (1c) [ 2r7c3]       r7c6  = 7
 (1c) [ 8r2c5]       r4c6 ^= 8, r6c6 ^= 8
 (1c) [ 3r4c2]       r7c2 ^= 4, r7c2 ^= 8, r7c2 ^= 9, r7c7 ^= 3, r7c9 ^= 3
 (1c) [ 1r4c6]       r4c5 ^= 1, r6c5 ^= 1
 (1c) [ 3r4c7]       r1c7  = 7
 (1c) [ 3r4c7]       r2c4  = 7
 (1c) [89r2c5]       r2c6  = 9
 (1c) [======]       STTE
User avatar
Mathimagics
2017 Supporter
 
Posts: 1482
Joined: 27 May 2015
Location: Canberra

Re: BLISS solver

Postby Mathimagics » Sun Nov 17, 2019 7:57 am

BLISS now supports SudokuP, SudokuX and SudokuPX.

All known 11C puzzles (186,624) are solved with BLISS(1).

The example below is for the puzzle with the highest dSolve guess count (66):

"11C SudokuP": Show
Code: Select all
BLISS (SudokuP mode)
P: 1........4.....3............6......7.89.....5....4...................2.......2... (ng = 66)
 (1c) [ 2r1c4]       r3c8 != 2
 (1c) [ 2r1c9]       r1c8 != 2, r2c3 != 2
 (1c) [ 2r1c9]       r2c9  = 2
 (1c) [ 2r1c3]       r7c1 != 2
 (1c) [ 2r1c3]       r7c3  = 2
 (1c) [16r5c4]       r2c4 != 1, r2c4 != 6
 (1c) [16r5c4]       r8c1 != 6
 (1c) [16r5c4]       r8c4 != 1, r8c4 != 6
 (1c) [ 1r6c2]       r6c4 != 1, r6c6 != 1, r6c7 != 1, r6c8 != 1, r6c9 != 1
 (1c) [ 2r1c2]       r3c4 != 6
 (1c) [ 1r4c8]       r1c4 != 6, r3c7 != 1
 (1c) [ 1r4c8]       r5c4  = 6
 (1c) [ 2r1c2]       r1c4 != 3, r1c4 != 5, r1c4 != 7, r1c4 != 8, r1c4 != 9,
                     r3c7 != 4, r4c8 != 8, r4c8 != 9
 (1c) [ 3r1c3]       r3c1 != 3, r3c2 != 3, r6c3 != 3
 (1c) [ 1r3c4]       r3c6 != 4, r7c5 != 1, r7c6 != 1, r8c5 != 1
 (1c) [ 1r3c4]       r8c6  = 4
 (1c) [ 2r1c2]       r1c3  = 3
 (1c) [ 2r1c2]       r1c4  = 4
 (1c) [ 6r1c6]       r1c7 != 6, r1c9 != 6, r2c5 != 6, r7c6 != 6
 (1c) [ 9r1c5]       BD
S: 123456789456897312978231564264518937789623145315749826842375691531964278697182453
User avatar
Mathimagics
2017 Supporter
 
Posts: 1482
Joined: 27 May 2015
Location: Canberra

BLISS solver

Postby Mathimagics » Mon Nov 18, 2019 4:53 pm

BLISS in pencilmark mode can't deal with most hard puzzles, but sometimes it succeeds spectacularly.

This example is for the first puzzle in tdillon's set of 100 hard puzzles. It has 610 candidates + 119 clues, and has no singles or pairs:
Code: Select all
+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
| 1456789   | 3456789   | 456789    | 12356789  | 2356789   | 13456789  | 123456789 | 123456789 | 123456789 |
| 123456789 | 3456789   | 456789    | 123456789 | 23456789  | 23456789  | 1245789   | 123456789 | 23456789  |
| 123456789 | 13456789  | 123456789 | 1256789   | 12789     | 13456789  | 12456789  | 126789    | 12456789  |
+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
| 123456789 | 1256789   | 256789    | 123456789 | 26789     | 456789    | 2789      | 1236789   | 23456789  |
| 123456789 | 23456789  | 23456789  | 3456789   | 234789    | 123456789 | 2349      | 23456789  | 23456789  |
| 23456789  | 123456789 | 23456789  | 1345789   | 23456789  | 3456789   | 23456789  | 123456789 | 3489      |
+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
| 123456789 | 123456789 | 123456789 | 12456789  | 123456789 | 123456789 | 123456789 | 1234569   | 123456789 |
| 12456789  | 13456789  | 156789    | 156789    | 23456789  | 1456789   | 123456789 | 13456789  | 3456789   |
| 235679    | 123456789 | 89        | 23456789  | 456789    | 12346789  | 356789    | 123456789 | 456789    |
+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+


Mladens Pencilmark solver (v1.1) solves this one in 4.2s, but BLISS(1) takes less than 5ms to crack it:

Code: Select all
Start BLISS solve
 (1c) [ 1r4c8]       r1c8 != 1, r2c8 != 1, r3c8 != 1, r7c8 != 1, r8c8 != 1,
                     r9c8 != 1
 (1c) [ 1r3c5]       r1c4 != 1, r1c6 != 1, r3c1 != 1, r3c2 != 1, r3c4 != 1,
                     r3c6 != 1, r3c7 != 1, r3c9 != 1
 (1c) [ 1r1c9]       r1c1 != 1, r1c7 != 1, r2c7 != 1, r7c9 != 1
 (1c) [ 1r2c1]       r2c4  = 1
 (1c) [ 2r2c1]       r1c4 != 2, r1c5 != 2
 (1c) [ 2r2c1]       r1c7  = 2
 (1c) [ 2r2c1]       r2c5 != 2
 (1c) [ 2r2c1]       r2c6  = 2
 (1c) [ 4r4c6]       r1c6 != 4, r2c1 != 4, r2c2 != 4, r2c3 != 4
 (1c) [ 4r4c6]       r2c5  = 4
 (1c) [ 4r4c6]       r4c9 != 4, r5c4 != 4, r6c4 != 4, r6c6 != 4, r7c6 != 4,
                     r8c6 != 4, r9c6 != 4
 (1c) [ 3r4c8]       r2c9 != 3
 (1c) [ 3r4c8]       r4c9  = 3
 (1c) [ 3r1c8]       r1c1 != 4, r1c2 != 3, r1c4 != 3, r1c4 != 5, r1c5 != 3,
                     r1c6 != 3
 (1c) [ 3r1c8]       r2c1  = 3
 (1c) [ 9r1c2]       BD
S: 849765231376142859251893476195284763683571942724936518562418397437629185918357624
BLISS time =    0.005s
User avatar
Mathimagics
2017 Supporter
 
Posts: 1482
Joined: 27 May 2015
Location: Canberra

Next

Return to Software