Advertisement
Guest User

Sudoku

a guest
Jan 14th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 2.88 KB | None | 0 0
  1. with Ada.Text_IO;
  2.  
  3. procedure Sudoku is
  4.    type sudoku_ar_t is array ( integer range 0..80 ) of integer range 0..9;
  5.    FINISH_EXCEPTION : exception;
  6.  
  7.    procedure prettyprint(sudoku_ar: sudoku_ar_t);
  8.    function checkValidity( val : integer; x : integer; y : integer;  sudoku_ar: in  sudoku_ar_t) return Boolean;
  9.    procedure placeNumber(pos: Integer; sudoku_ar: in out sudoku_ar_t);
  10.    procedure solve(sudoku_ar: in out sudoku_ar_t);
  11.  
  12.  
  13.    function checkValidity( val : integer; x : integer; y : integer;  sudoku_ar: in  sudoku_ar_t) return Boolean
  14.    is
  15.    begin
  16.       for i in 0..8 loop
  17.  
  18.          if ( sudoku_ar( y * 9 + i ) = val or sudoku_ar( i * 9 + x ) = val ) then
  19.             return False;
  20.          end if;
  21.       end loop;
  22.  
  23.       declare
  24.          startX : constant integer := ( x / 3 ) * 3;
  25.          startY : constant integer := ( y / 3 ) * 3;
  26.       begin
  27.          for i in startY..startY+2 loop
  28.             for j in startX..startX+2 loop
  29.                if ( sudoku_ar( i * 9 +j ) = val ) then
  30.                   return False;
  31.                end if;
  32.             end loop;
  33.          end loop;
  34.          return True;
  35.       end;
  36.    end checkValidity;
  37.  
  38.  
  39.  
  40.    procedure placeNumber(pos: Integer; sudoku_ar: in out sudoku_ar_t)
  41.    is
  42.    begin
  43.       if ( pos = 81 ) then
  44.          raise FINISH_EXCEPTION;
  45.       end if;
  46.       if (  sudoku_ar(pos) > 0 ) then
  47.          placeNumber(pos+1, sudoku_ar);
  48.          return;
  49.       end if;
  50.       for n in 1..9 loop
  51.          if( checkValidity( n,  pos mod 9, pos / 9 , sudoku_ar ) ) then
  52.             sudoku_ar(pos) := n;
  53.             placeNumber(pos + 1, sudoku_ar );
  54.             sudoku_ar(pos) := 0;
  55.          end if;
  56.       end loop;
  57.    end placeNumber;
  58.  
  59.  
  60.    procedure solve(sudoku_ar: in out sudoku_ar_t)
  61.    is
  62.    begin
  63.       placeNumber( 0, sudoku_ar );
  64.       Ada.Text_IO.Put_Line("Unresolvable !");
  65.    exception
  66.       when FINISH_EXCEPTION =>
  67.          Ada.Text_IO.Put_Line("Finished !");
  68.          prettyprint(sudoku_ar);
  69.    end solve;
  70.  
  71.  
  72.  
  73.  
  74.    procedure prettyprint(sudoku_ar: sudoku_ar_t)
  75.    is
  76.       line_sep   : constant String  := "------+------+------";
  77.    begin
  78.       for i in sudoku_ar'Range loop
  79.          Ada.Text_IO.Put(sudoku_ar(i)'Image);
  80.          if (i+1) mod 3 = 0 and not((i+1) mod 9 = 0) then
  81.             Ada.Text_IO.Put("|");
  82.          end if;
  83.          if (i+1) mod 9 = 0 then
  84.             Ada.Text_IO.Put_Line("");
  85.          end if;
  86.          if (i+1) mod 27 = 0 then
  87.             Ada.Text_IO.Put_Line(line_sep);
  88.          end if;
  89.       end loop;
  90.    end prettyprint;
  91.  
  92.  
  93.    sudoku_ar : sudoku_ar_t :=
  94.      (
  95.       8,5,0,0,0,2,4,0,0,
  96.       7,2,0,0,0,0,0,0,9,
  97.       0,0,4,0,0,0,0,0,0,
  98.       0,0,0,1,0,7,0,0,2,
  99.       3,0,5,0,0,0,9,0,0,
  100.       0,4,0,0,0,0,0,0,0,
  101.       0,0,0,0,8,0,0,7,0,
  102.       0,1,7,0,0,0,0,0,0,
  103.       0,0,0,0,3,6,0,4,0
  104.      );
  105.  
  106. begin
  107.    solve( sudoku_ar );
  108. end Sudoku;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement