Das Kreuzprodukt zweier dreidimensionaler Vektoren und ist der eindeutige Vektor so dass:
ist orthogonal zu und
Die Größe von ist gleich der Fläche des durch und → b gebildeten Parallelogramms
Die Richtungen von , und folgen in dieser Reihenfolge der Rechtsregel .
Es gibt einige äquivalente Formeln für Kreuzprodukte, aber eine lautet wie folgt:
Dabei sind , und die Einheitsvektoren in der ersten, zweiten und dritten Dimension.
Herausforderung
Schreiben Sie mit zwei 3D-Vektoren ein vollständiges Programm oder eine Funktion, um das Kreuzprodukt zu finden. Builtins, die spezifisch das Kreuzprodukt berechnen, sind nicht zulässig.
Eingang
Zwei Arrays mit jeweils drei reellen Zahlen. Wenn Ihre Sprache keine Arrays enthält, müssen die Zahlen immer noch in drei Gruppen eingeteilt werden. Beide Vektoren haben eine Größe . Beachten Sie, dass das Kreuzprodukt nicht kommutativ ist ( ), sodass Sie eine Möglichkeit haben sollten, die Reihenfolge anzugeben.
Ausgabe
Ihr Kreuzprodukt in einem vernünftigen Format, wobei jede Komponente auf vier signifikante Zahlen oder genau ist , je nachdem, welcher Wert niedriger ist. Die wissenschaftliche Notation ist optional.
Testfälle
[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]
Das ist Code-Golf , also gewinnt die kürzeste Lösung in Bytes.
Maltysen postete eine ähnliche Herausforderung , aber die Antwort war schlecht und die Frage wurde nicht bearbeitet.
quelle
Antworten:
Jelly,
141312 BytesProbieren Sie es online!
Wie es funktioniert
Nicht konkurrierende Version (10 Bytes)
OK, das ist peinlich, aber in der Array-Manipulationssprache Jelly war bis jetzt noch keine Funktion für die Array-Rotation integriert. Mit dieser neuen Funktion können zwei zusätzliche Bytes eingespart werden.
Dies verwendet den Ansatz aus der Antwort von @ AlexA . Probieren Sie es online!
Wie es funktioniert
quelle
LISP,
128122 BytesHallo! Das ist mein Code:
Ich weiß, dass es nicht die kürzeste Lösung ist, aber bisher hat noch niemand in Lisp eine bereitgestellt :)
Kopieren Sie den folgenden Code und fügen Sie ihn hier ein , um es zu versuchen!
quelle
Dyalog APL, 12 Bytes
Basierend auf der Antwort von @ AlexA. Und (zufällig) der Verbesserung von @ randomra im Kommentarbereich dieser Antwort.
Probieren Sie es online auf TryAPL aus .
Wie es funktioniert
quelle
J,
27-14BytesDies ist ein dyadisches Verb, das Arrays links und rechts akzeptiert und deren Kreuzprodukt zurückgibt.
Erläuterung:
Beispiel:
Probieren Sie es hier aus
13 Bytes dank randomra eingespart!
quelle
*2&|.
besteht aus zwei Verben:*
und2&|.
. Es multipliziert die linke Eingabe mit einer um 2 gedrehten rechten Eingabe. Diese Verzweigung ist in gespeichert,v
so dass sie beim Schreibenv~
gleichbedeutend(*2&|.)~
ist mit dem~
Vertauschen der linken und rechten Eingabeparameter für den in Klammern gesetzten Teil.C
156154150148144 BytesIch werde keine Preise für die Länge gewinnen, dachte aber, ich würde es trotzdem versuchen.
Demo
Ungolfed:
quelle
for
muss nicht{}
Haskell, 41 Bytes
Eine einfache Lösung.
quelle
Bash + Coreutils, 51
bc
führt die arithmetische Auswertung mit der erforderlichen Genauigkeit durch.Die Eingabe erfolgt als zwei durch Kommas getrennte Listen in der Befehlszeile. Ausgabe als Zeilenumbruch:
quelle
MATL , 17 Bytes
Der erste Eingang ist a , der zweite ist b .
Probieren Sie es online!
Erläuterung
quelle
Pyth, 16 Bytes
Probieren Sie es online aus: Demonstration
Erläuterung:
quelle
K5,
44403732 BytesSchrieb dieses vor einiger Zeit und wischte es vor kurzem wieder ab .
In Aktion:
Bearbeiten 1:
4 Bytes durch Eingabe als Liste von Listen anstelle von zwei separaten Argumenten gespeichert:
Bearbeiten 2:
3 Bytes durch Berechnung einer Nachschlagetabelle mit Basisdecodierung eingespart:
Edit 3:
Sparen Sie 5 Byte, indem Sie die Anwendung neu anordnen, um die Verwendung einer impliziten Definition anstelle eines lokalen Lambda zuzulassen. Leider funktioniert diese Lösung in OK nicht mehr und erfordert den offiziellen k5-Interpreter. Ich muss mein Wort für dieses nehmen, bis ich den Fehler in OK behebe:
quelle
Ruby, 49 bytes
Try it online!
Returning after 2 years, I shaved off 12 bytes by using how Ruby treats negative array indices.
-1
is the last element of the array,-2
the second last etc.Ruby, 57
In test program
quelle
Python,
7348 bytesThanks @FryAmTheEggman
This is based on the component definition of the vector cross product.
Try it here
quelle
lambda (a,b,c),(d,e,f):...
should save a lot.Jelly, 5 bytes
Takes input in the form[[x1,x2],[y1,y2],[z1,z2]] . If you want them to be two lists of x-y-z coordinates, just prepend
Z
to the beginning of the program.Try it online!
Here is a PDF explanation in case SE markdown can't handle it.
The cross-product in analytic form
Let(x1,y1,z1) be the coordinates of v1→ and (x2,y2,z2) be the coordinates of v2→ . Their analytic expressions are as follows:
The only thing left to do now is to also write their cross-product in terms of its coordinates in theOxyz space.
Keeping in mind that:i⃗ ×j⃗ =k⃗ ,i⃗ ×k⃗ =−j⃗ ,j⃗ ×i⃗ =−k⃗ ,j⃗ ×k⃗ =i⃗ ,k⃗ ×i⃗ =j⃗ ,k⃗ ×j⃗ =−i⃗
After the necessary rearrangements and calculations:
The close relationship with matrix determinants
There's an interesting thing to note here:
Where we use the notation|⋅| for matrix determinant. Notice the beautiful rotational symmetry?
Jelly code explanation
Well... not much to explain here. It just generates the matrix:
And for each pair of neighbouring matrices, it computes the determinant of the matrix formed by joining the two.
quelle
Wolfram Language (Mathematica),
3833 bytesTry it online!
quelle
ES6, 40 bytes
44 bytes if the input needs to be two arrays:
52 bytes for a more interesting version:
quelle
Julia 0.7,
4539 bytesTry it online!
Uses the determinant-based formula given in the task description.
Thanks to H.PWiz for -6 bytes.
quelle
f(a,b)=1:3 .|>i->det([eye(3)[i,:] a b])
APL(NARS), 23 chars, 46 bytes
test:
quelle
Pari/GP, 41 bytes
Try it online!
quelle