Sudoko Solver

A Perl "one-liner" to solve Sudoko puzzles. This program uses an optimized Brute Force Search to solve the Sudoko in only 88 interations.

[1] https://en.wikipedia.org/wiki/Sudoku_solving_algorithms

Usage

$ time ( perl -e '
  $t = "root";
  $h->{$t} = q[-----526--1-------74-----91-5-79-----8--2--5-----36-1-49-----23-------8--256-----];
  simplify($t, 1);
  foreach $enum(0..511){
    undef @changes;
    $bit = 1;
    foreach $r(0..8){
      foreach $c(0..8){
        $combo = $w->{$t}{p}{$c}{$r};
        if(2 == length($combo)){
          $z_o = ($enum & (1 << ($bit - 1))) ? 1 : 0;
          $d = substr($combo, $z_o, 1);
          printf qq[- ab set: enum %u: c%ur%u = %s # %u=bit %u=z_o %u=d\n], $enum, 1 + $c, 1 + $r, $combo, $bit, $z_o, $d;
          push @changes, ($c, $r, $d); $bit ++;
        }
      }
    }
    if(0){ printf qq[- changes: @changes\n]; }
    simplify(ab_set($t, @changes), 1);
  }
  sub simplify{
    ($v, $depth) = @_;
    do{ find_cell_digits($v); }while(can_be_simplified($v) > 0);
  }
  sub find_cell_digits{
    ($v) = @_;
    delete $w->{$v};
    printf qq[- variant: %s\n], $v;
    foreach $r(0..8){
      push @{$w->{$v}{r}}, substr($h->{$v}, 9 * $r, 9);
      foreach $c(0..8){
        $d = substr($h->{$v}, ($r * 9) + $c, 1); $w->{$v}{c}[$c] .= $d;
        $s = (int($r / 3) * 3) + int($c / 3)   ; $w->{$v}{s}[$s] .= $d;
      }
    }
    printf qq[- rows: @{$w->{$v}{r}}\n- cols: @{$w->{$v}{c}}\n- sqrs: @{$w->{$v}{s}}\n];
  }
  sub can_be_simplified{
    ($v) = @_;
    $good = 0; $b = 0; $z = 1;
    foreach $r(0..8){
      printf qq[- row%u: %s: ], 1 + $r, substr($h->{$v}, 9 * $r, 9);
      foreach $c(0..8){
        $d = substr($h->{$v}, ($r * 9) + $c, 1);
        if($d =~ m~[1-9]~){ $good ++; printf qq[%-9s ], "[$d]"; next; }
        $s = (int($r / 3) * 3) + int($c / 3);
        foreach $d(1..9){
          next if($w->{$v}{c}[$c] =~ m~$d~);
          next if($w->{$v}{r}[$r] =~ m~$d~);
          next if($w->{$v}{s}[$s] =~ m~$d~);
          $w->{$v}{p}{$c}{$r} .= qq[$d];
        }
        $combo = $w->{$v}{p}{$c}{$r};
        if(1 == length($combo)){ $b = 1; substr($h->{$v}, ($r * 9) + $c, 1) = $combo; }
        if(0 == length($combo)){ $combo  = q[ZILCH]; $z = -1; }
        if(1 == length($combo)){ $combo .= q[ !!!!!!!]; }
        if(2 == length($combo)){ $combo .= q[ <<<<<<]; }
        printf qq[%-9s ], $combo;
      }
      printf qq[\n];
    }
    printf qq[- return: $b * $z = %d\n\n], $b * $z;
    if(81 == $good){ printf qq[- winner: after %u iterations!\n], 1 + $enum; exit; }
    return $b * $z;
  }
  sub ab_set{
    ($v, @changes) = @_;
    $v2 = $v;
    $tmp = $h->{$v};
    while($#changes >= 0){
      $c = shift @changes;
      $r = shift @changes;
      $d = shift @changes;
      $v2 .= sprintf qq[ c%ur%u=%u], 1 + $c, 1 + $r, $d;
      substr($tmp, ($r * 9) + $c, 1) = $d;
      if(0){ printf qq[$c=c $r=r $d=d %s %s\n], $tmp, $v2; }
    }
    $h->{$v2} = $tmp;
    return $v2;
  }' | tee sudoku.log | tail -1 ) # see https://www.websudoku.com/?level=4&set_id=1527376286
- winner: after 88 iterations!

real	0m0.426s

Algorithm Details

  • 1st: Optimization step: Resolve any cells which can only be a single digit.
  • 2nd: Optimization step: Determine all cells which only have two possible digits.
  • 3rd: Brute Force Search through all the combinations of two possible digit cells.

Implementation Details

  • Max 9 cells with dual digit possibilites are assumed.
  • The max 512 combinations to test are determined via binary math operations.
  • Although Perl is much slower than e.g. C++, this optimized Brute Force Search algorithm in Perl is only a little slower than a non-optimized Brute Force Search algorithm in C++, due to the two orders of magnitude less combinations needing to be checked.
  • Each iteration shows its working for easy debugging:
$ cat sudoku.log
- variant: root
- rows: -----526- -1------- 74-----91 -5-79---- -8--2--5- ----36-1- 49-----23 -------8- -256-----
- cols: --7---4-- -1458-9-2 --------5 ---7----6 ---923--- 5----6--- 2-------- 6-9-5128- --1---3--
- sqrs: ----1-74- --5------ 26-----91 -5--8---- 79--2--36 ----5--1- 49-----25 ------6-- -23-8----
- row1: -----526-: 389       3 !!!!!!! 389       13489     1478      [5]       [2]       [6]       478       
- row2: -1-------: 235689    [1]       23689     23489     4678      234789    34578     347       4578      
- row3: 74-----91: [7]       [4]       2368      238       68 <<<<<< 238       358       [9]       [1]       
- row4: -5-79----: 1236      [5]       12346     [7]       [9]       148       3468      34 <<<<<< 2468      
- row5: -8--2--5-: 1369      [8]       134679    14 <<<<<< [2]       14 <<<<<< 34679     [5]       4679      
- row6: ----36-1-: 29 <<<<<< 7 !!!!!!! 2479      458       [3]       [6]       4789      [1]       24789     
- row7: 49-----23: [4]       [9]       1678      158       1578      178       1567      [2]       [3]       
- row8: -------8-: 136       367       1367      123459    1457      123479    145679    [8]       45679     
- row9: -256-----: 138       [2]       [5]       [6]       1478      134789    1479      47 <<<<<< 479       
- return: 1 * 1 = 1

- variant: root
- rows: -3---526- -1------- 74-----91 -5-79---- -8--2--5- -7--36-1- 49-----23 -------8- -256-----
- cols: --7---4-- 3145879-2 --------5 ---7----6 ---923--- 5----6--- 2-------- 6-9-5128- --1---3--
- sqrs: -3--1-74- --5------ 26-----91 -5--8--7- 79--2--36 ----5--1- 49-----25 ------6-- -23-8----
- row1: -3---526-: 89 <<<<<< [3]       89 <<<<<< 1489      1478      [5]       [2]       [6]       478       
- row2: -1-------: 25689     [1]       2689      23489     4678      234789    34578     347       4578      
- row3: 74-----91: [7]       [4]       268       238       68 <<<<<< 238       358       [9]       [1]       
- row4: -5-79----: 1236      [5]       12346     [7]       [9]       148       3468      34 <<<<<< 2468      
- row5: -8--2--5-: 1369      [8]       13469     14 <<<<<< [2]       14 <<<<<< 34679     [5]       4679      
- row6: -7--36-1-: 29 <<<<<< [7]       249       458       [3]       [6]       489       [1]       2489      
- row7: 49-----23: [4]       [9]       1678      158       1578      178       1567      [2]       [3]       
- row8: -------8-: 136       6 !!!!!!! 1367      123459    1457      123479    145679    [8]       45679     
- row9: -256-----: 138       [2]       [5]       [6]       1478      134789    1479      47 <<<<<< 479       
- return: 1 * 1 = 1

- variant: root
- rows: -3---526- -1------- 74-----91 -5-79---- -8--2--5- -7--36-1- 49-----23 -6-----8- -256-----
- cols: --7---4-- 314587962 --------5 ---7----6 ---923--- 5----6--- 2-------- 6-9-5128- --1---3--
- sqrs: -3--1-74- --5------ 26-----91 -5--8--7- 79--2--36 ----5--1- 49--6--25 ------6-- -23-8----
- row1: -3---526-: 89 <<<<<< [3]       89 <<<<<< 1489      1478      [5]       [2]       [6]       478       
- row2: -1-------: 25689     [1]       2689      23489     4678      234789    34578     347       4578      
- row3: 74-----91: [7]       [4]       268       238       68 <<<<<< 238       358       [9]       [1]       
- row4: -5-79----: 1236      [5]       12346     [7]       [9]       148       3468      34 <<<<<< 2468      
- row5: -8--2--5-: 1369      [8]       13469     14 <<<<<< [2]       14 <<<<<< 34679     [5]       4679      
- row6: -7--36-1-: 29 <<<<<< [7]       249       458       [3]       [6]       489       [1]       2489      
- row7: 49-----23: [4]       [9]       178       158       1578      178       1567      [2]       [3]       
- row8: -6-----8-: 13 <<<<<< [6]       137       123459    1457      123479    14579     [8]       4579      
- row9: -256-----: 138       [2]       [5]       [6]       1478      134789    1479      47 <<<<<< 479       
- return: 0 * 1 = 0

- ab set: enum 0: c1r1 = 89 # 1=bit 0=z_o 8=d
- ab set: enum 0: c3r1 = 89 # 2=bit 0=z_o 8=d
- ab set: enum 0: c5r3 = 68 # 3=bit 0=z_o 6=d
- ab set: enum 0: c8r4 = 34 # 4=bit 0=z_o 3=d
- ab set: enum 0: c4r5 = 14 # 5=bit 0=z_o 1=d
- ab set: enum 0: c6r5 = 14 # 6=bit 0=z_o 1=d
- ab set: enum 0: c1r6 = 29 # 7=bit 0=z_o 2=d
- ab set: enum 0: c1r8 = 13 # 8=bit 0=z_o 1=d
- ab set: enum 0: c8r9 = 47 # 9=bit 0=z_o 4=d
- variant: root c1r1=8 c3r1=8 c5r3=6 c8r4=3 c4r5=1 c6r5=1 c1r6=2 c1r8=1 c8r9=4
- rows: 838--526- -1------- 74--6--91 -5-79--3- -8-121-5- 27--36-1- 49-----23 16-----8- -256---4-
- cols: 8-7--241- 314587962 8-------5 ---71---6 --6923--- 5---16--- 2-------- 6-9351284 --1---3--
- sqrs: 838-1-74- --5----6- 26-----91 -5--8-27- 79-121-36 -3--5--1- 49-16--25 ------6-- -23-8--4-
- row1: 838--526-: [8]       [3]       [8]       49 <<<<<< 147       [5]       [2]       [6]       47 <<<<<< 
- row2: -1-------: 569       [1]       269       23489     478       234789    34578     7 !!!!!!! 4578      
- row3: 74--6--91: [7]       [4]       2 !!!!!!! 238       [6]       238       358       [9]       [1]       
- row4: -5-79--3-: 6 !!!!!!! [5]       146       [7]       [9]       48 <<<<<< 468       [3]       2468      
- row5: -8-121-5-: 369       [8]       3469      [1]       [2]       [1]       4679      [5]       4679      
- row6: 27--36-1-: [2]       [7]       49 <<<<<< 458       [3]       [6]       489       [1]       489       
- row7: 49-----23: [4]       [9]       7 !!!!!!! 58 <<<<<< 1578      78 <<<<<< 1567      [2]       [3]       
- row8: 16-----8-: [1]       [6]       37 <<<<<< 23459     457       23479     579       [8]       579       
- row9: -256---4-: 3 !!!!!!! [2]       [5]       [6]       178       3789      179       [4]       79 <<<<<< 
- return: 1 * 1 = 1

- variant: root c1r1=8 c3r1=8 c5r3=6 c8r4=3 c4r5=1 c6r5=1 c1r6=2 c1r8=1 c8r9=4
- rows: 838--526- -1-----7- 742-6--91 65-79--3- -8-121-5- 27--36-1- 497----23 16-----8- 3256---4-
- cols: 8-76-2413 314587962 8-2---7-5 ---71---6 --6923--- 5---16--- 2-------- 679351284 --1---3--
- sqrs: 838-1-742 --5----6- 26--7--91 65--8-27- 79-121-36 -3--5--1- 49716-325 ------6-- -23-8--4-
- row1: 838--526-: [8]       [3]       [8]       49 <<<<<< 147       [5]       [2]       [6]       4 !!!!!!! 
- row2: -1-----7-: 59 <<<<<< [1]       69 <<<<<< 23489     48 <<<<<< 23489     3458      [7]       458       
- row3: 742-6--91: [7]       [4]       [2]       38 <<<<<< [6]       38 <<<<<< 358       [9]       [1]       
- row4: 65-79--3-: [6]       [5]       14 <<<<<< [7]       [9]       48 <<<<<< 48 <<<<<< [3]       248       
- row5: -8-121-5-: 9 !!!!!!! [8]       349       [1]       [2]       [1]       4679      [5]       4679      
- row6: 27--36-1-: [2]       [7]       49 <<<<<< 458       [3]       [6]       489       [1]       489       
- row7: 497----23: [4]       [9]       [7]       58 <<<<<< 158       8 !!!!!!! 156       [2]       [3]       
- row8: 16-----8-: [1]       [6]       ZILCH     23459     457       23479     579       [8]       579       
- row9: 3256---4-: [3]       [2]       [5]       [6]       178       789       179       [4]       79 <<<<<< 
- return: 1 * -1 = -1
...
- ab set: enum 87: c1r1 = 89 # 1=bit 1=z_o 9=d
- ab set: enum 87: c3r1 = 89 # 2=bit 1=z_o 9=d
- ab set: enum 87: c5r3 = 68 # 3=bit 1=z_o 8=d
- ab set: enum 87: c8r4 = 34 # 4=bit 0=z_o 3=d
- ab set: enum 87: c4r5 = 14 # 5=bit 1=z_o 4=d
- ab set: enum 87: c6r5 = 14 # 6=bit 0=z_o 1=d
- ab set: enum 87: c1r6 = 29 # 7=bit 1=z_o 9=d
- ab set: enum 87: c1r8 = 13 # 8=bit 0=z_o 1=d
- ab set: enum 87: c8r9 = 47 # 9=bit 0=z_o 4=d
- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 939--526- -1------- 74--8--91 -5-79--3- -8-421-5- 97--36-1- 49-----23 16-----8- -256---4-
- cols: 9-7--941- 314587962 9-------5 ---74---6 --8923--- 5---16--- 2-------- 6-9351284 --1---3--
- sqrs: 939-1-74- --5----8- 26-----91 -5--8-97- 79-421-36 -3--5--1- 49-16--25 ------6-- -23-8--4-
- row1: 939--526-: [9]       [3]       [9]       1 !!!!!!! 147       [5]       [2]       [6]       478       
- row2: -1-------: 2568      [1]       268       239       467       23479     34578     7 !!!!!!! 4578      
- row3: 74--8--91: [7]       [4]       26 <<<<<< 23 <<<<<< [8]       23 <<<<<< 35 <<<<<< [9]       [1]       
- row4: -5-79--3-: 26 <<<<<< [5]       1246      [7]       [9]       8 !!!!!!! 468       [3]       2468      
- row5: -8-421-5-: 36 <<<<<< [8]       36 <<<<<< [4]       [2]       [1]       679       [5]       679       
- row6: 97--36-1-: [9]       [7]       24 <<<<<< 58 <<<<<< [3]       [6]       48 <<<<<< [1]       248       
- row7: 49-----23: [4]       [9]       78 <<<<<< 158       157       78 <<<<<< 1567      [2]       [3]       
- row8: 16-----8-: [1]       [6]       37 <<<<<< 2359      457       23479     579       [8]       579       
- row9: -256---4-: 38 <<<<<< [2]       [5]       [6]       17 <<<<<< 3789      179       [4]       79 <<<<<< 
- return: 1 * 1 = 1

- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 9391-526- -1-----7- 74--8--91 -5-798-3- -8-421-5- 97--36-1- 49-----23 16-----8- -256---4-
- cols: 9-7--941- 314587962 9-------5 1--74---6 --8923--- 5--816--- 2-------- 679351284 --1---3--
- sqrs: 939-1-74- 1-5----8- 26--7--91 -5--8-97- 798421-36 -3--5--1- 49-16--25 ------6-- -23-8--4-
- row1: 9391-526-: [9]       [3]       [9]       [1]       47 <<<<<< [5]       [2]       [6]       48 <<<<<< 
- row2: -1-----7-: 2568      [1]       268       239       46 <<<<<< 2349      3458      [7]       458       
- row3: 74--8--91: [7]       [4]       26 <<<<<< 23 <<<<<< [8]       23 <<<<<< 35 <<<<<< [9]       [1]       
- row4: -5-798-3-: 26 <<<<<< [5]       1246      [7]       [9]       [8]       46 <<<<<< [3]       246       
- row5: -8-421-5-: 36 <<<<<< [8]       36 <<<<<< [4]       [2]       [1]       679       [5]       679       
- row6: 97--36-1-: [9]       [7]       24 <<<<<< 5 !!!!!!! [3]       [6]       48 <<<<<< [1]       248       
- row7: 49-----23: [4]       [9]       78 <<<<<< 58 <<<<<< 157       7 !!!!!!! 1567      [2]       [3]       
- row8: 16-----8-: [1]       [6]       37 <<<<<< 2359      457       23479     579       [8]       579       
- row9: -256---4-: 38 <<<<<< [2]       [5]       [6]       17 <<<<<< 379       179       [4]       79 <<<<<< 
- return: 1 * 1 = 1

- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 9391-526- -1-----7- 74--8--91 -5-798-3- -8-421-5- 97-536-1- 49---7-23 16-----8- -256---4-
- cols: 9-7--941- 314587962 9-------5 1--745--6 --8923--- 5--8167-- 2-------- 679351284 --1---3--
- sqrs: 939-1-74- 1-5----8- 26--7--91 -5--8-97- 798421536 -3--5--1- 49-16--25 --7---6-- -23-8--4-
- row1: 9391-526-: [9]       [3]       [9]       [1]       47 <<<<<< [5]       [2]       [6]       48 <<<<<< 
- row2: -1-----7-: 2568      [1]       268       239       46 <<<<<< 2349      3458      [7]       458       
- row3: 74--8--91: [7]       [4]       26 <<<<<< 23 <<<<<< [8]       23 <<<<<< 35 <<<<<< [9]       [1]       
- row4: -5-798-3-: 26 <<<<<< [5]       1246      [7]       [9]       [8]       46 <<<<<< [3]       246       
- row5: -8-421-5-: 36 <<<<<< [8]       36 <<<<<< [4]       [2]       [1]       679       [5]       679       
- row6: 97-536-1-: [9]       [7]       24 <<<<<< [5]       [3]       [6]       48 <<<<<< [1]       248       
- row7: 49---7-23: [4]       [9]       8 !!!!!!! 8 !!!!!!! 15 <<<<<< [7]       156       [2]       [3]       
- row8: 16-----8-: [1]       [6]       37 <<<<<< 239       45 <<<<<< 2349      579       [8]       579       
- row9: -256---4-: 38 <<<<<< [2]       [5]       [6]       1 !!!!!!! 39 <<<<<< 179       [4]       79 <<<<<< 
- return: 1 * 1 = 1

- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 9391-526- -1-----7- 74--8--91 -5-798-3- -8-421-5- 97-536-1- 4988-7-23 16-----8- -2561--4-
- cols: 9-7--941- 314587962 9-----8-5 1--7458-6 --8923--1 5--8167-- 2-------- 679351284 --1---3--
- sqrs: 939-1-74- 1-5----8- 26--7--91 -5--8-97- 798421536 -3--5--1- 49816--25 8-7---61- -23-8--4-
- row1: 9391-526-: [9]       [3]       [9]       [1]       47 <<<<<< [5]       [2]       [6]       48 <<<<<< 
- row2: -1-----7-: 2568      [1]       26 <<<<<< 239       46 <<<<<< 2349      3458      [7]       458       
- row3: 74--8--91: [7]       [4]       26 <<<<<< 23 <<<<<< [8]       23 <<<<<< 35 <<<<<< [9]       [1]       
- row4: -5-798-3-: 26 <<<<<< [5]       1246      [7]       [9]       [8]       46 <<<<<< [3]       246       
- row5: -8-421-5-: 36 <<<<<< [8]       36 <<<<<< [4]       [2]       [1]       679       [5]       679       
- row6: 97-536-1-: [9]       [7]       24 <<<<<< [5]       [3]       [6]       48 <<<<<< [1]       248       
- row7: 4988-7-23: [4]       [9]       [8]       [8]       5 !!!!!!! [7]       156       [2]       [3]       
- row8: 16-----8-: [1]       [6]       37 <<<<<< 239       45 <<<<<< 2349      579       [8]       579       
- row9: -2561--4-: 3 !!!!!!! [2]       [5]       [6]       [1]       39 <<<<<< 79 <<<<<< [4]       79 <<<<<< 
- return: 1 * 1 = 1

- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 9391-526- -1-----7- 74--8--91 -5-798-3- -8-421-5- 97-536-1- 498857-23 16-----8- 32561--4-
- cols: 9-7--9413 314587962 9-----8-5 1--7458-6 --89235-1 5--8167-- 2-------- 679351284 --1---3--
- sqrs: 939-1-74- 1-5----8- 26--7--91 -5--8-97- 798421536 -3--5--1- 49816-325 857---61- -23-8--4-
- row1: 9391-526-: [9]       [3]       [9]       [1]       47 <<<<<< [5]       [2]       [6]       48 <<<<<< 
- row2: -1-----7-: 2568      [1]       26 <<<<<< 239       46 <<<<<< 2349      3458      [7]       458       
- row3: 74--8--91: [7]       [4]       26 <<<<<< 23 <<<<<< [8]       23 <<<<<< 35 <<<<<< [9]       [1]       
- row4: -5-798-3-: 26 <<<<<< [5]       1246      [7]       [9]       [8]       46 <<<<<< [3]       246       
- row5: -8-421-5-: 6 !!!!!!! [8]       36 <<<<<< [4]       [2]       [1]       679       [5]       679       
- row6: 97-536-1-: [9]       [7]       24 <<<<<< [5]       [3]       [6]       48 <<<<<< [1]       248       
- row7: 498857-23: [4]       [9]       [8]       [8]       [5]       [7]       16 <<<<<< [2]       [3]       
- row8: 16-----8-: [1]       [6]       7 !!!!!!! 239       4 !!!!!!! 2349      579       [8]       579       
- row9: 32561--4-: [3]       [2]       [5]       [6]       [1]       9 !!!!!!! 79 <<<<<< [4]       79 <<<<<< 
- return: 1 * 1 = 1

- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 9391-526- -1-----7- 74--8--91 -5-798-3- 68-421-5- 97-536-1- 498857-23 167-4--8- 325619-4-
- cols: 9-7-69413 314587962 9-----875 1--7458-6 --8923541 5--8167-9 2-------- 679351284 --1---3--
- sqrs: 939-1-74- 1-5----8- 26--7--91 -5-68-97- 798421536 -3--5--1- 498167325 857-4-619 -23-8--4-
- row1: 9391-526-: [9]       [3]       [9]       [1]       7 !!!!!!! [5]       [2]       [6]       48 <<<<<< 
- row2: -1-----7-: 258       [1]       26 <<<<<< 239       6 !!!!!!! 234       3458      [7]       458       
- row3: 74--8--91: [7]       [4]       26 <<<<<< 23 <<<<<< [8]       23 <<<<<< 35 <<<<<< [9]       [1]       
- row4: -5-798-3-: 2 !!!!!!! [5]       124       [7]       [9]       [8]       46 <<<<<< [3]       246       
- row5: 68-421-5-: [6]       [8]       3 !!!!!!! [4]       [2]       [1]       79 <<<<<< [5]       79 <<<<<< 
- row6: 97-536-1-: [9]       [7]       24 <<<<<< [5]       [3]       [6]       48 <<<<<< [1]       248       
- row7: 498857-23: [4]       [9]       [8]       [8]       [5]       [7]       16 <<<<<< [2]       [3]       
- row8: 167-4--8-: [1]       [6]       [7]       23 <<<<<< [4]       23 <<<<<< 59 <<<<<< [8]       59 <<<<<< 
- row9: 325619-4-: [3]       [2]       [5]       [6]       [1]       [9]       7 !!!!!!! [4]       7 !!!!!!! 
- return: 1 * 1 = 1

- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 93917526- -1--6--7- 74--8--91 25-798-3- 683421-5- 97-536-1- 498857-23 167-4--8- 325619747
- cols: 9-7269413 314587962 9---3-875 1--7458-6 768923541 5--8167-9 2-------7 679351284 --1---3-7
- sqrs: 939-1-74- 175-6--8- 26--7--91 25-68397- 798421536 -3--5--1- 498167325 857-4-619 -23-8-747
- row1: 93917526-: [9]       [3]       [9]       [1]       [7]       [5]       [2]       [6]       48 <<<<<< 
- row2: -1--6--7-: 58 <<<<<< [1]       2 !!!!!!! 239       [6]       234       3458      [7]       458       
- row3: 74--8--91: [7]       [4]       26 <<<<<< 23 <<<<<< [8]       23 <<<<<< 35 <<<<<< [9]       [1]       
- row4: 25-798-3-: [2]       [5]       14 <<<<<< [7]       [9]       [8]       46 <<<<<< [3]       46 <<<<<< 
- row5: 683421-5-: [6]       [8]       [3]       [4]       [2]       [1]       9 !!!!!!! [5]       9 !!!!!!! 
- row6: 97-536-1-: [9]       [7]       4 !!!!!!! [5]       [3]       [6]       48 <<<<<< [1]       248       
- row7: 498857-23: [4]       [9]       [8]       [8]       [5]       [7]       16 <<<<<< [2]       [3]       
- row8: 167-4--8-: [1]       [6]       [7]       23 <<<<<< [4]       23 <<<<<< 59 <<<<<< [8]       59 <<<<<< 
- row9: 325619747: [3]       [2]       [5]       [6]       [1]       [9]       [7]       [4]       [7]       
- return: 1 * 1 = 1

- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 93917526- -12-6--7- 74--8--91 25-798-3- 683421959 974536-1- 498857-23 167-4--8- 325619747
- cols: 9-7269413 314587962 92--34875 1--7458-6 768923541 5--8167-9 2---9---7 679351284 --1-9-3-7
- sqrs: 939-1274- 175-6--8- 26--7--91 25-683974 798421536 -3-959-1- 498167325 857-4-619 -23-8-747
- row1: 93917526-: [9]       [3]       [9]       [1]       [7]       [5]       [2]       [6]       48 <<<<<< 
- row2: -12-6--7-: 58 <<<<<< [1]       [2]       39 <<<<<< [6]       34 <<<<<< 3458      [7]       458       
- row3: 74--8--91: [7]       [4]       6 !!!!!!! 23 <<<<<< [8]       23 <<<<<< 35 <<<<<< [9]       [1]       
- row4: 25-798-3-: [2]       [5]       1 !!!!!!! [7]       [9]       [8]       46 <<<<<< [3]       46 <<<<<< 
- row5: 683421959: [6]       [8]       [3]       [4]       [2]       [1]       [9]       [5]       [9]       
- row6: 974536-1-: [9]       [7]       [4]       [5]       [3]       [6]       8 !!!!!!! [1]       28 <<<<<< 
- row7: 498857-23: [4]       [9]       [8]       [8]       [5]       [7]       16 <<<<<< [2]       [3]       
- row8: 167-4--8-: [1]       [6]       [7]       23 <<<<<< [4]       23 <<<<<< 5 !!!!!!! [8]       5 !!!!!!! 
- row9: 325619747: [3]       [2]       [5]       [6]       [1]       [9]       [7]       [4]       [7]       
- return: 1 * 1 = 1

- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 93917526- -12-6--7- 746-8--91 251798-3- 683421959 97453681- 498857-23 167-4-585 325619747
- cols: 9-7269413 314587962 926134875 1--7458-6 768923541 5--8167-9 2---98-57 679351284 --1-9-357
- sqrs: 939-12746 175-6--8- 26--7--91 251683974 798421536 -3-95981- 498167325 857-4-619 -23585747
- row1: 93917526-: [9]       [3]       [9]       [1]       [7]       [5]       [2]       [6]       48 <<<<<< 
- row2: -12-6--7-: 58 <<<<<< [1]       [2]       39 <<<<<< [6]       34 <<<<<< 34 <<<<<< [7]       48 <<<<<< 
- row3: 746-8--91: [7]       [4]       [6]       23 <<<<<< [8]       23 <<<<<< 3 !!!!!!! [9]       [1]       
- row4: 251798-3-: [2]       [5]       [1]       [7]       [9]       [8]       46 <<<<<< [3]       46 <<<<<< 
- row5: 683421959: [6]       [8]       [3]       [4]       [2]       [1]       [9]       [5]       [9]       
- row6: 97453681-: [9]       [7]       [4]       [5]       [3]       [6]       [8]       [1]       2 !!!!!!! 
- row7: 498857-23: [4]       [9]       [8]       [8]       [5]       [7]       16 <<<<<< [2]       [3]       
- row8: 167-4-585: [1]       [6]       [7]       23 <<<<<< [4]       23 <<<<<< [5]       [8]       [5]       
- row9: 325619747: [3]       [2]       [5]       [6]       [1]       [9]       [7]       [4]       [7]       
- return: 1 * 1 = 1

- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 93917526- -12-6--7- 746-8-391 251798-3- 683421959 974536812 498857-23 167-4-585 325619747
- cols: 9-7269413 314587962 926134875 1--7458-6 768923541 5--8167-9 2-3-98-57 679351284 --1-92357
- sqrs: 939-12746 175-6--8- 26--7-391 251683974 798421536 -3-959812 498167325 857-4-619 -23585747
- row1: 93917526-: [9]       [3]       [9]       [1]       [7]       [5]       [2]       [6]       48 <<<<<< 
- row2: -12-6--7-: 58 <<<<<< [1]       [2]       39 <<<<<< [6]       34 <<<<<< 4 !!!!!!! [7]       48 <<<<<< 
- row3: 746-8-391: [7]       [4]       [6]       2 !!!!!!! [8]       2 !!!!!!! [3]       [9]       [1]       
- row4: 251798-3-: [2]       [5]       [1]       [7]       [9]       [8]       46 <<<<<< [3]       46 <<<<<< 
- row5: 683421959: [6]       [8]       [3]       [4]       [2]       [1]       [9]       [5]       [9]       
- row6: 974536812: [9]       [7]       [4]       [5]       [3]       [6]       [8]       [1]       [2]       
- row7: 498857-23: [4]       [9]       [8]       [8]       [5]       [7]       16 <<<<<< [2]       [3]       
- row8: 167-4-585: [1]       [6]       [7]       23 <<<<<< [4]       23 <<<<<< [5]       [8]       [5]       
- row9: 325619747: [3]       [2]       [5]       [6]       [1]       [9]       [7]       [4]       [7]       
- return: 1 * 1 = 1

- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 93917526- -12-6-47- 746282391 251798-3- 683421959 974536812 498857-23 167-4-585 325619747
- cols: 9-7269413 314587962 926134875 1-27458-6 768923541 5-28167-9 243-98-57 679351284 --1-92357
- sqrs: 939-12746 175-6-282 26-47-391 251683974 798421536 -3-959812 498167325 857-4-619 -23585747
- row1: 93917526-: [9]       [3]       [9]       [1]       [7]       [5]       [2]       [6]       8 !!!!!!! 
- row2: -12-6-47-: 58 <<<<<< [1]       [2]       39 <<<<<< [6]       3 !!!!!!! [4]       [7]       8 !!!!!!! 
- row3: 746282391: [7]       [4]       [6]       [2]       [8]       [2]       [3]       [9]       [1]       
- row4: 251798-3-: [2]       [5]       [1]       [7]       [9]       [8]       6 !!!!!!! [3]       46 <<<<<< 
- row5: 683421959: [6]       [8]       [3]       [4]       [2]       [1]       [9]       [5]       [9]       
- row6: 974536812: [9]       [7]       [4]       [5]       [3]       [6]       [8]       [1]       [2]       
- row7: 498857-23: [4]       [9]       [8]       [8]       [5]       [7]       16 <<<<<< [2]       [3]       
- row8: 167-4-585: [1]       [6]       [7]       3 !!!!!!! [4]       3 !!!!!!! [5]       [8]       [5]       
- row9: 325619747: [3]       [2]       [5]       [6]       [1]       [9]       [7]       [4]       [7]       
- return: 1 * 1 = 1

- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 939175268 -12-63478 746282391 25179863- 683421959 974536812 498857-23 167343585 325619747
- cols: 9-7269413 314587962 926134875 1-2745836 768923541 532816739 243698-57 679351284 881-92357
- sqrs: 939-12746 175-63282 268478391 251683974 798421536 63-959812 498167325 857343619 -23585747
- row1: 939175268: [9]       [3]       [9]       [1]       [7]       [5]       [2]       [6]       [8]       
- row2: -12-63478: 5 !!!!!!! [1]       [2]       9 !!!!!!! [6]       [3]       [4]       [7]       [8]       
- row3: 746282391: [7]       [4]       [6]       [2]       [8]       [2]       [3]       [9]       [1]       
- row4: 25179863-: [2]       [5]       [1]       [7]       [9]       [8]       [6]       [3]       4 !!!!!!! 
- row5: 683421959: [6]       [8]       [3]       [4]       [2]       [1]       [9]       [5]       [9]       
- row6: 974536812: [9]       [7]       [4]       [5]       [3]       [6]       [8]       [1]       [2]       
- row7: 498857-23: [4]       [9]       [8]       [8]       [5]       [7]       1 !!!!!!! [2]       [3]       
- row8: 167343585: [1]       [6]       [7]       [3]       [4]       [3]       [5]       [8]       [5]       
- row9: 325619747: [3]       [2]       [5]       [6]       [1]       [9]       [7]       [4]       [7]       
- return: 1 * 1 = 1

- variant: root c1r1=9 c3r1=9 c5r3=8 c8r4=3 c4r5=4 c6r5=1 c1r6=9 c1r8=1 c8r9=4
- rows: 939175268 512963478 746282391 251798634 683421959 974536812 498857123 167343585 325619747
- cols: 957269413 314587962 926134875 192745836 768923541 532816739 243698157 679351284 881492357
- sqrs: 939512746 175963282 268478391 251683974 798421536 634959812 498167325 857343619 123585747
- row1: 939175268: [9]       [3]       [9]       [1]       [7]       [5]       [2]       [6]       [8]       
- row2: 512963478: [5]       [1]       [2]       [9]       [6]       [3]       [4]       [7]       [8]       
- row3: 746282391: [7]       [4]       [6]       [2]       [8]       [2]       [3]       [9]       [1]       
- row4: 251798634: [2]       [5]       [1]       [7]       [9]       [8]       [6]       [3]       [4]       
- row5: 683421959: [6]       [8]       [3]       [4]       [2]       [1]       [9]       [5]       [9]       
- row6: 974536812: [9]       [7]       [4]       [5]       [3]       [6]       [8]       [1]       [2]       
- row7: 498857123: [4]       [9]       [8]       [8]       [5]       [7]       [1]       [2]       [3]       
- row8: 167343585: [1]       [6]       [7]       [3]       [4]       [3]       [5]       [8]       [5]       
- row9: 325619747: [3]       [2]       [5]       [6]       [1]       [9]       [7]       [4]       [7]       
- return: 0 * 1 = 0

- winner: after 88 iterations!