C'est un défi inspiré par la rotation de Chebyshev . Je suggère de chercher des réponses pour trouver l'inspiration pour ce défi.
Étant donné un point sur le plan, il existe un carré unique (un rectangle à côtés égaux) qui est centré sur l'origine et coupe ce point ( démo interactive ):
Étant donné un point p et une distance d , renvoyez le point obtenu en déplaçant la distance d de p , dans le sens inverse des aiguilles d'une montre (et dans le sens des aiguilles d'une montre pour d négatif ), le long du périmètre du carré centré sur l'origine qui coupe p . Votre réponse doit être précise à au moins 4 chiffres décimaux.
Testcases:
(0, 0), 100 -> (0, 0)
(1, 1), 81.42 -> (-0.4200, 1.0000)
(42.234, 234.12), 2303.34 -> (-234.1200, 80.0940)
(-23, -39.234), -234.3 -> (39.2340, -21.8960)
Les cas de test suivants sont issus du défi original de Martin Ender, et tous sont avec d = 1 :
(0, 0) -> (0, 0)
(1, 0) -> (1, 1)
(1, 1) -> (0, 1)
(0, 1) -> (-1, 1)
(-1, 1) -> (-1, 0)
(-1, 0) -> (-1, -1)
(-1, -1) -> (0, -1)
(0, -1) -> (1, -1)
(1, -1) -> (1, 0)
(95, -12) -> (95, -11)
(127, 127) -> (126, 127)
(-2, 101) -> (-3, 101)
(-65, 65) -> (-65, 64)
(-127, 42) -> (-127, 41)
(-9, -9) -> (-8, -9)
(126, -127) -> (127, -127)
(105, -105) -> (105, -104)
Réponses:
Python 2,
363335296266262258256233 octetsWoo, 130 octets perdus! Merci à Neil pour avoir sauvé 4 octets, Nathan Merrill pour avoir sauvé 2 octets et xnor pour avoir sauvé 23 octets ridicules!
L'idée générale est la suivante: on peut réduire la distance parcourue en prenant son module contre le périmètre du carré. Le périmètre est défini comme 8 fois la plus grande des deux coordonnées, car le point doit reposer dessus. Ensuite, une fois le module pris, nous sommes garantis de ne pas avoir de chevauchement. Cela garantit également que nous ne devons jamais bouger dans le sens antihoraire, car le module donne un résultat positif.
À partir de là, j'utilise simplement ce que nous savons des coordonnées x et y données pour déterminer où nous sommes: en haut, en bas, à gauche, à droite ou dans un coin, et déterminer la direction, qui peut être l'une des suivantes
0, 1, 2, 3
:Après cela, c'est aussi simple que de boucler pendant que nous avons encore de la distance à parcourir, et en fonction de la direction que nous soustrayons ou ajoutons aux coordonnées appropriées, et indiquons à la boucle dans quelle direction nous allons.
Bien que cela soit assez long, cela fonctionne certainement. Voici quelques exemples d'E / S:
Essayez-le en ligne ou exécutez des cas de test .
la source
s=max(x,y,-x,-y)
marche?(s>0)*(d>0)
ests>0<d
. La sortie peut être"%.4f "*2%tuple(p)
.if s:d=d%(8*s)
peut êtred%(s*8or 1)
.(r+1)
peut être~-r
.1*(x>-s)
peut être juste(x>-s)
.abs(y)==abs(x)
peut êtrey*y==x*x
(x>-s)
n'avaient pas besoin des parenthèses et des~-r
diminutions, alors j'ai utilisé-~r
.JavaScript (ES6), 147 octets
Explication: fonctionne en essayant d'ajouter le vecteur de direction tout en restant dans les limites du carré. Tout dépassement est récursivement renvoyé avec la direction tournée dans le sens antihoraire de 90 °. La direction est réellement encodée en utilisant un drapeau vertical
v
et une unité dew
sorte que les vecteurs (1, 0), (0, 1), (-1, 0) et (0, -1) soient encodés avecv
de 0, 1, 0 , 1 etw
de 1, 1, -1, -1 respectivement. Le vecteur de direction peut ne pas pointer initialement dans une direction appropriée mais il ne pointe jamais vers l'arrière, il finira par tourner dans une direction utilisable.la source
f(42.234, 234.12, 2303.34) -> [-234.12, 80.09399999999988]
ce qui signifie qu'il n'a pas une précision de 4 chiffres. Peut-être que l'ajout d'un formatage de sortie pourrait résoudre ce problème? Belle réponse cependant! :)