sudoku Puzzling in Perl #16

Solve loop:

ROUND:
while ( 1 )
{
   SQUARE: 
   for my $curblock ( @{ $sobj->{"square"} } )
   {
      if ( $sobj->{patience}-- < 1 )
      {
         last ROUND;
      }

      next SQUARE if $curblock->{known};

      ## Naked singles:
      ## --------------------------------------------------
      my %guesses = map { $_ => $_ } 
                    ( @{ $curblock->{guess} } );

      $_->{known} && delete $guesses{ $_->{value} }
         for ( 
               @{ $sobj->{col}->[ $curblock->{col} ] },
               @{ $sobj->{row}->[ $curblock->{row} ] },
               @{ $sobj->{block}->[ $curblock->{block}] },
             );

      # a block has no possible values, no solutions
      return ( SUDOKU_UNSOLVABLE, $round, undef ) 
         unless scalar keys %guesses;

      if ( scalar( keys %guesses ) == 1 )
      {
         last ROUND 
            unless mark_known( $sobj, $curblock, ( keys %guesses )[0] );
         next SQUARE;

      } else {
         $curblock->{guess} = [ sort keys %guesses ];
      }
   }
}
© fishbot