O produto cruzado de dois vetores tridimensionais e é o vetor único modo que:
é ortogonal a e
A magnitude de é igual à área do paralelogramo formado por e
As instruções de , e , nessa ordem, seguem a regra da direita .
Existem algumas fórmulas equivalentes para produtos cruzados, mas uma é a seguinte:
onde , e são os vetores de unidade na primeira, segunda e terceira dimensões.
Desafio
Dados dois vetores 3D, escreva um programa ou função completo para encontrar seu produto cruzado. Os componentes internos que calculam especificamente o produto cruzado não são permitidos.
Entrada
Duas matrizes de três números reais cada. Se o seu idioma não tiver matrizes, os números ainda deverão ser agrupados em três. Ambos os vetores terão magnitude . Observe que o produto cruzado não é comutativo ( ), portanto, você deve ter uma maneira de especificar a ordem.
Saída
Seu produto cruzado, em um formato razoável, com cada componente com precisão de quatro algarismos significativos ou , o que for mais fraco. A notação científica é opcional.
Casos de teste
[3, 1, 4], [1, 5, 9]
[-11, -23, 14]
[5, 0, -3], [-3, -2, -8]
[-6, 49, -10]
[0.95972, 0.25833, 0.22140],[0.93507, -0.80917, -0.99177]
[-0.077054, 1.158846, -1.018133]
[1024.28, -2316.39, 2567.14], [-2290.77, 1941.87, 712.09]
[-6.6345e+06, -6.6101e+06, -3.3173e+06]
Isso é código-golfe , então a solução mais curta em bytes vence.
Maltysen postou um desafio semelhante , mas a resposta foi fraca e a pergunta não foi editada.
fonte
Respostas:
Geléia,
141312 bytesExperimente online!
Como funciona
Versão não concorrente (10 bytes)
OK, isso é embaraçoso, mas a linguagem de manipulação de array Jelly não tinha um built-in para rotação de array até agora. Com este novo built-in, podemos salvar dois bytes adicionais.
Isso usa a abordagem da resposta J de @ AlexA . Experimente online!
Como funciona
fonte
LISP,
128122 bytesOi! Este é o meu código:
Eu sei que não é a solução mais curta, mas ninguém forneceu uma no Lisp, até agora :)
Copie e cole o seguinte código aqui para experimentá-lo!
fonte
Dyalog APL, 12 bytes
Com base na resposta J de @ AlexA. E (coincidentemente) equivalente à melhoria de @ randomra na seção de comentários dessa resposta.
Experimente online no TryAPL .
Como funciona
fonte
J,
2714 bytesEste é um verbo diádico que aceita matrizes à esquerda e à direita e retorna seu produto cruzado.
Explicação:
Exemplo:
Experimente aqui
Economizou 13 bytes graças a randomra!
fonte
*2&|.
é um garfo de dois verbos:*
e2&|.
. Multiplica a entrada esquerda por uma rotação de 2 entradas à direita. Esse garfo é armazenado,v
portanto, quando escrevemosv~
, é equivalente a(*2&|.)~
, onde~
trocamos os parâmetros de entrada esquerdo e direito da peça entre parênteses.C,
156154150148144 bytesNão vou ganhar nenhum prêmio pela duração, mas pensei que eu teria de qualquer maneira.
Demo
Ungolfed:
fonte
for
não precisa{}
Haskell, 41 bytes
Uma solução simples.
fonte
Bash + coreutils, 51
bc
faz a avaliação aritmética com a precisão necessária.A entrada é como duas listas separadas por vírgula na linha de comando. Saída como linhas separadas por nova linha:
fonte
MATL , 17 bytes
A primeira entrada é a , a segunda é b .
Experimente online!
Explicação
fonte
Pitão, 16 bytes
Experimente online: Demonstração
Explicação:
fonte
K5,
44403732 bytesEscreveu este há muito tempo e espanou-o novamente recentemente .
Em ação:
Editar 1:
Salva 4 bytes, inserindo a entrada como uma lista de listas em vez de dois argumentos separados:
Edição 2:
Economizou 3 bytes calculando uma tabela de pesquisa com decodificação básica:
Edição 3:
Salve 5 bytes reorganizando o aplicativo para permitir o uso de uma definição tácita em vez de uma lambda local. Infelizmente, esta solução não funciona mais em OK e requer o intérprete oficial do k5. Vou ter que acreditar na minha palavra até que eu corrija o erro em OK:
fonte
Ruby , 49 bytes
Experimente online!
Retornando após 2 anos, retirei 12 bytes usando como Ruby trata índices de matriz negativos.
-1
é o último elemento da matriz,-2
o segundo último etc.Ruby, 57
No programa de teste
fonte
Python,
7348 bytesObrigado @FryAmTheEggman
Isso se baseia na definição de componente do produto cruzado de vetor.
Experimente aqui
fonte
lambda (a,b,c),(d,e,f):...
deve economizar muito.Gelatina , 5 bytes
Z
Experimente online!
Aqui está uma explicação em PDF , caso a remarcação SE não consiga lidar com isso.
O produto cruzado na forma analítica
Após os rearranjos e cálculos necessários:
A estreita relação com os determinantes da matriz
Há uma coisa interessante a ser observada aqui:
Explicação do código de geléia
Bem ... não há muito a explicar aqui. Apenas gera a matriz:
E para cada par de matrizes vizinhas, calcula o determinante da matriz formada pela união das duas.
fonte
Wolfram Language (Mathematica) ,
3833 bytesExperimente online!
fonte
ES6, 40 bytes
44 bytes se a entrada precisar ser de duas matrizes:
52 bytes para uma versão mais interessante:
fonte
Julia 0,7 ,
4539 bytesExperimente online!
Usa a fórmula baseada em determinante fornecida na descrição da tarefa.
Graças a H.PWiz por -6 bytes.
fonte
f(a,b)=1:3 .|>i->det([eye(3)[i,:] a b])
APL (NARS), 23 caracteres, 46 bytes
teste:
fonte
Pari / GP , 41 bytes
Experimente online!
fonte