Фон
Quaternion - это система счисления, расширяющая комплексные числа. Кватернион имеет следующую форму
где - действительные числа, а - три фундаментальных кватернионных единицы . Единицы имеют следующие свойства:
Обратите внимание, что умножение кватернионов не является коммутативным .
задача
Учитывая нереальный кватернион, вычислите хотя бы один из его квадратных корней.
Как?
Согласно этому ответу Math.SE , мы можем выразить любой нереальный кватернион в следующей форме:
где - действительные числа, а - мнимый единичный вектор в форме с . Любой такой обладает свойством , поэтому его можно рассматривать как мнимую единицу.
Тогда квадрат выглядит так:
Обратно, учитывая кватернион , мы можем найти квадратный корень из , решив следующие уравнения
который идентичен процессу нахождения квадратного корня комплексного числа.
Обратите внимание, что отрицательное действительное число имеет бесконечно много кватернионных квадратных корней, но нереальное кватернион имеет только два квадратных корня .
Вход и выход
Вход не является реальным кватернионом. Вы можете принять его как четыре действительных числа (с плавающей запятой) в любом порядке и структуре по вашему выбору. Нереальный означает, что по крайней мере один из ненулевой.
Выход - один или два кватерниона, которые в квадрате равны входу.
Контрольные примеры
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
Создано с использованием этого скрипта Python . Только один из двух правильных ответов указан для каждого теста; другой - все четыре значения отрицательные.
Критерий оценки и выигрыша
Применяются стандартные правила игры в гольф . Самая короткая программа или функция в байтах на каждом языке выигрывает.
источник
a, (b, c, d)
?a,[b,[c,[d]]]
хорошо, если вы можете каким-то образом сохранить байты с ним :)Ответы:
APL (NARS) , 2 байта
√
NARS имеет встроенную поддержку кватернионов. ¯ \ _ (⍨) _ / ¯
источник
¯\_(⍨)√¯
Python 2 , 72 байта
Попробуйте онлайн!
Более или менее сырая формула. Я думал, что мог бы использовать списки, чтобы зацикливаться
b,c,d
, но это, кажется, дольше. Python действительно пострадал от отсутствия векторных операций, в частности, масштабирования и норм.Python 3 , 77 байт
Попробуйте онлайн!
Непосредственное решение квадратичной задачи также было короче, чем использование квадратного корня комплексного числа в Python для его решения, как в постановке задачи.
источник
(s*s).sum()**.5
.Wolfram Language (Mathematica) , 19 байтов
Попробуйте онлайн!
Mathematica также имеет встроенный Quaternion, но более подробный.
Несмотря на то, что встроенные модули выглядят круто, используйте встроенные решения, которые тоже не используют встроенные модули! Я не хочу, чтобы голоса по вопросам, доходящим до HNQ, были искажены.
источник
JavaScript (ES7),
5553 байтаОсновано на прямой формуле, используемой xnor .
Принимает ввод в виде массива.
Попробуйте онлайн!
Как?
И возвращает:
источник
Haskell , 51 байт
Попробуйте онлайн!
Прямая формула. Основной трюк, чтобы выразить действительную часть вывода как
r/sqrt(r*2)
параллельное выражение мнимой части, которая экономит несколько байтов:54 байта
Попробуйте онлайн!
источник
Древесный уголь , 32 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Порт @Xnor's Python ответа. Объяснение:
Приведите значения в строку и неявно напечатайте.
источник
Java 8, 84 байта
Порт @xnor 's Python 2 ответа .
Попробуйте онлайн.
Объяснение:
источник
05AB1E , 14 байтов
Порт @xnor 's Python 2 ответа .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Wolfram Language (Mathematica) , 28 байт
Порт ответа @ xnor на Python 2 .
Попробуйте онлайн!
источник
C # .NET, 88 байт
Порт моего ответа Java 8 , но возвращает Stuple вместо Tuple. Я думал, что это было бы короче, но, к сожалению,
Math.Sqrt
требуетсяSystem
-импорт в C # .NET, заканчивающийся на 4 байта длиннее вместо 10 байтов короче ..>.>Лямбда-декларация выглядит довольно забавно, хотя:
Попробуйте онлайн.
источник
Perl 6 , 49 байт
Попробуйте онлайн!
Функция Curried принимает вход как
f(b,c,d)(a)
. Возвращает кватернион какa,(b,c,d)
.объяснение
источник