12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
- with Ada.Containers.Vectors;
- with Ada.Containers; use Ada.Containers;
- with Ada.Text_IO; use Ada.Text_IO;
- -- This code reads its input from standard input
- -- Use cat _input.txt | Red_Nosed_Reports_ to get the result
- procedure Red_Nosed_Reports is
- subtype Level is Positive;
- function Reversed_Sort (Left, Right : Level) return Boolean;
- package Report is
- new Ada.Containers.Vectors (Index_type => Positive,
- Element_Type => Level);
- use Report;
- package Report_Sorting is new Report.Generic_Sorting;
- package Reverse_Report_Sorting is
- new Report.Generic_Sorting ("<" => Reversed_Sort);
- function Reversed_Sort (Left, Right : Level) return Boolean is
- begin
- return Right < Left;
- end Reversed_Sort;
- subtype Valid_Range is Positive range 1 .. 3;
- Safe_Reports_Number : Natural := 0;
- begin
- while not End_Of_File loop
- declare
- Value : Level;
- Current_Report : Report.Vector;
- begin
- while not End_Of_Line loop
- Get (Value);
- Current_Report.Append (Value);
- Put (Value'Image);
- Put (" ");
- end loop;
- -- Check if safe
- if Report_Sorting.Is_Sorted (Current_Report)
- or else Reverse_Report_Sorting.Is_Sorted (Current_Report)
- then
- declare
- Safe : Boolean := True;
- Current_Cursor : Report.Cursor := Current_Report.First;
- Previous : Level := Current_Report.First_Element;
- begin
- while Current_Cursor /= Current_Report.Last and then Safe loop
- Next (Current_Cursor);
- if abs (Element (Current_Cursor) - Previous)
- not in Valid_Range'Range
- then
- Safe := False;
- end if;
- Previous := Element (Current_Cursor);
- end loop;
- if Safe then
- Safe_Reports_Number := Safe_Reports_Number + 1;
- Put ("Safe");
- else
- Put ("Unsafe");
- end if;
- end;
- else
- Put ("Unsafe");
- end if;
- -- Skip to next Line
- Skip_Line;
- end;
- New_Line;
- end loop;
- Put_Line ("Number of Safe is " & Safe_Reports_Number'Image);
- end Red_Nosed_Reports;
|