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;