kosyak,
в качестве псевдокода возможного решения твоей проблемы (все-таки, раздел - теоретический):
procedure main is
type Vector is array(Natural range <>) of String(1 .. 4);
function Divide_To_Intervals(V: in Vector) return String is
type R is record
Val: Integer;
st: String(1 .. 20);
end record;
type RVType is array(Natural range <>) of R;
function Convert(s: in String) return R is
i: Integer;
mySt: String(1 .. 20) := (others => ' ');
begin
i := 1;
while (s(i) >= '0') and then (s(i) <= '9') loop
i := i + 1;
end loop;
mySt(mySt'First .. s'Last - (i - 1)) := s(i .. s'Last);
return R'(Val => Integer'Value(s(s'First .. i - 1)), st => mySt);
end Convert;
function Image(Rec: in R) return String is
begin
return Integer'Image(Rec.Val) & Trim(Source => Rec.st, Side => Both);
end Image;
function "<" (Lt, Rg: R) return Boolean is
begin
return ((Lt.Val < Rg.Val) or ((Lt.Val = Rg.Val) and (Lt.st < Rg.st)));
end "<";
procedure Sort is
new Ada.Containers.Generic_Array_Sort(
Index_Type => Natural, Element_Type => R, Array_Type => RVType
);
RV: RVType(V'First .. V'Last);
Sens: Float;
start: Integer;
res: Unbounded_String;
begin
for i in V'Range loop
RV(i) := Convert(V(i));
end loop;
Sort(RV);
Sens := Float(RV(V'Last).Val - RV(V'First).Val) / 10.0;
Start := V'First;
for i in V'First + 1 .. V'Last + 1 loop
if (i = V'Last + 1) or else (Float(RV(i).Val - RV(i - 1).Val) > Sens) then
res := res & Image(RV(start)) & "-" & Image(RV(i - 1)) & ";";
start := i;
end if;
end loop;
return To_String(res);
end Divide_To_Intervals;
Vec: constant Vector := ("100 ", "100a", "100b", "200a", "200b", "200v", "101 ", "101a", "101b");
begin
Put_Line(Divide_To_Intervals(Vec));
end;
(сама идея понятна, или требуются объяснения? Как ты уже догадался, это выдержки из абсолютно рабочего кода. Тестировался он на всех массивах, которые ты привел, и еще на десятке других. Сбоев не дал нигде)