Range consolidation: Difference between revisions
Content added Content deleted
(+Racket) |
(Ada version) |
||
Line 51: | Line 51: | ||
* [[Set of real numbers]] |
* [[Set of real numbers]] |
||
<br><br> |
<br><br> |
||
=={{header|Ada}}== |
|||
<lang Ada>with Ada.Text_IO; |
|||
with Ada.Containers.Vectors; |
|||
procedure Range_Consolidation is |
|||
type Set_Type is record |
|||
Left, Right : Float; |
|||
end record; |
|||
package Set_Vectors is |
|||
new Ada.Containers.Vectors (Positive, Set_Type); |
|||
procedure Normalize (Set : in out Set_Vectors.Vector) is |
|||
function Less_Than (Left, Right : Set_Type) return Boolean is |
|||
begin Return Left.Left < Right.Left; end; |
|||
package Set_Sorting is |
|||
new Set_Vectors.Generic_Sorting (Less_Than); |
|||
begin |
|||
for Elem of Set loop |
|||
Elem := (Left => Float'Min (Elem.Left, Elem.Right), |
|||
Right => Float'Max (Elem.Left, Elem.Right)); |
|||
end loop; |
|||
Set_Sorting.Sort (Set); |
|||
end Normalize; |
|||
procedure Consolidate (Set : in out Set_Vectors.Vector) is |
|||
use Set_Vectors; |
|||
First : Cursor := Set.First; |
|||
Last : Cursor := Next (First); |
|||
begin |
|||
while Last /= No_Element loop |
|||
if Element (First).Right < Element (Last).Left then -- non-overlap |
|||
First := Last; |
|||
Last := Next (Last); |
|||
elsif Element (First).Right >= Element (Last).Left then -- overlap |
|||
Replace_Element (Set, First, (Left => Element (First).Left, |
|||
Right => Float'Max (Element (First).Right, |
|||
Element (Last) .Right))); |
|||
Delete (Set, Last); |
|||
Last := Next (First); |
|||
end if; |
|||
end loop; |
|||
end Consolidate; |
|||
procedure Put (Set : in Set_Vectors.Vector) is |
|||
package Float_IO is |
|||
new Ada.Text_IO.Float_IO (Float); |
|||
begin |
|||
Float_IO.Default_Exp := 0; |
|||
Float_IO.Default_Aft := 1; |
|||
Float_IO.Default_Fore := 3; |
|||
for Elem of Set loop |
|||
Ada.Text_IO.Put ("("); |
|||
Float_IO.Put (Elem.Left); |
|||
Float_IO.Put (Elem.Right); |
|||
Ada.Text_IO.Put (") "); |
|||
end loop; |
|||
end Put; |
|||
procedure Show (Set : in out Set_Vectors.Vector) is |
|||
use Ada.Text_IO; |
|||
begin |
|||
Put (Set); |
|||
Normalize (Set); |
|||
Consolidate (Set); |
|||
Set_Col (70); |
|||
Put (Set); |
|||
New_Line; |
|||
end Show; |
|||
use Set_Vectors; |
|||
Set_0 : Set_Vectors.Vector := Empty_Vector; |
|||
Set_1 : Set_Vectors.Vector := Empty_Vector & (1.1, 2.2); |
|||
Set_2 : Set_Vectors.Vector := (6.1, 7.2) & (7.2, 8.3); |
|||
Set_3 : Set_Vectors.Vector := (4.0, 3.0) & (2.0, 1.0); |
|||
Set_4 : Set_Vectors.Vector := (4.0, 3.0) & (2.0, 1.0) & (-1.0, -2.0) & (3.9, 10.0); |
|||
Set_5 : Set_Vectors.Vector := (1.0, 3.0) & (-6.0, -1.0) & (-4.0, -5.0) & (8.0, 2.0) & (-6.0, -6.0); |
|||
begin |
|||
Show (Set_0); |
|||
Show (Set_1); |
|||
Show (Set_2); |
|||
Show (Set_3); |
|||
Show (Set_4); |
|||
Show (Set_5); |
|||
end Range_Consolidation;</lang> |
|||
{{out}} |
|||
<pre> |
|||
( 1.1 2.2) ( 1.1 2.2) |
|||
( 6.1 7.2) ( 7.2 8.3) ( 6.1 8.3) |
|||
( 4.0 3.0) ( 2.0 1.0) ( 1.0 2.0) ( 3.0 4.0) |
|||
( 4.0 3.0) ( 2.0 1.0) ( -1.0 -2.0) ( 3.9 10.0) ( -2.0 -1.0) ( 1.0 2.0) ( 3.0 10.0) |
|||
( 1.0 3.0) ( -6.0 -1.0) ( -4.0 -5.0) ( 8.0 2.0) ( -6.0 -6.0) ( -6.0 -1.0) ( 1.0 8.0) |
|||
</pre> |
|||
=={{header|C sharp}}== |
=={{header|C sharp}}== |
||
{{works with|C sharp|7}} |
{{works with|C sharp|7}} |