Wyzwanie to jest związane z niektórymi funkcjami języka MATL w ramach wydarzenia Język miesiąca miesiąca 2018 .
Wprowadzenie
W MATL wiele funkcji dwóch wejść działa elementarnie z rozgłaszaniem . Oznacza to, co następuje:
Pod względem elementów (lub wektoryzacji ): funkcja przyjmuje jako dane wejściowe dwie tablice o pasujących rozmiarach. Operacja zdefiniowana przez funkcję jest stosowana do każdej pary odpowiednich pozycji. Na przykład za pomocą notacji po poprawce:
[2 4 6] [10 20 30] +
daje wyjście
[12 24 36]
Działa to również z tablicami wielowymiarowymi. Notacja
[1 2 3; 4 5 6]
reprezentuje tablicę2
×3
(macierz)1 2 3 4 5 6
który ma rozmiar
2
wzdłuż pierwszego wymiaru (w pionie) i3
wzdłuż drugiego (w poziomie). Na przykład[2 4 6; 3 5 7] [10 20 30; 40 60 80] *
[20 80 180; 120 300 560]
Nadawanie lub ( rozszerzenie singleton ): dwie tablice wejściowe nie mają pasujących rozmiarów, ale w każdym niepasującym wymiarze jedna z tablic ma rozmiar
1
. Ta tablica jest domyślnie replikowana wzdłuż innych wymiarów, aby dopasować rozmiary; a następnie operacja jest stosowana elementowo, jak wyżej. Rozważmy na przykład dwie tablice wejściowe o rozmiarach1
×2
i3
×1
:[10 20] [1; 2; 5] /
Dzięki nadawaniu jest to równoważne z
[10 20; 10 20; 10 20] [1 1; 2 2; 5 5] /
i tak daje
[10 20; 5 10; 2 4]
Podobnie w przypadku rozmiarów
3
×2
i3
×1
(nadawanie działa teraz tylko w drugim wymiarze),[9 8; 7 6; 5 4] [10; 20; 30] +
[19 18; 27 26; 35 34]
Liczba wymiarów może być nawet inna. Na przykład dane wejściowe o rozmiarach 3 × 2 i 3 × 1 × 5 są kompatybilne i dają wynik 3 × 2 × 5. W rzeczywistości rozmiar 3 × 2 jest taki sam jak 3 × 2 × 1 (istnieje arbitralnie wiele ukrytych wymiarów singletonu).
Z drugiej strony para tablic
2
×2
i3
×1
spowodowałaby błąd, ponieważ rozmiary wzdłuż pierwszego wymiaru wynoszą2
i3
: nie są równe i żaden z nich nie jest1
.
Definicja nadawania modułowego
Nadawanie modułowe to uogólnienie nadawania, które działa, nawet jeśli nie ma niepasujących rozmiarów 1
. Rozważmy na przykład następujące tablice 2
× 2
i 3
× 1
jako dane wejściowe funkcji +
:
[2 4; 6 8] [10; 20; 30] +
Zasada jest następująca: dla każdego wymiaru tablica, która jest mniejsza wzdłuż tego wymiaru, jest replikowana modułowo (cyklicznie) w celu dopasowania do rozmiaru drugiej tablicy. Czyni to powyższy odpowiednik
[2 4; 6 8; 2 4] [10 10; 20 20; 30 30] +
z rezultatem
[12 14; 26 28; 32 34]
Jako drugi przykład
[5 10; 15 20] [0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0] +
produkuje
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
Ogólnie dane wejściowe o rozmiarach a
× b
i c
× d
dają wynik o rozmiarze max(a,b)
× max(c,d)
.
Wyzwanie
Zaimplementuj dodatek dla dwuwymiarowych tablic z modułową transmisją, jak zdefiniowano powyżej.
Tablice będą prostokątne (nie poszarpane), będą zawierały nieujemne liczby całkowite i będą miały rozmiar co najmniej1
w każdym wymiarze.
Dodatkowe zasady:
Dane wejściowe i wyjściowe można przyjmować dowolnymi rozsądnymi środkami . Ich format jest elastyczny jak zwykle.
Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione .
Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
Poniższe zastosowania stanowią ;
separator wierszy (jak w powyższych przykładach). Każdy przypadek testowy pokazuje dwa wejścia, a następnie dane wyjściowe.
[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
(takie jak [1 2 3]
) lub n
× 1
(takie jak [1; 2; 3]
)