Considérons une grille régulière, où chaque cellule a des coordonnées entières. Nous pouvons regrouper les cellules en "anneaux" (de forme carrée) où les cellules de chaque anneau ont la même distance de Chebyshev (ou distance de l'échiquier) par rapport à l'origine. Votre tâche consiste à prendre une telle coordonnée de cellule et à la faire pivoter d’une position dans le sens contraire des aiguilles d’une montre dans son anneau. Cela implémente le mappage suivant:
Ainsi, par exemple, si l'entrée est, (3, -2)
vous devez afficher (3, -1)
. Notez que (0, 0)
c'est la seule entrée qui devrait correspondre à elle-même.
Règles
Le format I / O est assez flexible. Vous pouvez utiliser deux nombres individuels, une paire / liste / tableau / tuple de nombres, un seul nombre complexe, une chaîne contenant deux nombres, etc.
Vous pouvez supposer que -128 < x,y < 128
.
Vous pouvez écrire un programme ou une fonction et utiliser l’une quelconque de nos méthodes standard de réception d’entrée et de sortie.
Vous pouvez utiliser n'importe quel langage de programmation , mais notez que ces failles sont interdites par défaut.
C'est du code-golf , donc la réponse valide la plus courte - mesurée en octets - est gagnante.
Cas de test
(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:
JavaScript (ES6),
6059 octetsPrend les entrées avec la syntaxe de currying
(x)(y)
et retourne un tableau[new_x, new_y]
.Comment ça marche
Notre tâche principale est de déterminer dans quel quadrant nous sommes, afin de savoir dans quelle direction nous déplacer.
Nous pouvons utiliser cette formule en première approximation:
Voici ce que nous obtenons:
Presque là. Mais les coins inférieur gauche et inférieur droit des anneaux ne sont pas valides. Nous devons déplacer la moitié inférieure de la matrice d'une position vers la gauche, nous définissons donc
z
:Et nous remplaçons
x
parz
dans notre formule:Qui conduit à:
Toute la matrice est maintenant correcte, sauf le cas particulier
[0, 0]
(pas de déménagement du tout) qui doit être traité séparément.Cas de test
Afficher l'extrait de code
la source
Jelly ,
201412 octetsL'entrée et la sortie sont sous forme de tableaux. Essayez-le en ligne! ou vérifier tous les cas de test .
Contexte
Pour déterminer dans quelle direction nous devons nous déplacer, nous pouvons observer la position relative du point de départ par rapport aux bissectrices du quadrant x + y = 0 (bleu) et x - y = 0 (rouge).
L'origine est fixée. Nous avançons en ajoutant [0, 0] au point de départ.
Les points dans le triangle le plus haut - y compris la bissectrice du premier quadrant - ont une somme positive et un delta non négatif ( y - x ). Nous avançons en ajoutant [-1, 0] au point de départ.
Les points dans le triangle le plus à gauche - y compris la bissectrice du deuxième quadrant - ont une somme non positive et un delta positif. Nous avançons en ajoutant [0, -1] au point de départ.
Les points dans le triangle le plus bas - y compris la bissectrice du troisième quadrant - ont une somme négative et un delta non positif. Nous avançons en ajoutant [1, 0] au point de départ.
Les points dans le triangle le plus à droite - y compris la bissectrice du quatrième quadrant - ont une somme non négative et un delta négatif. Nous avançons en ajoutant [0, 1] au point de départ.
Pour déterminer la bonne direction, nous calculons [-sign (x + y), -sign (y - x)] , qui n'a que neuf résultats possibles.
Le tableau suivant montre quels résultats doivent être associés à quelles directions.
Cela laisse trois cas.
Si au moins un des signes est 0 , [Δx, Δy] = [-sign (x + y), -sign (yx)] .
Si les signes sont égaux et non nuls, [Δx, Δy] = [-sign (x + y), 0] .
Si les signes sont différents et non nuls, [Δx, Δy] = [0, -sign (yx)] .
Comment ça marche
la source
Pyth , 19 octets
Essayez-le en ligne!
Traduction de ma réponse Julia :
la source
Python, 55 octets
Détecte les quatre quadrants diagonaux et décale la coordonnée appropriée.
la source
Haskell,
777169 octetsCela consiste simplement à vérifier chacun de ces quadrants inclinés et à modifier l'entrée en conséquence. Notez que les espaces sont nécessaires, sinon, par exemple,
>-
serait compris comme un opérateur (non défini).Merci @nimi d'avoir supprimé quelques octets de plus!
la source
,
au lieu de&&
dans la première garde enregistre un octet. Ensuite, vous pouvez basculer la deuxième comparaison sur-x<y
un autre octet.,
!Ruby, 68 ans
La fonction Lambda prend un nombre complexe en argument, renvoie un nombre complexe.
Nous faisons pivoter le point de 90 degrés 4 fois en le multipliant par
i
. Il passe donc par les 4 quadrants et sera renvoyé sous forme inchangée, à l'exception du fait que nous le modifions lorsqu'il se trouve dans l'un d'eux. Le fait qu'il soit toujours modifié dans le même quadrant simplifie la modification.Il est plus facile de suivre si nous le modifions
z
quand il se trouve dans le quadrant de droite. dans ce cas, nous devons augmenter la coordonnée y de 1 (c'est-i
à- dire ajouter àz
.)Nous vérifions
x.abs>=y.abs
en comparant les carrés dex
ety
. Cela nous indique que le point est dans le quadrant droit ou gauche, et non en haut ou en bas. Pour vérifier que cela se trouve en fait dans le quadrant de droite, nous vérifions également quex>y
(strictement plus important car nous voulons exclure le casx=y
qui appartient au quadrant "supérieur"). Nous ajoutonsi
à cela lorsque cela est vraiz
.Pour des raisons de golf, l'ajout
i
n'est pas souhaitable. Au lieu de cela, nous modifions le nombre lorsqu'il se trouve dans le quadrant inférieur, auquel cas nous devons ajouter 1 à lax
coordonnée (ajouter 1 àz
.) Dans ce cas, nous testons le faity*y>=x*x
de vérifier qu'il se trouve bien dans le quadrant supérieur ou inférieur. Pour nous assurer qu'il se trouve bien dans le quadrant inférieur, nous devons vérifiery<-x
(en excluant strictement le cas du coin inférieur droit oùy=-x
.)Un avantage de cette vérification est qu'il n'y a pas de cas particulier pour la coordonnée 0,0. Malheureusement, il a été constaté que déplacer le point peut le déplacer dans un quadrant différent, ce qui signifie qu'un deuxième mouvement doit être supprimé si ce quadrant est à nouveau vérifié, ce qui annule probablement l'avantage.
Exemple 1
Exemple 2
Dans le programme de test
Diagramme
L'image suivante montre (en bleu) la zone où
x*x>=y*y
, (en jaune) la zone oùy<-x
et (en vert) leur intersection, c'est-à-dire la région où la transformation correcte est l'ajout de 1 àz
.la source
Python, 52 octets
Entrées et sorties complexes. Pour tester le point situé dans le quadrant inférieur de la diagonale, faites-le d'abord pivoter dans le sens inverse des aiguilles d'une montre pour le déplacer dans le quadrant standard (x> 0, y> 0), puis testez si le résultat ne contient pas de signe moins dans la représentation sous forme de chaîne. Soustraire 1 en premier tient compte de la condition limite.
Si ce n’est pas dans ce quadrant, faites pivoter l’ensemble du problème de 90 degrés. L'entrée est zéro est spécialement gérée pour sortir elle-même.
Autres tentatives avec des nombres complexes:
la source
Mathematica, 34 octets
Ceci définit un opérateur unaire
±
qui prend et retourne un nombre complexe dont les composantes représententx
ety
.Maintenant que Lynn a révélé la solution de numérotation complexe et que Dennis a battu mon score, je ne me sens pas si mal pour avoir posté ma mise en œuvre référencée au golf. :) (Il s'avère être pratiquement identique à la réponse de Lynn.)
la source
MATL ,
1917 octetsCeci utilise des nombres complexes en entrée et en sortie.
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Prenons l'entrée
-127+42j
comme exemple.la source
Ruby, 51 octets
Forme originale
Forme alternative pour le commentaire de Xnor
Utilise le même type d'inégalités que mon autre réponse, mais d'une manière différente.
Dans le programme de test
la source
d
mission en vaut-elle la peine? On dirait que vous pouvez simplement comparerx*x>y*y
.y*y
et a?
donc exactement la même longueur. Je l'ai inclus car je pense que votre façon de faire est, à certains égards, plus ordonnée. Je pense que Ruby essaie de passer cela commey?
un nom de fonction légal.Julia,
3834 octetsDennis a sauvé quatre octets. Merci!
Essayez-le en ligne!
la source
int(2angle(z)/pi+5)
le même nombre d'octets (les puissances négatives provoquent une erreur pour une raison quelconque).!z=z+(z!=0)im^...
dans toutes les versions.C ++, 94 octets
Ungolfed:
Usage:
Essayez-le en ligne
la source
(x>0?x:-(x))
peut l'être(x>0?x:-x)
.R,
131110 octetsUne fonction qui prend les deux entiers,
x,y
en entrée et écrit la sortie sur stdout. La solution suit le schéma de contrôle de @Dennis mais pourrait probablement être jouée au golf.EDIT: code mis à jour basé sur les suggestions de @ JDL et sauvegardé de nombreux octets.
Ungolfed
la source
as.logical(-1)
estTRUE
,X==0|Y==0
peut donc devenir!X|!Y
et la conditionif(X!=Y...)
peut devenirif(X-Y)
. Aussi, siX==Y
etX!=0
ensuiteY!=0
est redondant. En fait, toutes les!=0
parties sont redondantes.if(X!=0)
est équivalent àif(X)
.c(x,y)
lieu decat(x,y)
.JavaScript (ES6), 57 octets (55–63 †)
Accepte un tableau [x, y], le modifie sur place et le renvoie.
Comment ça marche
Il s’agit d’une fonction fléchée à un seul paramètre avec un
return
corps concis sans-frais.Le paramètre est immédiatement déstructuré en
x
ety
variables.L'opérateur de virgule combine plusieurs expressions en une, en utilisant le résultat de la dernière.
i
est utilisé pour différencier les cas d'incrémentation et de décrémentation. Quandx
est supérieur ày
, nous nous situons dans le quadrant inférieur ou le quadrant inférieur droit et devons avancer dans une dimension (i=1
par la contrainte booléenne au nombre). De même lorsque nous sommes sur la partie négative de la diagonale x = y en division . Dans tous les autres cas, y compris l'origine, aucune augmentation n'est requise (i=0
).Nous utilisons une expression assez similaire pour contrôler l’index de tableau à ajuster. Lorsque nous incrémentons et non dans les quadrants de gauche ou du bas (ou lorsque nous n'incrémentons pas et dans le gauche ou le bas), le XOR au niveau du bit produira
1
et nous ajusterons la valeur y . De même pour quand nous sommes sur la division x = -y diagonale (y compris l'origine). Dans tous les autres cas, l'indice sera0
( x ).Quand
i
est1
-ce que nous allons l'ajouter à la valeur spécifiée. Quandi
est0
, nous soustrayons 1 de la valeur si et seulement si nous ne sommes pas à l'origine. Ce dernier est détecté enx|y
renvoyant non nul, découpé en {0, 1} par une contrainte booléenne, et la négation dei
nous permet d'utiliser un bit OU au lieu de logique (puisqu'il-1
n'a pas de bit zéro, il est protégé contre la modification).Le tableau est le dernier, il sera donc retourné.
Essai
Afficher l'extrait de code
† Variations
Nous pouvons économiser deux octets supplémentaires en ignorant une valeur de retour significative et en utilisant uniquement la mutation d'entrée:
… Ou nous pouvons ignorer la mutation d'entrée et rendre toutes les variables locales pour une fonction pure, au prix de six octets:
la source
JavaScript (ES6),
8076 octetsla source
Haskell, 53 octets
Prend deux nombres, sort un tuple. Si le point est dans la section est
-x<=y<x
, augmentez la seconde coordonnée de 1. Sinon, faites défiler les quadrants en faisant pivoter le point d’entrée de 90 degrés, en appelant la fonction dessus, puis en revenant en arrière.la source
Raquette 191 octets
Ungolfed (traduction directe des instructions de la figure en code sans utiliser de formule intermédiaire):
Essai:
Sortie:
la source
En fait , 16 octets
Ceci prend un nombre complexe en entrée et génère un autre nombre complexe. Suggestions de golf bienvenues! Essayez-le en ligne!
Ungolfing
la source
Scala, 184 octets
Ungolfed:
Explication:
la source