Si nous prenons les nombres naturels et les enroulons dans le sens antihoraire dans une spirale, nous nous retrouvons avec la spirale infinie suivante:
....--57--56
|
36--35--34--33--32--31--30 55
| | |
37 16--15--14--13--12 29 54
| | | | |
38 17 4---3---2 11 28 53
| | | | | | |
39 18 5 0---1 10 27 52
| | | | | |
40 19 6---7---8---9 26 51
| | | |
41 20--21--22--23--24--25 50
| |
42--43--44--45--46--47--48--49
Étant donné un certain nombre dans cette spirale, votre tâche consiste à déterminer ses voisins - c'est-à-dire l'élément au-dessus, à gauche, à droite et en dessous.
Exemple
Si nous regardons, 27
nous pouvons voir qu'il a les voisins suivants:
- au dessus:
28
- la gauche:
10
- droite:
52
- au dessous de:
26
La sortie serait donc: [28,10,52,26]
Règles
- L'entrée sera un nombre dans n'importe quel format d'E / S par défaut
- La sortie sera une liste / matrice / .. des 4 voisins de ce nombre dans n'importe quel ordre (cohérent!)
- Vous pouvez travailler avec une spirale qui commence par 1 au lieu de 0, mais vous devez spécifier cela dans votre réponse
Exemples
La sortie est au format [above,left,right,below]
et utilise une spirale basée sur 0:
0 -> [3,5,1,7]
1 -> [2,0,10,8]
2 -> [13,3,11,1]
3 -> [14,4,2,0]
6 -> [5,19,7,21]
16 -> [35,37,15,17]
25 -> [26,24,50,48]
27 -> [28,10,52,26]
73 -> [42,72,74,112]
101 -> [100,146,64,102]
2000 -> [1825,1999,2001,2183]
1000000 -> [1004003,1004005,999999,1000001]
Réponses:
R , 156 octets
Essayez-le en ligne!
round
et d'utilisationcospi(x)/sinpi(x)
qui sont plus précis qu'encos(x*pi)/sin(x*pi)
cas de demi-nombres (0.5
,1.5
etc ...)Explication:
Si nous regardons les coordonnées matricielles des valeurs, en considérant la première valeur
0
placée àx=0, y=0
, elles sont:Les
x
coordonnées suivent la séquence OEIS A174344 avec la formule récursive:La même formule s'applique aux
y
coordonnées de la matrice, mais aveccos
au lieu desin
et inversé:Donc, dans R, nous pouvons traduire la formule en cette fonction, en prenant
sinpi/cospi
comme paramètre:et nous générons les deux vecteurs de coordonnées (nous ne nions pas les coordonnées y car nous obtiendrons le même résultat, juste avec les voisins haut / bas inversés):
Notez que nous avons généré des
(n+2)^2
coordonnées, qui sont plus que les coordonnées minimales nécessaires contenant à la foisn
et leurs voisins (une limite plus serrée serait(floor(sqrt(n))+2)^2
mais malheureusement moins "golfique").Par conséquent, maintenant que nous avons toutes les coordonnées, nous recherchons d'abord les coordonnées
a,b
correspondant à notren
:enfin nous sélectionnons les positions de leurs voisins, à savoir:
where x == a and y == b+1 or b-1
where y == b and x == a+1 or a-1
en utilisant :
la source
Perl 6 ,
9483 octets{my \ s = 0, | [+] flat ((1, i ... ) Zxx flat (1..Inf Z 1..Inf)); map {first: k, s [$ _] + $ ^ d, s}, i, -1,1, -i}Essayez-le en ligne!
s
est une liste paresseuse et infinie de coordonnées en spirale, représentées par des nombres complexes. Il est construit à partir de deux autres listes infinies:1, *i ... *
crée la liste1, i, -1, -i ...
.1, 1.5 ... *
fait la liste1, 1.5, 2, 2.5, 3, 3.5 ...
. Compresser ces deux listes ainsi que la réplication de liste génère la liste des étapes de chaque spirale de coordonnées à l'autre:1, i, -1, -1, -i, -i, 1, 1, 1, i, i, i ...
. (Les parties fractionnaires des arguments de droite de l'opérateur de réplication de liste sont ignorées.) Une réduction d'addition triangulaire ([\+]
) sur cette liste (et un collage de 0 sur le devant) produit la liste des coordonnées en spirale.Enfin, à partir du nombre complexe
s[$_]
($_
étant le seul argument à la fonction), nous regardons les index (first :k
) dans la spirale des nombres complexes qui sont décalée par rapport à ce nombre pari
,-1
,1
et-i
.la source
Brain-Flak , 238 octets
Essayez-le en ligne!
La sortie est dans l'ordre gauche, haut, droite, bas.
Explication
la source
MATL , 15 octets
L'entrée et la sortie sont basées sur 1.
La sortie donne les voisins gauche, bas, haut et droit dans cet ordre.
Essayez-le en ligne! Ou vérifiez tous les cas de test à l'exception des deux derniers, qui expirent sur TIO.
la source
1YL
- MATLAB a unespiral
fonction? Quand MATLAB est-il devenu Mathematica?!R , 172 octets
Essayez-le en ligne!
C'est R, donc évidemment la réponse est indexée 0.
La plupart du travail consiste à créer la matrice. Code inspiré de: https://rosettacode.org/wiki/Spiral_matrix#R
la source
JavaScript (ES6), 165 octets
Imprime les index avec
alert()
.Essayez-le en ligne!
Comment?
(adapté de cette réponse de math.stackexchange)
la source
RangeError: Maximum call stack size exceeded
et l' erreur dans la console du navigateur:InternalError: too much recursion
. Est-ce que je fais quelque chose de mal?Python 2 ,
177164146144 octetsEssayez-le en ligne!
Calcule
u,l,r,d
directement à partir den
.la source
PHP (> = 5,4), 208 octets
Pour l'exécuter:
Exemple:
Ou essayez-le en ligne!
Remarques:
-d error_reporting=0
option est utilisée pour ne pas générer d'avis / avertissements.Comment?
Je génère la spirale avec une version modifiée de cette réponse dans un tableau à 2 dimensions.
Je décide de la taille de la spirale en fonction de l'entrée
n
avec une formule pour toujours obtenir un tour supplémentaire de nombres dans la spirale (garantie de l'existence de dessus / dessous / gauche / droite). Un rond supplémentaire de nombres signifie+2
en hauteur et+2
en largeur du tableau à 2 dimensions.Donc, si
n
sera situé dans une spirale avec une taille maximale de3*3
, alors la spirale générée sera5*5
.La taille de la spirale est
c*c
oùc = ceil(sqrt(n)) + k
, siceil(sqrt(n))
est impair, alorsk
est 2 et siceil(sqrt(n))
est pair, alorsk
est 3.Par exemple, la formule ci-dessus se traduira par ceci:
n = 1
alorsc = 3
et la taille de la spirale sera3*3
n <= 9
alorsc = 5
et la taille de la spirale sera5*5
n <= 25
alorsc = 7
et la taille de la spirale sera7*7
n <= 49
alorsc = 9
et la taille de la spirale sera9*9
Lors de la génération de la spirale, je stocke le
x
ety
den
et après la génération, j'émets les éléments au-dessus / en dessous / à gauche / à droite de celui-ci.la source