-+  Associazione
-+  Documenti
-+  Eventi
-+  Community
-+  Blog
-+  Link

Ottobre 2013

Dom Lun Mar Mer Gio Ven Sab
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Cerca






 

« What is Web 2.0 | Home | Dreamworks Animations »

Risolutore di Sudoku
16.10.05

Ieri leggendo una rivista informatica sono rimasto attratto da un piccolo articolo sul gioco del momento, il Sudoku. Nell'articolo oltre alla spiegazione del gioco, veniva anche proposto uno schema da giocare. Preso dalla curiosità, soprattutto per il fatto che fino a quel momento ne avevo sentito tanto parlare ma non avevo proprio capito di cosa si trattasse, mi sono messo a giocare.

E' giocando che ho stilato qualche processo mentale per la soluzione del gioco, da lì scrivere del codice che emulasse la mie scelte nel gioco è stato molto stimoltante.

Nello script ho inserito la griglia di gioco proposta dalla rivista che potrete modificare a piacimento.

Non ho potuto testare il gioco con altre griglie, se qualcuno ha schemi di gioco che l'applicativo non risolve si faccia avanti così ottimizziamo!

#! /usr/bin/perl
use strict;
my $loop++;
my @grid = (	[0,1,6,0,4,3,0,0,0],
		[0,0,0,0,6,1,0,0,7],
		[0,0,0,7,5,0,0,0,8],
		[8,2,0,0,0,0,4,0,0],
		[1,9,7,0,0,0,5,3,6],
		[0,0,3,0,0,0,0,8,9],
		[9,0,0,0,7,5,0,0,0],
		[2,0,0,9,8,0,0,0,0],
		[0,0,0,1,3,0,7,9,0],
	   );

while ($loop)
 {
  undef $loop;
  for my $x (0..8)
   {
    for my $y (0..8)
     {
      $grid[$x][$y] ||= '123456789';

      for my $xx ( getinterval($x) )
       {
        for my $yy ( getinterval($y) )
         {
          $grid[$x][$y] =~ s/$grid[$xx][$yy]//  && $loop++
            if $xx ne $x && $yy ne $y && $grid[$xx][$yy]<10; 
         }
       } 

      for (0..8)
       {
        $grid[$x][$y] =~ s/$grid[$x][$_]// && $loop++
          if $_ ne $y && $grid[$x][$_]<10; 
        $grid[$x][$y] =~ s/$grid[$_][$y]// && $loop++
          if $_ ne $x && $grid[$_][$y]<10; 
       }
     }
   }
 }

for (0..8)
 {
  print join " \t ", @{$grid[$_]};
  print "\n\n";
 } 

sub getinterval
 {
  my $n = shift;
  return $n<3 ? (0,1,2) : ($n>2 and $n<6) ? (3,4,5) : (6,7,8);
 }

Inviato da LucaS il 16.10.05 18:58
Ti è piaciuto questo articolo? Iscriviti al feed!

D:
Sull'autore...
D:
La ML di Perl.it
Iscriviti! mongers@lists.perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
D:
Annunci Google