Guest User

Untitled

a guest
Feb 18th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 5.09 KB | None | 0 0
  1. with Ada.Text_IO; use Ada.Text_IO;
  2. with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
  3. with Ada.Command_Line; use Ada.Command_line;
  4.  
  5. -- Note: Requirements:
  6. -- Needs to read board file from command line, quitting if it doesn't exist
  7.     -- And must display a proper error message for this.
  8. -- Needs to ignore all lines and rows other than the first 9
  9. -- Must attempt to find a solution, and throw a message if no solution exists
  10.  
  11. procedure Assignment1 is
  12.    
  13.     -- Stores a 3x3 corner of a Sudoku Board
  14.     subtype Wedge_Range is integer range 1..3;
  15.     type Sudoku_Wedge is array (Wedge_Range, Wedge_Range) of character;
  16.     -- Stores a full Sudoku Board
  17.     subtype Sudoku_Range is integer range 1..9;
  18.     type Sudoku_Board is array (Sudoku_Range, Sudoku_Range) of character;
  19.    
  20.     Original_Board : Sudoku_Board;
  21.     Test_Board : Sudoku_Board;
  22.  
  23.     Arguments_Are_Sane : Boolean;
  24.     File_Is_Sane : Boolean;
  25.  
  26.     -- Prints out the Sudoku Board
  27.     procedure Print_Board(Board : in Sudoku_Board) is
  28.     begin
  29.         for Y in 1..9 loop
  30.             for X in 1..9 loop
  31.                 Put(Board(X, Y));
  32.             end loop;
  33.             new_line;
  34.         end loop;
  35.     end Print_Board;
  36.    
  37.     -- Linear search to check if the buffer contains the
  38.     -- Given character
  39.     function Contains_Char(Sting : in String;
  40.         Char : in Character) return boolean is
  41.     begin
  42.         for A in 1..Sting'Length loop
  43.             if Sting(A) = Char then
  44.                 return true;
  45.             end if;
  46.         end loop;
  47.         return false;
  48.     end Contains_Char;
  49.  
  50.     -- Checks a single 3x3 wedge to see if it is legal.s
  51.     function Check_Wedge(Test : in Sudoku_Wedge) return boolean is
  52.         buffer : String(1..9);
  53.         counter : Integer;
  54.     begin
  55.         buffer := "000000000";
  56.         Counter := 1;
  57.         for Y in 1..3 loop
  58.             for X in 1..3 loop
  59.                 if Contains_Char(buffer, Test(X,Y)) then
  60.                     return false;
  61.                 else
  62.                     buffer(counter) := Test(X,Y);
  63.                     counter := counter + 1;
  64.                 end if;
  65.             end loop;
  66.         end loop;
  67.         return true;
  68.     end Check_Wedge;
  69.  
  70.     -- Tests the board if it is legal.
  71.     function Check_Board(Test : in Sudoku_Board) return boolean is
  72.         buffer : String(1..9);
  73.         Wedge_Counter_X : Integer;
  74.         Wedge_Counter_Y : Integer;
  75.     begin
  76.         buffer := "000000000";
  77.         -- Check if duplicate # in row
  78.         for X in 1..9 loop -- For each Row
  79.             for Y in 1..9 loop -- For each column
  80.                 if Test(X,Y) /= '.' then
  81.                     if Contains_Char(buffer, Test(X,Y)) then
  82.                         return false;
  83.                     else
  84.                         buffer(Y) := Test(X,Y);
  85.                     end if;
  86.                 else
  87.                     return false;
  88.                 end if;
  89.             end loop;
  90.             buffer := "000000000";
  91.         end loop;      
  92.         -- Check if duplicate # in column
  93.         for Y in 1..9 loop
  94.             for X in 1..9 loop
  95.                 if Test(X,Y) /= '.' then
  96.                     if Contains_Char(buffer, Test(X,Y)) then
  97.                         return false;
  98.                     else
  99.                         buffer(X) := Test(X,Y);
  100.                     end if;
  101.                 else
  102.                     return false;
  103.                 end if;
  104.             end loop;
  105.             buffer := "000000000";
  106.         end loop;      
  107.         -- Check if duplicate # in 3x3 wedge
  108.         Wedge_Counter_X := 1;
  109.         Wedge_Counter_Y := 1;
  110.         for X in 1..3 loop
  111.             for Y in 1..3 loop
  112.                 if (Check_Wedge(Test(
  113.                     Wedge_Counter_X..(X * 3),
  114.                     Wedge_Conuter_Y..(Y * 3)
  115.                 )) = false) then
  116.                     return false;
  117.                 else
  118.                     Wedge_Counter_Y := Wedge_Counter_Y + 3;
  119.                 end if;
  120.             end loop;
  121.             Wedge_Counter_Y := 1;
  122.             Wedge_Counter_X := Wedge_Counter_X + 3;
  123.         end loop;
  124.         -- No other problems, return true
  125.         return true;
  126.     end Check_Board;
  127.  
  128.     -- Self explanatory, handles command line arguments
  129.     function Handle_Arguments return boolean is
  130.     begin
  131.         if Argument_Count = 0 then
  132.             return false;
  133.         else
  134.             return true;
  135.         end if;
  136.  
  137.     end Handle_Arguments;
  138.    
  139.     -- Reads initial text file and uses it to fill Original_Board
  140.     function Read_Board_File(Name : in String) return boolean is
  141.         Board_File : File_Type;
  142.     begin
  143.         -- Open input file and check for sanity
  144.         begin
  145.             Open(Board_File, Mode => In_File, Name => Name);
  146.         exception
  147.             when Name_Error | Use_Error =>
  148.                 put("File either does not exist or cannot be read");
  149.                 new_line;
  150.                 return false; -- false for file can't be opened
  151.         end;
  152.         -- Write to Sudoku Board
  153.         for y in 1..9 loop
  154.             for x in 1..9 loop
  155.                 get(Board_File, Original_Board(X, Y));
  156.             end loop;
  157.             if not End_Of_Line(Board_File) then
  158.                 Skip_Line(Board_File);
  159.             end if;
  160.         end loop;
  161.         Close(Board_File);
  162.         return true;
  163.     end Read_Board_File;
  164.  
  165.     -- Main Recursive backtrack function for solving sudoku.
  166.     procedure Recursive_Solver is
  167.         -- Note: This may be changed from a procedure to a function
  168.         -- And it needs to have some sort of input argument
  169.         -- This is just a prototype.
  170.     begin
  171.         null;
  172.     end Recursive_Solver;
  173.  
  174. begin
  175.     -- First check to see if the program can be run
  176.     Arguments_Are_Sane := Handle_Arguments;
  177.     -- Logically, if there is no command line argument
  178.     -- Then we cannot read any file.
  179.     if Arguments_Are_Sane then
  180.         File_Is_Sane := Read_Board_File(Argument(1));
  181.     else
  182.         File_Is_Sane := false;
  183.     end if;
  184.  
  185.     if File_Is_Sane then
  186.         Print_Board(Original_Board); -- Do work here
  187.         if Check_Board(Original_Board) then
  188.             Put("Board works"); new_line;
  189.         else
  190.             Put("Board does not work"); new_line;
  191.         end if;
  192.     else
  193.         Put("Error");-- Make program exit with error here
  194.         new_line;
  195.     end if;
  196. end Assignment1;
Add Comment
Please, Sign In to add comment