Такс. Набросал пример решения (не претендуя на алгоритмическую гениальность и кошерность циклов) с применением прототипа макета черновика стандартной либы :-)
(поскольку это прототип, погонять в онлайн-компиляторе пока не выйдет)
Да, для полноты картины я реализовал обе фунции - и ту которая создает входные данные и ту которая уже слепливает "массивы" в один с разделителями.
MODULE VladQuest;
IMPORT VectorInt, ArrayInt;
PROCEDURE Merge(input: ARRAY OF VectorInt.T; separator: INTEGER) : VectorInt.T;
VAR
res : VectorInt.T;
i,j : INTEGER;
BEGIN
res := VectorInt.Create;
FOR i:=0 TO LEN(input) DO
FOR j:=0 TO VectorInt.Len(input[i]) DO
VectorInt.PushBack(res,VectorInt.Get(input[i],j))
END;
VectorInt.PushBack(res, separator)
END
VectorInt.PopBack(res);
RETURN res
END Merge;
PROCEDURE Test;
VAR
input : ARRAY 2 OF ArrayInt.T;
BEGIN
ArrayInt.Fill2(input,
VectorInt.Make3(1,2,3),
VectorInt.Make2(4,5));
Merge(input, 10);
END Test;
END VladQuest.
Возможен вопрос - а что если мне не нравятся такие длиные имена у функций (VectorInt.PusgBack), что если хочется короче и лаконичней? Не проблема, можно сделать псевдонимы (хотя возможность именно такого рода псевдонимов, удобный таких, прямо сейчас горячо обсуждается в конфе :-) ):
MODULE VladQuest;
IMPORT VectorInt, ArrayInt;
CONST
Create = VectorInt.Create;
Len = VectorInt.Len;
PushBack = VectorInt.PushBack;
PopBack = VectorInt.PopBack;
Get = VectorInt.Get;
Make3 = VectorInt.Make3;
Make2 = VectorInt.Make2;
Fill2 = ArrayInt.Fill2;
PROCEDURE Merge(input: ARRAY OF VectorInt.T; separator: INTEGER) : VectorInt.T;
VAR
res : VectorInt.T;
i,j : INTEGER;
BEGIN
res := Create;
FOR i:=0 TO LEN(input) DO
FOR j:=0 TO Len(input[i]) DO
PushBack(res,Get(input[i],j))
END;
PushBack(res, separator)
END
PopBack(res);
RETURN res
END Merge;
PROCEDURE Test;
VAR
input : ARRAY 2 OF ArrayInt.T;
BEGIN
ArrayInt.Fill2(input,
Make3(1,2,3),
Make2(4,5));
Merge(input, 10);
END Test;
END VladQuest.