tło
Czwartorzęd jest systemem liczbowym, który rozszerza liczby zespolone. Czwartorzęd ma następującą postać
gdzie są liczbami rzeczywistymi, a są trzema podstawowymi jednostkami czwartorzędowymi . Jednostki mają następujące właściwości:
Zauważ, że mnożenie czwartorzędu nie jest przemienne .
Zadanie
Biorąc pod uwagę nierealny czwartorzęd, oblicz co najmniej jeden z pierwiastków kwadratowych.
W jaki sposób?
Zgodnie z odpowiedzią Math.SE możemy wyrazić dowolny nierealny czwartorzęd w następującej formie:
gdzie są liczbami rzeczywistymi, a jest urojonym wektorem jednostkowym w postaci z . Każdy taki ma właściwość , więc można go postrzegać jako jednostkę urojoną.
Następnie kwadrat wygląda następująco:
Odwrotnie, biorąc pod uwagę ćwiartkę , możemy znaleźć pierwiastek kwadratowy z rozwiązując następujące równania
który jest identyczny z procesem znajdowania pierwiastka kwadratowego liczby zespolonej.
Zauważ, że ujemna liczba rzeczywista ma nieskończenie wiele pierwiastków czwartorzędowych, ale nierealna czwórka ma tylko dwa pierwiastki kwadratowe .
Wejście i wyjście
Wejście jest nierealnym czwartorzędem. Można go traktować jako cztery liczby rzeczywiste (zmiennoprzecinkowe), w dowolnej kolejności i dowolnej strukturze. Nierealne oznacza, że co najmniej jedno z jest niezerowe.
Wyjście to jeden lub dwa ćwiartki, które w kwadracie są równe wejściowi.
Przypadki testowe
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
Wygenerowano przy użyciu tego skryptu Python . Dla każdego przypadku testowego podana jest tylko jedna z dwóch poprawnych odpowiedzi; druga to wszystkie cztery wartości zanegowane.
Kryterium punktacji i wygranej
Obowiązują standardowe zasady gry w golfa . Najkrótszy program lub funkcja w bajtach w każdym języku wygrywa.
źródło
a, (b, c, d)
?a,[b,[c,[d]]]
jest w porządku, jeśli można w ten sposób zaoszczędzić bajty :)Odpowiedzi:
APL (NARS) , 2 bajty
√
NARS ma wbudowane wsparcie dla czwartorzędów. ¯ \ _ (⍨) _ / ¯
źródło
¯\_(⍨)√¯
Python 2 , 72 bajty
Wypróbuj online!
Mniej więcej surowa formuła. Pomyślałem, że mógłbym użyć pętli ze zrozumieniem listy
b,c,d
, ale wydaje się, że jest ona dłuższa. Pythonowi naprawdę przeszkadza brak operacji wektorowych, w szczególności skalowanie i norma.Python 3 , 77 bajtów
Wypróbuj online!
Bezpośrednie rozwiązanie kwadratu było również krótsze niż użycie pierwiastka kwadratowego w Pythonie do rozwiązania go, tak jak w opisie problemu.
źródło
(s*s).sum()**.5
.Wolfram Language (Mathematica) , 19 bajtów
Wypróbuj online!
Mathematica ma również wbudowane Quaternion, ale jest bardziej gadatliwa.
Chociaż wbudowane wyglądają fajnie, rób upvote rozwiązania, które również nie używają wbudowanych! Nie chcę, aby głosy na pytania do HNQ były wypaczone.
źródło
JavaScript (ES7),
5553 bajtówOparty na bezpośredniej formule stosowanej przez xnor .
Pobiera dane wejściowe jako tablicę.
Wypróbuj online!
W jaki sposób?
I zwraca:
źródło
Haskell , 51 bajtów
Wypróbuj online!
Formuła bezpośrednia. Główna sztuczka polegająca na wyrażeniu rzeczywistej części wyniku jako
r/sqrt(r*2)
równoległej do wyimaginowanej wyrażenia części, która pozwala zaoszczędzić kilka bajtów:54 bajty
Wypróbuj online!
źródło
Węgiel drzewny , 32 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Port odpowiedzi na Python @ xnor. Wyjaśnienie:
Rzuć wartości na ciąg i niejawnie wydrukuj.
źródło
Java 8, 84 bajtów
Port odpowiedzi @xnor na Python 2 .
Wypróbuj online.
Wyjaśnienie:
źródło
05AB1E , 14 bajtów
Port odpowiedzi @xnor na Python 2 .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Wolfram Language (Mathematica) , 28 bajtów
Port odpowiedzi @ xnor na Python 2 .
Wypróbuj online!
źródło
C # .NET, 88 bajtów
Port mojej odpowiedzi w Javie 8 , ale zwraca Tuple zamiast String. Myślałem, że byłoby to krótsze, ale niestety
Math.Sqrt
wymagaSystem
-importu w C # .NET, kończąc na 4 bajtach dłuższych zamiast 10 bajtach krótszych ..>.>Deklaracja lambda wygląda jednak dość zabawnie:
Wypróbuj online.
źródło
Perl 6 , 49 bajtów
Wypróbuj online!
Funkcja Curried przyjmuje dane wejściowe jako
f(b,c,d)(a)
. Zwraca kwaternion jakoa,(b,c,d)
.Wyjaśnienie
źródło