Конкатенация 2 массива миницинк - PullRequest
0 голосов
/ 04 мая 2020

Ниже у меня есть 2 2D массива (строки A-2 x 3 столбца, строки B-2 x 1 столбец)

A=[|1,2,3     B=[|1
   |4,5,6|]      |1|]

Мне нужно объединить эти 2 массива и создать новый массив C, как показано ниже ( 2 строки и 4 столбца)

C=[|1,2,3,1
   |4,5,6,1|]

PS: я знаю о добавлении новой строки. Но добавление столбца кажется другим. Не могли бы вы помочь мне сгенерировать массив c, используя объединение массивов a и b.

1 Ответ

2 голосов
/ 04 мая 2020

Конкатенация столбцов, безусловно, создает больше проблем, чем использование строк. MiniZin c в настоящее время не содержит каких-либо приятных функций транспонирования или архивирования, которые обычно позволяли бы писать эту функцию с относительной легкостью. Вместо этого мы должны написать рекурсивную функцию, которая объединяет по одной строке за раз, а затем добавляет оставшиеся строки:

array[int, int] of int: A=[|1,2,3|4,5,6|];
array[int, int] of int: B=[|1|1|];

function array[int] of int: concat_row_elements(array[int, int] of int: X, array[int, int] of int: Y, int: start) =
  if start in index_set_1of2(X) then
      row(X, start) ++ row(Y, start) ++ concat_row_elements(X, Y, start+1)
  else
      []
  endif;

function array[int, int] of int: concat_rows(array[int, int] of int: X, array[int, int] of int: Y) =
  let {
    constraint assert(index_set_1of2(X) == index_set_1of2(Y), "Concatenation of rows can only occur if they have the same number of rows");
  } in array2d(
    index_set_1of2(X),
    1..card(index_set_2of2(X)) +  card(index_set_2of2(Y)), 
    concat_row_elements(X, Y, min(index_set_1of2(X)))
  );

array[int, int] of int: C ::add_to_output = concat_rows(A, B);

Эта функция выдаст ожидаемый результат: C = array2d(1..2, 1..4, [1, 2, 3, 1, 4, 5, 6, 1]);

...