Dada uma matriz inteira de pelo menos dois elementos, produza o vetor matriz (definido abaixo) da matriz.
Para calcular o vetor de matriz , primeiro gire pela n
matriz de tamanho- entrada para criar uma matriz de tamanho n x n
, com o primeiro elemento da matriz seguindo a diagonal principal. Isso forma a parte da matriz. Para o vetor, vire a matriz de entrada verticalmente. Em seguida, execute a multiplicação normal da matriz. O vetor de saída é o resultado.
Por exemplo,
a = [1, 2, 3]
Primeiro, gire a matriz duas vezes para a direita, para obter [3, 1, 2]
e [2, 3, 1]
, em seguida, empilhe-as para formar uma 3x3
matriz
[[1, 2, 3]
[3, 1, 2]
[2, 3, 1]]
Em seguida, vire a matriz verticalmente para formar o vetor
[[1, 2, 3] [[1]
[3, 1, 2] x [2]
[2, 3, 1]] [3]]
Realizar multiplicação matricial usual
[[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]]
E a saída é [14, 11, 11]
ou [[14], [11], [11]]
(sua escolha é achatada ou não).
Exemplo 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]
Regras
- Pode-se presumir que a entrada e a saída se encaixam no tipo inteiro nativo do seu idioma.
- A entrada e saída podem ser fornecidas em qualquer formato conveniente .
- Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
- Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
fonte
(v*2)[i+j]
bom truque #Pitão , 10 bytes
Suíte de teste .
fonte
Geléia , 9 bytes
Experimente online!
Uma função que retorna uma matriz vertical. Como um programa completo, parece que retorna uma matriz horizontal. Para retornar uma matriz horizontal, você faria
LḶN⁸ṙ×⁸S€
.fonte
05AB1E , 11 bytes
Experimente online!
fonte
Haskell , 49 bytes
Experimente online!
Para uma entrada
v=[1,2]
iterate tail$v++v
produz a lista[[1,2,1,2],[2,1,2],[1,2],[2],[],...]
fst<$>zip l v
é o mesmo quetake(length v)l
e produz[[1,2,1,2],[2,1,2]]
sum.zipWith(*)v
é mapeado em cada elemento e para produzir o produto de linha da matriz vetorial.fonte
fst<$>zip l v
muitoR ,
66bytes de 62Experimente online!
fonte
Map(function(i)c(n[-(1:i)],n[1:i])%*%n,length(n<-scan()):1)
é 3 bytes mais curto; apenas retorna uma lista de matrizes.for(i in seq(n<-scan()))F=c(c(n[-(1:i)],n[1:i])%*%n,F);F[1:i]
for tem 61 bytes sem retornar um formato de saída estranho.Mathematica, 35 bytes
Experimente online!
-9 bytes de @Não há uma árvore
fonte
Most@FoldList[RotateRight,#,1^#].#&
. (Mas bom truque usando emFold
vez deNest
!)CJam , 17 bytes
Experimente online!
fonte
GolfScript , 37 bytes
Experimente online!
fonte
Python 3 + numpy , 68 bytes
Experimente online!
fonte
J , 14 bytes
Experimente online!
Explicação
fonte
1&|.
não está ligando1
para|.
, criando uma mônada? mas você usa essa mônada com um argumento esquerdo e direito, com o esquerdo determinando quantas vezes ele é aplicado. O que está acontecendo aqui?&
. Quando usado comou n&f v
, está executando(n&f)^:u v
. Veja a parte inferior do vínculo para ver mais análises.#\.|."{]
, mas eu publiquei o menor que eu criei antes de tentar alternativas.APL, 17 bytes
Explicação:
fonte
Oitava , 34 bytes
Experimente online!
fonte
Haskell ,
565552 bytesExperimente online!
Guardou um byte graças a @Laikoni
Salva três bytes: em
l++l
vez decycle l
fonte
zipWith(*)l$drop i$cycle l
.Casca , 11 bytes
Experimente online!
Explicação
fonte
Oitava -
6748 bytesObrigado a Luis Mendo por reduzir este código em 19 bytes!
Nota: Esse código pode ser executado apenas no Octave. O MATLAB não suporta expressões dentro de funções que podem criar variáveis enquanto avalia simultaneamente as expressões que as criam.
O código original no MATLAB pode ser encontrado aqui, mas pode ser executado em qualquer versão do MATLAB. Este código tem 67 bytes:
Explicação
a=input('');
- Recebe um vetor (linha) do usuário através da entrada padrão. Você deve inserir o vetor no formato Oitava (ou seja,[1,2,3]
).n=numel(...);
- Obtém o número total de elementos no vetor de entrada.x=0:n-1
- Cria um vetor de linha que aumenta de0
atén-1
nas etapas 1.(x=0:n-1)-x'
- Executa a transmissão de forma que tenhamos uman x n
matriz para que cada linhai
seja elementos de 0 até quen-1
cada elemento na linha sejai
subtraído pori
.mod(..., n)+1
- Garante que todos os valores negativos sejam redundantes paran
que cada linhai
contenha o vetor de 0 atén-1
circular circular para a esquerda pelosi
elementos. Adicionamos 1 quando o MATLAB / Octave inicia a indexação de vetores ou matrizes com 1.a(...)
- Cria uman x n
matriz onde, usando (4), acessamos os índices corretos do vetor de entrada ditado por cada valor de (4), atingindo a matriz de que precisamos.(...)*a'
- Executa a multiplicação do vetor de matriz, transpondo / invertendoa
para se tornar um vetor de coluna antes de fazer a multiplicação.Execuções de exemplo
Experimente online!
fonte
bsxfun
. Definirn
sem-1
salva também alguns bytes. E se você restringir ao Octave, poderá atribuira
e0:n
às variáveis rapidamente e economizar um pouco mais . Além disso, venha aqui mais vezes !! :-Dinput
função é um ótimo truque. Não achei que pudesse suportar isso. Eu vi isso apenas em C ou C ++ a partir de minha própria experiência. Obrigado!Javascript 79 bytes
Recebe uma matriz de entrada e gera uma matriz do vetor de matriz
Explicação
fonte
Clojure, 80 bytes
iterate
produz uma sequência infinita, mas, em vez de usar(take (count %) (iterate ...))
para pará-lo, uso%
como argumento extra paramap
.fonte
Perl 5 , 65 + 1 (-a) = 66 bytes
Experimente online!
Toma o vetor de entrada como números separados por espaço. Gera números separados por avanço de linha que representam o vetor de resultado.
fonte
C (gcc) , 126 bytes
Experimente online!
Uma matriz pode ser representada na entrada como um ponteiro e comprimento.
fonte
Lisp comum, 78 bytes
Experimente online!
Duplique a matriz (neste caso, uma lista Lisp) e itere sobre as sublistas com
i
(usandox
, throughy
para interromper a iteração). Em seguida, calcule o próximo elemento do resultado, somando o resultado da multiplicação de cada elemento dex
por cada elemento dei
(novamente parando quando a lista mais curta for encerrada).fonte