fundo
Quaternion é um sistema numérico que estende números complexos. Um quaternion tem a seguinte forma
onde são números reais e são três unidades fundamentais de quaternião . As unidades possuem as seguintes propriedades:
Observe que a multiplicação de quaternion não é comutativa .
Tarefa
Dado um quaternion não real , calcule pelo menos uma de suas raízes quadradas.
Quão?
De acordo com esta resposta Math.SE , podemos expressar qualquer quaternion não real da seguinte forma:
onde são números reais e é o vetor da unidade imaginária na forma com . Qualquer um desses possui a propriedade , para que possa ser visto como a unidade imaginária.
Então o quadrado de fica assim:
Inversamente, dado um quaternário , podemos encontrar a raiz quadrada de resolvendo as seguintes equações
que é idêntico ao processo de encontrar a raiz quadrada de um número complexo.
Observe que um número real negativo tem infinitas raízes quadradas em quaterniões, mas um quaternion não real possui apenas duas raízes quadradas .
Entrada e saída
Input é um quaternion não real. Você pode assumir isso como quatro números reais (ponto flutuante), em qualquer ordem e estrutura de sua escolha. Não real significa que pelo menos um de é diferente de zero.
A saída é um ou dois quaternions que, ao quadrado, são iguais à entrada.
Casos de teste
Input (a, b, c, d) => Output (a, b, c, d) rounded to 6 digits
0.0, 1.0, 0.0, 0.0 => 0.707107, 0.707107, 0.000000, 0.000000
1.0, 1.0, 0.0, 0.0 => 1.098684, 0.455090, 0.000000, 0.000000
1.0, -1.0, 1.0, 0.0 => 1.168771, -0.427800, 0.427800, 0.000000
2.0, 0.0, -2.0, -1.0 => 1.581139, 0.000000, -0.632456, -0.316228
1.0, 1.0, 1.0, 1.0 => 1.224745, 0.408248, 0.408248, 0.408248
0.1, 0.2, 0.3, 0.4 => 0.569088, 0.175720, 0.263580, 0.351439
99.0, 0.0, 0.0, 0.1 => 9.949876, 0.000000, 0.000000, 0.005025
Gerado usando este script Python . Somente uma das duas respostas corretas é especificada para cada caso de teste; o outro são todos os quatro valores negados.
Critério de pontuação e vitória
Aplicam-se as regras de código-golfe padrão . O programa ou função mais curto em bytes em cada idioma vence.
fonte
a, (b, c, d)
?a,[b,[c,[d]]]
é bom, se você pode de alguma forma salvar bytes com ele :)Respostas:
APL (NARS) , 2 bytes
√
O NARS tem suporte interno para quaternions. ¯ \ _ (⍨) _ / ¯
fonte
¯\_(⍨)√¯
Python 2 , 72 bytes
Experimente online!
Mais ou menos uma fórmula crua. Eu pensei que poderia usar a compreensão da lista para fazer um loop
b,c,d
, mas isso parece ser mais longo. O Python é realmente prejudicado aqui pela falta de operações vetoriais, em especial por escala e norma.Python 3 , 77 bytes
Experimente online!
Resolver a quadrática diretamente também foi mais curto do que usar a raiz quadrada de número complexo do Python para resolvê-la como na declaração do problema.
fonte
(s*s).sum()**.5
.Wolfram Language (Mathematica) , 19 bytes
Experimente online!
O Mathematica também possui o Quaternion, mas é mais detalhado.
Embora os built-ins pareçam legais, faça soluções upvote que também não usam os built-ins! Não quero que votos nas perguntas que chegam ao HNQ sejam distorcidos.
fonte
JavaScript (ES7),
5553 bytesCom base na fórmula direta usada pelo xnor .
Recebe entrada como uma matriz.
Experimente online!
Quão?
E retorna:
fonte
Haskell , 51 bytes
Experimente online!
Uma fórmula direta. O principal truque para expressar a parte real da saída como
r/sqrt(r*2)
paralelo à expressão da parte imaginária, que economiza alguns bytes em:54 bytes
Experimente online!
fonte
Carvão , 32 bytes
Experimente online! Link é a versão detalhada do código. Porta da resposta Python do @ xnor. Explicação:
Transmitir os valores para string e imprimir implicitamente.
fonte
Java 8, 84 bytes
Porta da resposta Python 2 do @xnor .
Experimente online.
Explicação:
fonte
05AB1E , 14 bytes
Porta da resposta Python 2 do @xnor .
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Wolfram Language (Mathematica) , 28 bytes
Porta da resposta Python 2 do @ xnor .
Experimente online!
fonte
C # .NET, 88 bytes
Porta da minha resposta Java 8 , mas retorna uma Tupla em vez de uma String. Eu pensei que teria sido mais curto, mas, infelizmente,
Math.Sqrt
exigem umaSystem
importação em C # .NET, terminando em 4 bytes a mais em vez de 10 bytes a menos ..>.>A declaração lambda parece bem engraçada, no entanto:
Experimente online.
fonte
Perl 6 , 49 bytes
Experimente online!
Função ao curry tendo entrada como
f(b,c,d)(a)
. Retorna quaternion comoa,(b,c,d)
.Explicação
fonte