Biorąc pod uwagę tablicę liczb całkowitych składającą się z co najmniej dwóch elementów, wyślij wektor macierzy (zdefiniowany poniżej) tablicy.
Aby obliczyć wektor macierzy , najpierw obróć n
tablicę wprowadzania rozmiaru n x n
, aby utworzyć macierz wielkości , przy czym pierwszy element tablicy będzie podążał za główną przekątną. To tworzy część matrycy. W przypadku wektora odwróć tablicę wejściową pionowo. Następnie wykonaj normalne mnożenie macierzy. Wektor wyjściowy jest wynikiem.
Na przykład,
a = [1, 2, 3]
Po pierwsze, należy obrócić tablice dwa razy na prawo, w celu uzyskania [3, 1, 2]
i [2, 3, 1]
, następnie stosu je, tworząc 3x3
macierz
[[1, 2, 3]
[3, 1, 2]
[2, 3, 1]]
Następnie odwróć tablicę pionowo, aby utworzyć wektor
[[1, 2, 3] [[1]
[3, 1, 2] x [2]
[2, 3, 1]] [3]]
Wykonaj zwykłe mnożenie macierzy
[[1, 2, 3] [[1] [[1+4+9] [[14]
[3, 1, 2] x [2] = [3+2+6] = [11]
[2, 3, 1]] [3]] [2+6+3]] [11]]
Wyjście to [14, 11, 11]
lub [[14], [11], [11]]
(wybór, czy ma być spłaszczony, czy nie).
Przykład nr 2
a = [2, 5, 8, 3]
[[2, 5, 8, 3] [[2] [[4+25+64+9] [[102]
[3, 2, 5, 8] x [5] = [6+10+40+24] = [80]
[8, 3, 2, 5] [8] [16+15+16+15] [62]
[5, 8, 3, 2]] [3]] [10+40+24+6]] [80]]
[102, 80, 62, 80]
Zasady
- Można założyć, że dane wejściowe i wyjściowe pasują do natywnego typu liczb całkowitych twojego języka.
- Dane wejściowe i wyjściowe można podawać w dowolnym dogodnym formacie .
- Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
- Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inne osoby mogły wypróbować Twój kod!
- Standardowe luki są zabronione.
- To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
źródło
(v*2)[i+j]
nice trickPyth, 10 bytes
Test suite.
źródło
Jelly, 9 bytes
Try it online!
A function that returns a vertical array. As a full program it appears as if it returns a horizontal array. To return a horizontal array you'd do
LḶN⁸ṙ×⁸S€
instead.źródło
05AB1E, 11 bytes
Try it online!
źródło
Haskell, 49 bytes
Try it online!
For an input
v=[1,2]
iterate tail$v++v
yields the list[[1,2,1,2],[2,1,2],[1,2],[2],[],...]
fst<$>zip l v
is the same astake(length v)l
and yields[[1,2,1,2],[2,1,2]]
sum.zipWith(*)v
is mapped on each element and to yield the vector-matrix row product.źródło
fst<$>zip l v
very much.R,
6662 bytesTry it online!
źródło
Map(function(i)c(n[-(1:i)],n[1:i])%*%n,length(n<-scan()):1)
is 3 bytes shorter; it just returns a list of matrices.for(i in seq(n<-scan()))F=c(c(n[-(1:i)],n[1:i])%*%n,F);F[1:i]
is 61 bytes without returning a weird output format.Mathematica, 35 bytes
Try it online!
-9 bytes from @Not a tree
źródło
Most@FoldList[RotateRight,#,1^#].#&
. (But nice trick usingFold
instead ofNest
!)CJam, 17 bytes
Try it online!
źródło
GolfScript, 37 bytes
Try it online!
źródło
Python 3 + numpy, 68 bytes
Try it online!
źródło
J, 14 bytes
Try it online!
Explanation
źródło
1&|.
aren't you bonding1
to|.
, creating a monad? but then you use that monad with both a left and right arg, with the left one determining how many times it's applied. What's going on here?&
. When used asu n&f v
, it is performing(n&f)^:u v
. See the bottom of bond to see more parses of it.#\.|."{]
, but I posted the shortest that I came up with first before trying alternatives.APL, 17 bytes
Explanation:
źródło
Octave, 34 bytes
Try it online!
źródło
Haskell,
565552 bytesTry it online!
Saved one byte thanks to @Laikoni
Saved three bytes:
l++l
instead ofcycle l
źródło
zipWith(*)l$drop i$cycle l
.Husk, 11 bytes
Try it online!
Explanation
źródło
Octave -
6748 bytesThanks to Luis Mendo for shaving this code down by 19 bytes!
Note: This code can only run in Octave. MATLAB does not support expressions inside functions that can create variables while simultaneously evaluating the expressions that create them.
The original code in MATLAB can be found here, but can be run in any version of MATLAB. This code is 67 bytes:
Explanation
a=input('');
- Receives a (row) vector from the user through standard input. You must enter the vector in Octave form (i.e.[1,2,3]
).n=numel(...);
- Obtains the total number of elements in the input vector.x=0:n-1
- Creates a row vector that increases from0
up ton-1
in steps of 1.(x=0:n-1)-x'
- Performs broadcasting so that we have an x n
matrix so that each rowi
are elements from 0 up ton-1
with each element in rowi
subtracted byi
.mod(..., n)+1
- Ensures that any values that are negative wrap around ton
so that each rowi
contains the vector from 0 up ton-1
circularly shifted to the left byi
elements. We add 1 as MATLAB / Octave starts indexing vectors or matrices with 1.a(...)
- Creates an x n
matrix where using (4), we access the correct indices of the input vector dictated by each value from (4) thus achieving the matrix we need.(...)*a'
- Performs matrix vector multiplication by transposing / flippinga
to become a column vector prior to doing the multiplication.Example Runs
Try it online!
źródło
bsxfun
. Definingn
without-1
saves a few bytes too. And if you restrict to Octave you can assigna
and0:n
to variables on the fly and save some more. Also, come here more often!! :-Dinput
function is a great trick. I didn't think it could support that. I've seen it only in C or C++ from my own experience. Thanks!Javascript 79 bytes
Takes in an input array and outputs an array of the matrix vector
Explanation
źródło
Clojure, 80 bytes
iterate
produces an infinite sequence, but instead of using(take (count %) (iterate ...))
to stop it I use%
as an extra argument tomap
.źródło
Perl 5, 65 + 1 (-a) = 66 bytes
Try it online!
Takes the input vector as space separated numbers. Outputs linefeed separated numbers representing the result vector.
źródło
C (gcc), 126 bytes
Try it online!
An array may be represented in input as a pointer and length.
źródło
Common Lisp, 78 bytes
Try it online!
Double the array (in this case a Lisp list) and iterate over the sublists with
i
(usingx
, throughy
, to stop the iteration). Then calculate the next element of the result by summing the result of multiplying each element ofx
with each element ofi
(again stopping when the shorter list is terminated).źródło