Цей виклик пов'язаний з деякими особливостями мови MATL в рамках події " Мова мови місяця 2018" .
Вступ
У MATL, багато дві вхідні функції працюють поелементно з мовленням . Це означає наступне:
Елементно (або векторизовано ): функція приймає за вхід два масиви з відповідними розмірами. Операція, визначена функцією, застосовується до кожної пари відповідних записів. Наприклад, використовуючи позначення після виправлення:
[2 4 6] [10 20 30] +
дає вихід
[12 24 36]
Це також працює з багатовимірними масивами. Позначення
[1 2 3; 4 5 6]
представляє масив2
×3
(матриця)1 2 3 4 5 6
який має розмір
2
уздовж першого розміру (вертикальний) та3
вздовж другого (горизонтальний). Так, наприклад[2 4 6; 3 5 7] [10 20 30; 40 60 80] *
[20 80 180; 120 300 560]
Трансляція або ( одиночне розширення ): два вхідні масиви не мають відповідних розмірів, але у кожному невідповідному вимірі один з масивів має розмір
1
. Цей масив неявно реплікується уздовж інших розмірів, щоб розміри відповідали; а потім операція застосовується як елемент вище. Наприклад, розглянемо два вхідні масиви розмірами1
×2
і3
×1
:[10 20] [1; 2; 5] /
Завдяки мовленню це рівнозначно
[10 20; 10 20; 10 20] [1 1; 2 2; 5 5] /
і так це дає
[10 20; 5 10; 2 4]
Аналогічно, з розмірами
3
×2
і3
×1
(мовлення зараз діє лише в другому вимірі),[9 8; 7 6; 5 4] [10; 20; 30] +
[19 18; 27 26; 35 34]
Кількість розмірів може навіть бути різною. Наприклад, входи розмірами 3 × 2 та 3 × 1 × 5 сумісні та дають результат 3 × 2 × 5. Насправді розмір 3 × 2 такий же, як 3 × 2 × 1 (довільно багато неявних задніх однотонних розмірів).
З іншого боку, пара масивів
2
×2
і3
×1
дасть помилку, оскільки розміри вздовж першого виміру є2
і3
: вони не рівні і жоден з них не є1
.
Визначення модульного мовлення
Модульне мовлення - це узагальнення мовлення, яке працює, навіть якщо немає жодного з невідповідних розмірів 1
. Розглянемо для прикладу такі масиви 2
× 2
і 3
× 1
як входи функції +
:
[2 4; 6 8] [10; 20; 30] +
Правило таке: для кожного виміру масив, менший уздовж цього розміру, реплікується модульно (циклічно), щоб відповідати розміру іншого масиву. Це зробило б вищезгадане рівнозначним
[2 4; 6 8; 2 4] [10 10; 20 20; 30 30] +
з результатом
[12 14; 26 28; 32 34]
Як другий приклад:
[5 10; 15 20] [0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0] +
буде виробляти
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
Взагалі, введення з розмірами a
× b
і c
× d
дають результат розміру max(a,b)
× max(c,d)
.
Змагання
Додайте додаток для двовимірних масивів з модульним мовленням, як визначено вище.
Масиви будуть прямокутними (не розірваними), міститимуть лише негативні цілі числа та матимуть розмір щонайменше1
у кожному вимірі.
Додаткові правила:
Введення та вихід можна приймати будь-якими розумними засобами . Їх формат гнучки, як зазвичай.
Програми або функції дозволені на будь- якій мові програмування . Стандартні лазівки заборонені .
Виграє найкоротший код у байтах.
Тестові справи
Далі використовується ;
як роздільник рядків (як у прикладах вище). Кожен тестовий випадок показує два входи, а потім вихід.
[2 4; 6 8]
[10; 20; 30]
[12 14; 26 28; 32 34]
[5 10; 15 20]
[0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0]
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
[1]
[2]
[3]
[1; 2]
[10]
[11; 12]
[1 2 3 4 5]
[10 20 30]
[11 22 33 14 25]
[9 12 5; 5 4 2]
[4 2; 7 3; 15 6; 4 0; 3 3]
[13 14 9;12 7 9;24 18 20;9 4 6;12 15 8]
[9 12 5; 5 4 2]
[4 2 6 7; 7 3 7 3; 15 6 0 1; 4 0 1 16; 3 3 3 8]
[13 14 11 16; 12 7 9 8; 24 18 5 10; 9 4 3 21; 12 15 8 17]
[6 7 9]
[4 2 5]
[10 9 14]
1
× n
(такі як [1 2 3]
) або n
× 1
(такі як [1; 2; 3]
)