Brève explication du problème
Écrivez un programme pour trouver la distance minimale entre deux points se déplaçant uniquement sur des rayons émanant de l'origine et des cercles centrés sur l'origine.
Explication de la prémisse
Imaginons maintenant que nous soyons dans un avion, et sur cet avion, nous ne sommes autorisés à voyager que de manière spéciale. Nous sommes autorisés à voyager sur n'importe quel rayon émanant de l'origine.
Nous pouvons également voyager sur n'importe quel cercle centré sur un cercle
Maintenant, notre objectif est de voyager d'un point sur cet avion à un autre. Cependant, nous ne pouvons pas simplement voyager dans un simple chemin euclidien, nous ne pouvons le faire que si les points tombent sur un rayon émanant du centre.
Nous pouvons voyager sur celui-ci car il tombe sur l'un de nos rayons.
On peut aussi voyager sur des cercles centrés à l'origine.
Exemples
Voici maintenant le défi:
Nous devons aller d'un point à un autre sur le chemin le plus court; c'est souvent une combinaison de voyages sur des cercles et des rayons.
Cependant, il pourrait également se déplacer sur deux rayons.
Parfois, il existe deux chemins qui parcourent la distance minimale.
Problème
Votre défi est d'écrire un programme qui, lorsque deux points vous seront donnés, nous donnera la distance minimale entre eux si nous suivons ces règles. Les entrées peuvent être données sous forme rectangulaire ou polaire et la sortie doit être un nombre, la distance entre les deux.
Cas de test
(avec entrée rectangulaire)
(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
la source
Réponses:
Haskell,
4948 octetsUsage:
Merci à @Zgarb d'avoir enregistré un octet
la source
(a!q)c r
au lieu ded a q c r
.JavaScript (ES6), 65 octets
Prend des coordonnées polaires. Utilise l'astuce @Angs pour réduire un angle entre 0 et π. Pour les coordonnées rectangulaires, quelque chose comme ceci fonctionne:
la source
MATL , 22 octets
L'entrée est un tableau de deux nombres complexes.
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
Ruby, 64 octets
Tout d'abord, ma soumission. Fonction lambda avec arguments
distance 1, angle 1, distance 2, angle2
.Voici maintenant deux solutions différentes de 66 octets (hors affectation
f=
) suivies de ma soumission réelle à nouveau à 64 octets.La soumission est basée sur la solution 2, mais utilise l'identité
(s-r).abs
=s+r-[s,r].min*2
pour raccourcir le code de 2 octets, d'où l'-2
intérieur des crochets.L'autre caractéristique notable est l'expression
?i.to_c.arg*4
= 2 * PI sans utiliserinclude Math
. Si une précision inférieure est acceptable, elle peut être remplacée par un littéral.Solution 2 commentée dans le programme de test
Sortie
la source
Mathematica 66 octets
Cela prend des coordonnées rectangulaires et peut produire une solution symbolique exacte
Usage:
rendements:
N @% rendements:
{2.221441469, 1.414213562, 1.999934259, 1.199611726, 3.166096674}
la source
Python 2,
164126125 125132 octets:Je cherche actuellement à jouer au golf plus, cependant. Accepte les coordonnées polaires. Doit être appelé dans le format
A(r1,θ1,r2,θ2)
. Produit une valeur en virgule flottante précise jusqu'à12
des chiffres significatifs.Essayez-le en ligne! (Ideone)
Une implémentation simple et directe qui calcule et renvoie à STDOUT la valeur minimale à partir d'un tableau d'au plus 3 valeurs contenant:
r1+r2
) ou de la longueur de l'arc reliant les deux points ssir1==r2
;abs(r1-r2)
) ssiθ1==θ2
(c'est-à-dire que les deux points sont colinéaires);''
) comme apparemment en Python une chaîne est supérieure à n'importe quel entier;la source
math.pi
?Wolfram Language (Mathematica) , 47 octets
Essayez-le en ligne!
(bat la réponse actuelle de 66 octets)
Prenez l'entrée comme 2 nombres complexes.
Peut avoir quelques problèmes si l'entrée est symbolique. (par exemple,
Cos@2 + I Sin@2
)la source