Kurze Erklärung des Problems
Schreiben Sie ein Programm, um den Mindestabstand zwischen zwei Punkten zu ermitteln, die sich nur auf Strahlen aus dem Ursprung und auf Kreisen ausrichten, die auf dem Ursprung zentriert sind.
Erklärung der Prämisse
Stellen wir uns nun vor, wir sind in einem Flugzeug, und in diesem Flugzeug dürfen wir nur auf besondere Weise reisen. Wir dürfen mit jedem Strahl reisen, der vom Ursprung ausgeht.
Wir können auch auf jedem Kreis fahren, der in der Mitte eines Kreises liegt
Jetzt ist es unser Ziel, von einem Punkt in diesem Flugzeug zum anderen zu reisen. Wir können jedoch nicht einfach auf einem einfachen euklidischen Pfad wandern, sondern nur, wenn die Punkte zufällig auf einen Strahl fallen, der vom Zentrum ausgeht.
Wir können mit diesem reisen, weil es auf einen unserer Strahlen fällt.
Wir können auch auf Kreisen fahren, die am Ursprung zentriert sind.
Beispiele
Hier ist die Herausforderung:
Wir müssen auf dem kürzesten Weg von einem Punkt zum anderen gelangen. Oft ist dies eine Kombination aus Reisen auf Kreisen und Strahlen.
Dies könnte jedoch auch auf zwei Strahlen erfolgen.
Manchmal gibt es zwei Pfade, die die Mindestentfernung zurücklegen.
Problem
Ihre Herausforderung besteht darin, ein Programm zu schreiben, das bei zwei gegebenen Punkten den Mindestabstand zwischen ihnen ergibt, wenn wir diese Regeln einhalten. Die Eingaben können entweder in rechteckiger oder in polarer Form erfolgen, und die Ausgabe sollte eine Zahl sein, der Abstand zwischen ihnen.
Testfälle
(mit rechteckigem Eingang)
(1,1) (1,-1) -> ~ 2.22144
(0,0) (1, 1) -> ~ 1.41421
(1,0) (-0.4161 , 0.90929) -> ~ 2
(1,1) (1, 0) -> ~ 1.19961
(1,2) (3, 4) -> ~ 3.16609
quelle
Antworten:
Haskell,
4948 BytesVerwendung:
Vielen Dank an @Zgarb für das Speichern eines Bytes
quelle
(a!q)c r
anstelle von definierend a q c r
.JavaScript (ES6), 65 Byte
Nimmt Polarkoordinaten. Verwendet den @Angs-Trick, um einen Winkel zwischen 0 und π zu reduzieren. Für rechteckige Koordinaten funktioniert so etwas:
quelle
MATL , 22 Bytes
Die Eingabe ist ein Array von zwei komplexen Zahlen.
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Ruby, 64 Bytes
Erstens meine Vorlage. Lambda-Funktion mit Argumenten
distance 1, angle 1, distance 2, angle2
.Hier sind zwei verschiedene Lösungen mit 66 Bytes (ohne Zuweisung
f=
), gefolgt von meiner tatsächlichen Einreichung mit 64 Bytes.Die Einreichung basiert auf Lösung 2, verwendet jedoch identity
(s-r).abs
=s+r-[s,r].min*2
, um den Code um 2 Bytes zu kürzen, daher das-2
Wort in Klammern.Das andere bemerkenswerte Merkmal ist der Ausdruck
?i.to_c.arg*4
= 2 * PI ohne Verwendunginclude Math
. Wenn eine geringere Genauigkeit akzeptabel ist, kann diese durch ein Literal ersetzt werden.Lösung 2 im Testprogramm kommentiert
Ausgabe
quelle
Mathematica 66 Bytes
Dies nimmt rechteckige Koordinaten und kann eine exakte symbolische Lösung ausgeben
Verwendung:
ergibt:
N @% ergibt:
{2.221441469, 1.414213562, 1.999934259, 1.199611726, 3.166096674}
quelle
Python 2,
164126125132 Bytes:Ich beschäftige mich momentan jedoch mehr mit Golfspielen. Akzeptiert Polarkoordinaten. Sollte im Format aufgerufen werden
A(r1,θ1,r2,θ2)
. Gibt einen Gleitkommawert mit einer Genauigkeit von bis zu12
signifikanten Zahlen aus.Probieren Sie es online! (Ideone)
Eine einfache, unkomplizierte Implementierung, die den Mindestwert aus einem Array von höchstens 3 Werten berechnet und an STDOUT ausgibt, das Folgendes enthält:
r1+r2
) oder der Länge des Bogens, der die beiden Punkte verbindet, wennfr1==r2
;abs(r1-r2)
) iffθ1==θ2
(dh die beiden Punkte sind kollinear);''
), wie anscheinend in Python, größer als eine ganze Zahl.quelle
math.pi
?Wolfram-Sprache (Mathematica) , 47 Bytes
Probieren Sie es online!
(übertrifft die aktuelle 66-Byte-Antwort)
Nimm die Eingabe als 2 komplexe Zahlen.
Kann einige Probleme haben, wenn die Eingabe symbolisch ist. (zB
Cos@2 + I Sin@2
)quelle