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]
źródło
1
×n
(takie jak[1 2 3]
) lubn
×1
(takie jak[1; 2; 3]
)Odpowiedzi:
Galaretka , 10 bajtów
Pobiera na wejściu parę macierzy (dwie tablice wierszy) i zwraca macierz.
Wypróbuj online!
Jak to działa
źródło
Węgiel ,
2523 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe jako trójwymiarową tablicę. Wyjaśnienie:
Wprowadź wszystko.źródło
MATL ,
2524 bajtówWypróbuj online!
Wreszcie! Odpowiedź na język inspirowany językiem miesiąca zajęła język miesiąca!
Domyślam się, że nie jest tak krótki, jak to możliwe, ale cieszę się, ponieważ moja początkowa wersja miała ponad 40 bajtów. edytuj: Miałem rację, Luis znalazł kolejny bajt do wyciśnięcia!
źródło
:
z wprowadzaniem wektorowymPython 3 ,
127126125 bajtówzagrał w bajt zmieniając
sum(m)
nam+n
Jeszcze jeden bajt dzięki @Jonathan Frech
Pobiera dane wejściowe jako listę dwóch dwuwymiarowych tablic.
Z
N trwa dwie macierze na wejściu i zwraca iterację uzyskując indeks i połączone z obu tablic wartości do momentu, gdy wskaźnik osiąga długość w największym zespołem detektorów. Zmienna indeksu nie jest dla mnie przydatna i kosztuje mnie bajtów, ale nie wiem, jak się bez niej obejść ... ( powiązane )Z
zewnętrzne i wewnętrzne. Najbardziej wewnętrzne wartości są sumowane.Wypróbuj online!
Używanie
itertools.cycle
przypomina trochę oszustwo, ale myślę, że zostałem wystarczająco ukarany samą długością wyciągu z importu :)Jestem pewien, że można to jeszcze trochę pograć w golfa, zwłaszcza metoda iteracji, która pozostawia te bezużyteczne
i
ij
zmienne. Byłbym wdzięczny za wszelkie wskazówki dotyczące gry w golfa, prawdopodobnie brakuje mi czegoś oczywistego.źródło
zip
argumenty, odwrócićf
przypisanie rozumienia, a tym samym usunąć jedną spację (for i,*l
->for*l,i
)? ( 125 bajtów )?JavaScript (ES6), 131 bajtów
Niewłaściwe narzędzie do pracy i prawdopodobnie również niewłaściwe podejście. No cóż ... ¯ \ _ (ツ) _ / ¯
Wypróbuj online!
W jaki sposób?
Funkcja pomocnicza g () tworzy tablicę, która jest tak duża jak największa tablica wejściowa ( a lub b ) i wywołuje nad nią funkcję zwrotną c :
Funkcja pomocniczych h () odczytuje 2D tablicy A w (x, y) o modułowej nadawania:
Główny kod brzmi teraz następująco:
Wersja rekurencyjna, 134 bajty
Wypróbuj online!
źródło
05AB1E , 15 bajtów
Wypróbuj online!
Stara wersja, 25 bajtów
Wypróbuj online!
Wyjaśnienie
15 bajtów:
25 bajtów:
źródło
R ,
136 104 103 9593 bajtówGrał w golfa aż
3335 bajtów zgodnie z radą Giuseppe. Udało się uzyskać mniej niż 100 bajtów za pomocą operatora jako nazwy funkcji. Zobacz historię, aby uzyskać bardziej czytelny kod.Wypróbuj online!
źródło
apply
irep.len
właśnie to rozważyłem, chociaż sam nie udało mi się go zakodować.dim
, dużo czystszego i otwiera drzwi do wielowymiarowego uogólnienia z rekurencyjnymi połączeniami zr
outer(x,y,"+")
który zawiera wszystkie odpowiednie sumy, w przejrzysty sposób. Nie mogę dowiedzieć się, jak je skutecznie wyodrębnić.K (ngn / k) , 23 bajty
Wypróbuj online!
źródło
05AB1E , 18 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Pyth, 24 bajty
Wypróbuj tutaj
Wyjaśnienie
źródło
Java 8, 172 bajty
Wypróbuj online.
Wyjaśnienie:
źródło
APL (Dyalog Classic) ,
2321 bajtówWypróbuj online!
może to być jedyny raz, kiedy mam okazję skorzystać
|[0]
źródło
Python 2 ,
124116 bajtówWypróbuj online!
Wyjaśnienie:
Pobiera na wejściu listę dwóch list 2-d.
źródło
Python 2 ,
10197105 bajtówEdycja: Jeszcze raz dziękuję Dead Possum za uratowanie 4 bajtów
Edycja 2: utracono 8 bajtów, niektóre przypadki testowe nie były przekazywane
Mieszanka pomiędzy wcześniejszego rozwiązania Dead Possum (dzięki niemu!) I mojego własnego rozwiązania Python 3 .
Wypróbuj online!
Te same dane wejściowe, co moje rozwiązanie Python 3 (para dwuwymiarowych list).
Skomentowany kod:
źródło
Julia 0,6 ,
8583 bajtówWypróbuj online!
(Wymień
⧻
się\
dzięki Jo Kinga )Działa poprzez powtarzanie każdej macierzy poziomo i pionowo, aby oba miały ten sam rozmiar (iloczyn rozmiarów wierszy x iloczyn rozmiarów kolumn), dodając je i wyodrębniając z nich właściwy region. (Wejścia wektorów wierszy lub wejścia wektorów kolumn wymagają
reshape
wywołania, aby były rzutowane jako tablice dwuwymiarowe, co, jak zakładam, jest w porządku, ponieważ pytanie określa „Dodanie implementacji dla tablic dwuwymiarowych” i „Dane wejściowe i wyjściowe mogą być odbierane przez dowolne rozsądne środki. Ich format jest jak zwykle elastyczny. ”)źródło