Problem
Utwórz program lub funkcję, która może obliczyć wynik macierzy podniesionej do n- tej potęgi. Kod weźmie dowolnej macierzy kwadratowej A i nieujemną liczbę całkowitą, n i powrót macierz wartości A n .
Ograniczenia
Wbudowane funkcje obliczające moc macierzy i iloczyn macierzy są niedozwolone.
Obowiązują pozostałe standardowe zasady gry w golfa kodowego.
Wyjaśnienie
Biorąc pod uwagę macierz kwadratową A , wartość A n = AA ⋯ A (iloczyn macierzy A z samym sobą, n razy). Jeśli n jest dodatnie, stosowany jest właśnie wspomniany standard. Gdy n wynosi zero, macierz identyczności z tego samego rzędu A jest wynik.
Cel
To jest gra w golfa i wygrywa najkrótszy kod.
Przypadki testowe
Tutaj A jest macierzą wejściową, n jest liczbą całkowitą na wejściu, a r jest macierzą wyjściową, gdzie r = A n .
n = 0
A = 62 72
10 34
r = 1 0
0 1
n = 1
A = 23 61 47
81 11 60
42 9 0
r = 23 61 47
81 11 60
42 9 0
n = 2
A = 12 28 -26 3
-3 -10 -13 0
25 41 3 -4
-20 -14 -4 29
r = -650 -1052 -766 227
-331 -517 169 43
332 469 -1158 -53
-878 -990 574 797
n = 4
A = -42 -19 18 -38
-33 26 -13 31
-43 25 -48 28
34 -26 19 -48
r = -14606833 3168904 -6745178 4491946
1559282 3713073 -4130758 7251116
8097114 5970846 -5242241 12543582
-5844034 -4491274 4274336 -9196467
n = 5
A = 7 0 -3 8 -5 6 -6
6 7 1 2 6 -3 2
7 8 0 0 -8 5 2
3 0 1 2 4 -3 4
2 4 -1 -7 -4 -1 -8
-3 8 -9 -2 7 -4 -8
-4 -5 -1 0 5 5 -1
r = 39557 24398 -75256 131769 50575 14153 -7324
182127 19109 3586 115176 -23305 9493 -44754
146840 31906 -23476 190418 -38946 65494 26468
42010 -21876 41060 -13950 -55148 19290 -406
44130 34244 -35944 34272 22917 -39987 -54864
1111 40810 -92324 35831 215711 -117849 -75038
-70219 8803 -61496 6116 45247 50166 2109
A^-1
być stosowany jako zamiennikinv(A)
?exp(k*log(M))
dozwolone (Chociaż może to nie działać z powodu nietypowych gałęzi).Odpowiedzi:
Galaretka ,
171615 bajtówWypróbuj online!
Permalink z wyjściem siatki: przypadek testowy 1 | przypadek testowy 2 | przypadek testowy 3 | przypadek testowy 4 | walizka testowa 5
Jak to działa
źródło
MATL , 20 bajtów
Wypróbuj online!
Wyjaśnienie
Pozwala to uniknąć mnożenia macierzy, wykonując ją ręcznie, wykorzystując mnożenie elementarne z rozgłoszeniem, a następnie sumę wektorową. W szczególności, aby pomnożyć macierze
M
iN
oba rozmiary s × s :M
. Wywołaj macierz wynikowąP
.N
takich, któreN
są „obrócone” za pomocą osi obrotu wzdłuż pierwszego wymiaru, dając , powiedzmy, macierz 3D s × 1 × s 3DQ
.P
razy każdy elementQ
, z niejawną transmisją. Oznacza to, żeP
jest on automatycznie replikowany s razy wzdłuż trzeciego wymiaru iQ
jest replikowany s razy wzdłuż drugiego wymiaru, aby uzyskać oba s × s × s , zanim nastąpi rzeczywiste zwielokrotnienie elementarne.Skomentowany kod:
źródło
APL,
3231 znakówLewy argument moc do podniesienia, prawy argument macierz. Najtrudniejszym (najbardziej zajmującym miejsce) bitem jest budowanie macierzy tożsamości dla przypadku, gdy pożądanym wykładnikiem jest 0. Rzeczywiste obliczenia oparte są na fakcie, że uogólniony produkt wewnętrzny (
.
) z operandami+
i×
jako operandami jest faktycznie produktem macierzy. To w połączeniu z⍣
operatorem mocy („powtórzenie”) tworzy mięso roztworu.źródło
(1+≢⍵)↑1
=>,1↑⍨1+≢⍵
aby zapisać jeden bajt.Sage, 112 bajtów
Wypróbuj online
Wyjaśnienie:
Wewnętrzna lambda (
lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A]
) jest prostą implementacją mnożenia macierzy. Zewnętrzna lambda (lambda A,n:reduce(...,[A]*n,identity_matrix(len(A)))
) używareduce
do obliczania mocy macierzy przez iterowane mnożenie macierzy (przy użyciu wspomnianej wcześniej domowej funkcji mnożenia macierzy), z macierzą tożsamości jako wartością początkową do obsługin=0
.źródło
Julia,
908668 bajtówJest to funkcja rekurencyjna, która przyjmuje matrycę (
Array{Int,2}
) i liczbę całkowitą i zwraca macierz.Nie golfowany:
Wypróbuj online! (obejmuje wszystkie przypadki testowe oprócz ostatniego, co jest zbyt wolne dla witryny)
Zaoszczędź 18 bajtów dzięki Dennisowi!
źródło
Python 2.7,
158145 bajtówNajgorsza odpowiedź tutaj, ale moja najlepsza gra w golfa w Pythonie. Przynajmniej fajnie było się uczyć mnożenia macierzy.
Gra w golfa:
Wyjaśnienie:
źródło
JavaScript (ES6), 123 bajty
Używałem wersji 132-bajtowej,
reduce
alea
tak często mapowałem, że okazało się, że jest o 9 bajtów krótszy, aby napisać funkcję pomocnika, która zrobi to za mnie. Działa, tworząc macierz tożsamości i mnożąc ją przeza
długin
czas. Istnieje wiele wyrażeń, które powracają0
lub1
dlai == j
których wszystkie wydają się mieć długość 7 bajtów.źródło
Python 3 , 147 bajtów
Wypróbuj online!
źródło
R, 49 bajtów
Funkcja rekurencyjna, która wymaga
m
atriki i mocy,n
aby ją podnieść. Wywołania rekurencyjne%*%
, które obliczają iloczyn skalarny. Wartość początkowa rekurencji jest macierzą tożsamości tego samego rozmiaru com
. Ponieważm %*% m = m %*% m %*% I
to działa dobrze.źródło
Python 2 , 131 bajtów
Wypróbuj online!
źródło