Antecedentes
Quaternion es un sistema de números que extiende números complejos. Un cuaternión tiene la siguiente forma
donde son números reales e son tres unidades fundamentales de cuaternión . Las unidades tienen las siguientes propiedades:
Tenga en cuenta que la multiplicación de cuaterniones no es conmutativa .
Tarea
Dado un cuaternión no real , calcule al menos una de sus raíces cuadradas.
¿Cómo?
De acuerdo con esta respuesta de Math.SE , podemos expresar cualquier cuaternión no real de la siguiente forma:
donde son números reales y es el vector unitario imaginario en la forma con . Cualquiera de estas tiene la propiedad , por lo que puede verse como la unidad imaginaria.
Entonces el cuadrado de ve así:
Inversamente, dado un cuaternión , podemos encontrar la raíz cuadrada de resolviendo las siguientes ecuaciones
que es idéntico al proceso de encontrar la raíz cuadrada de un número complejo.
Tenga en cuenta que un número real negativo tiene infinitas raíces cuadradas de cuaterniones, pero un cuaternión no real tiene solo dos raíces cuadradas .
Entrada y salida
La entrada es un cuaternión no real. Puede tomarlo como cuatro números reales (punto flotante), en cualquier orden y estructura de su elección. No real significa que al menos uno de es distinto de cero.
La salida es uno o dos cuaterniones que, al cuadrado, son iguales a la entrada.
Casos de prueba
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
Generado usando este script de Python . Solo se especifica una de las dos respuestas correctas para cada caso de prueba; el otro es los cuatro valores negados.
Criterio de puntuación y ganador
Se aplican reglas estándar de código de golf . El programa o función más corto en bytes en cada idioma gana.
fuente
a, (b, c, d)
?a,[b,[c,[d]]]
está bien, si de alguna manera puedes guardar bytes con él :)Respuestas:
APL (NARS) , 2 bytes
√
NARS tiene soporte incorporado para cuaterniones. ¯ \ _ (⍨) _ / ¯
fuente
¯\_(⍨)√¯
Python 2 , 72 bytes
Pruébalo en línea!
Más o menos una fórmula cruda. Pensé que podría usar las comprensiones de listas para repetir
b,c,d
, pero esto parece ser más largo. Python se ve realmente afectado aquí por la falta de operaciones vectoriales, en particular el escalado y la norma.Python 3 , 77 bytes
Pruébalo en línea!
Resolver el cuadrático directamente también fue más corto que usar la raíz cuadrada de números complejos de Python para resolverlo como en el enunciado del problema.
fuente
(s*s).sum()**.5
.Wolfram Language (Mathematica) , 19 bytes
Pruébalo en línea!
Mathematica también tiene Quaternion incorporado, pero es más detallado.
Si bien los complementos se ven geniales, ¡vota soluciones que no utilicen los complementos también! No quiero que los votos sobre las preguntas que lleguen a HNQ estén sesgados.
fuente
JavaScript (ES7),
5553 bytesBasado en la fórmula directa utilizada por xnor .
Toma la entrada como una matriz.
Pruébalo en línea!
¿Cómo?
Y vuelve:
fuente
Haskell , 51 bytes
Pruébalo en línea!
Una fórmula directa. El truco principal para expresar la parte real de la salida
r/sqrt(r*2)
en paralelo a la expresión de la parte imaginaria, que ahorra unos pocos bytes sobre:54 bytes
Pruébalo en línea!
fuente
Carbón , 32 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Puerto de la respuesta Python de @ xnor. Explicación:
Convierta los valores en una cadena e imprima implícitamente.
fuente
Java 8, 84 bytes
Puerto de la respuesta Python 2 de @xnor .
Pruébalo en línea.
Explicación:
fuente
05AB1E , 14 bytes
Puerto de la respuesta Python 2 de @xnor .
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Wolfram Language (Mathematica) , 28 bytes
Puerto de la respuesta de @ xnor's Python 2 .
Pruébalo en línea!
fuente
C # .NET, 88 bytes
El puerto de mi respuesta Java 8 , pero devuelve una Tupla en lugar de una Cadena. Pensé que habría sido más corto, pero desafortunadamente
Math.Sqrt
requieren unaSystem
importación en C # .NET, que termina en 4 bytes más en lugar de 10 bytes más cortos ..>.>Sin embargo, la declaración lambda parece bastante divertida:
Pruébalo en línea.
fuente
Perl 6 , 49 bytes
Pruébalo en línea!
Función curry tomando entrada como
f(b,c,d)(a)
. Devuelve quaternion comoa,(b,c,d)
.Explicación
fuente