Dada una matriz entera de al menos dos elementos, genera el vector matriz (definido a continuación) de la matriz.
Para calcular el vector matriz , primero gire a través de la n
matriz de entrada de tamaño para crear una matriz de tamaño n x n
, con el primer elemento de la matriz siguiendo la diagonal principal. Esto forma la porción de la matriz. Para el vector, voltee la matriz de entrada verticalmente. Luego realice la multiplicación normal de la matriz. El vector de salida es el resultado.
Por ejemplo,
a = [1, 2, 3]
Primero, gire la matriz dos veces hacia la derecha, para obtener [3, 1, 2]
y [2, 3, 1]
luego apílelos para formar una 3x3
matriz
[[1, 2, 3]
[3, 1, 2]
[2, 3, 1]]
Luego, voltea la matriz verticalmente para formar el vector
[[1, 2, 3] [[1]
[3, 1, 2] x [2]
[2, 3, 1]] [3]]
Realizar la multiplicación matricial habitual
[[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]]
Y la salida es [14, 11, 11]
o [[14], [11], [11]]
(su elección de si está aplanada o no).
Ejemplo # 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]
Reglas
- Se puede suponer que la entrada y la salida se ajustan al tipo de entero nativo de su idioma.
- La entrada y la salida se pueden dar en cualquier formato conveniente .
- Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
- Si es posible, incluya un enlace a un entorno de prueba en línea para que otras personas puedan probar su código.
- Las lagunas estándar están prohibidas.
- Este es el código de golf, por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
fuente
(v*2)[i+j]
buen trucoPyth , 10 bytes
Banco de pruebas .
fuente
Jalea , 9 bytes
Pruébalo en línea!
Una función que devuelve una matriz vertical. Como programa completo, parece que devuelve una matriz horizontal. Para devolver una matriz horizontal que haría en su
LḶN⁸ṙ×⁸S€
lugar.fuente
05AB1E , 11 bytes
Pruébalo en línea!
fuente
Haskell , 49 bytes
Pruébalo en línea!
Para una entrada
v=[1,2]
iterate tail$v++v
produce la lista[[1,2,1,2],[2,1,2],[1,2],[2],[],...]
fst<$>zip l v
es igualtake(length v)l
y produce[[1,2,1,2],[2,1,2]]
sum.zipWith(*)v
se mapea en cada elemento y produce el producto de fila de matriz de vectores.fuente
fst<$>zip l v
muchoR ,
6662 bytesPruébalo en línea!
fuente
Map(function(i)c(n[-(1:i)],n[1:i])%*%n,length(n<-scan()):1)
es 3 bytes más corto; solo devuelve una lista de matrices.for(i in seq(n<-scan()))F=c(c(n[-(1:i)],n[1:i])%*%n,F);F[1:i]
tiene 61 bytes sin devolver un formato de salida extraño.Mathematica, 35 bytes
Pruébalo en línea!
-9 bytes de @No es un árbol
fuente
Most@FoldList[RotateRight,#,1^#].#&
. (¡Pero es un buen truco usar enFold
lugar deNest
!)CJam , 17 bytes
Pruébalo en línea!
fuente
GolfScript , 37 bytes
Pruébalo en línea!
fuente
Python 3 + numpy , 68 bytes
Pruébalo en línea!
fuente
J , 14 bytes
Pruébalo en línea!
Explicación
fuente
1&|.
no estás unión1
a|.
, la creación de una mónada? pero luego usas esa mónada con un argumento izquierdo y derecho, y el izquierdo determina cuántas veces se aplica. ¿Que está pasando aqui?&
. Cuando se usa comou n&f v
, está funcionando(n&f)^:u v
. Vea la parte inferior del enlace para ver más análisis del mismo.#\.|."{]
, pero publiqué el más corto que se me ocurrió antes de probar alternativas.APL, 17 bytes
Explicación:
fuente
Octava , 34 bytes
Pruébalo en línea!
fuente
Haskell ,
565552 bytesPruébalo en línea!
Guardado un byte gracias a @Laikoni
Guardado tres bytes: en
l++l
lugar decycle l
fuente
zipWith(*)l$drop i$cycle l
.Casco , 11 bytes
Pruébalo en línea!
Explicación
fuente
Octava -
6748 bytes¡Gracias a Luis Mendo por reducir este código en 19 bytes!
Nota: Este código solo puede ejecutarse en Octave. MATLAB no admite expresiones dentro de funciones que pueden crear variables al mismo tiempo que evalúa las expresiones que las crean.
El código original en MATLAB se puede encontrar aquí, pero se puede ejecutar en cualquier versión de MATLAB. Este código tiene 67 bytes:
Explicación
a=input('');
- Recibe un vector (fila) del usuario a través de la entrada estándar. Debe ingresar el vector en forma de octava (es decir[1,2,3]
).n=numel(...);
- Obtiene el número total de elementos en el vector de entrada.x=0:n-1
- Crea un vector de fila que aumenta de0
hastan-1
en pasos de 1.(x=0:n-1)-x'
- Realiza la transmisión de modo que tengamos unan x n
matriz para que cada filai
sean elementos desde 0 hastan-1
con cada elemento en filai
sustraído pori
.mod(..., n)+1
- Asegura que cualquier valor que sea negativo se ajuste a, den
modo que cada filai
contenga el vector desde 0 hasta desplazadon-1
circularmente a la izquierda pori
elementos. Agregamos 1 cuando MATLAB / Octave comienza a indexar vectores o matrices con 1.a(...)
- Crea unan x n
matriz donde usando (4), accedemos a los índices correctos del vector de entrada dictados por cada valor de (4), logrando así la matriz que necesitamos.(...)*a'
- Realiza la multiplicación de vectores de matriz mediante transposición / volteoa
para convertirse en un vector de columna antes de hacer la multiplicación.Ejecuciones de ejemplo
Pruébalo en línea!
fuente
bsxfun
. Definirn
sin-1
guardar algunos bytes también. Y si restringe a Octave, puede asignara
y0:n
variables sobre la marcha y guardar algo más . Además, ven aquí más a menudo! :-Dinput
función es un gran truco. No pensé que pudiera soportar eso. Lo he visto solo en C o C ++ desde mi propia experiencia. ¡Gracias!Javascript 79 bytes
Toma una matriz de entrada y genera una matriz del vector matriz
Explicación
fuente
Clojure, 80 bytes
iterate
produce una secuencia infinita, pero en lugar de usarlo(take (count %) (iterate ...))
para detenerlo, lo uso%
como argumento adicional paramap
.fuente
Perl 5 , 65 + 1 (-a) = 66 bytes
Pruébalo en línea!
Toma el vector de entrada como números separados por espacios. Emite números separados por salto de línea que representan el vector resultante.
fuente
C (gcc) , 126 bytes
Pruébalo en línea!
Una matriz se puede representar en la entrada como un puntero y una longitud.
fuente
Lisp común, 78 bytes
Pruébalo en línea!
Duplique la matriz (en este caso, una lista Lisp) e itere sobre las sublistas con
i
(usandox
, a travésy
, para detener la iteración). Luego calcule el siguiente elemento del resultado sumando el resultado de multiplicar cada elemento dex
con cada elemento dei
(deteniéndose nuevamente cuando finaliza la lista más corta).fuente