Écrivez un programme ou une fonction qui, étant donné un rayon entier r, renvoie le nombre de carrés unitaires que le cercle de rayon r centré à l'origine traverse. Si le cercle passe exactement par un point de la grille qui ne compte pas comme passant par les carrés d'unité adjacents.
Voici une illustration pour r = 5 :
Illustration de Kival Ngaokrajang, trouvée sur OEIS
Exemples:
0 → 0
1 → 4
4 → 28
5 → 28
49 → 388
50 → 380
325 → 2540
5524 → 44180
5525 → 44020
N = 50
).Réponses:
Python 2 , 54 octets
Essayez-le en ligne!
Moins golfé (55 octets) ( TIO )
Cela estime la sortie comme
8*r
, puis corrige les croisements de sommets. Le résultat est8*r-g(r*r)
, oùg(x)
compte le nombre de façons d'écrirex
comme une somme de deux carrés (saufg(0)=0
).Si le cercle ne traversait aucun sommet, le nombre de cellules touchées serait égal au nombre d'arêtes croisées. Le cercle passe par
2*r
des quadrillages verticaux et des quadrillages2*r
horizontaux, passant chacun dans les deux directions, pour un total de8*r
.Mais, chaque croisement à un sommet compte comme deux croisements de bord tout en n'entrant que dans une nouvelle cellule. Donc, nous compensons en soustrayant le nombre de croisements de sommets. Cela inclut les points sur les axes comme
(r,0)
ainsi que les triplets pythagoriciens comme(4,3)
pourr=5
.Nous comptons pour un seul quadrant les points
(x,y)
avecx>=0
ety>0
avecx*x+y*y==n
, puis multiplions par 4. Nous faisons cela en comptant lessqrt(r*r-x*x)
nombres qui sont des nombres entiers pourx
dans l'intervalle[0,r)
.la source
Mathematica, 48 octets
Examine le premier quadrant et compte le nombre de cellules de la grille pour lesquelles l'entrée se situe entre les normes des coins inférieur gauche et supérieur droit de la cellule (en multipliant le résultat par 4, bien sûr).
la source
8#-SquaresR[2,#^2]Sign@#&
basée sur le post de xnorSquaresR
. N'hésitez pas à le poster vous-même (ou laissez xnor le poster).Python 2 , 72 octets
Essayez-le en ligne!
la source
Gelée ,
21131211 octetsEssayez-le en ligne!
Comment ça marche
la source
Perl 6, 61 octets
Comment ça marche
la source
AWK, 90 octets
Usage:
Une simple recherche dans le quadrant 1 pour trouver toutes les cases qui coupent le cercle. La symétrie permet la multiplication par 4. Pourrait aller de
-$1 to $1
, mais cela prendrait plus d'octets et serait moins efficace. Évidemment, ce n'est pas l'algorithme le plus efficace en temps, mais il ne faut que 16 secondes environ pour exécuter le boîtier 5525 sur ma machine.la source
Haskell, 74 octets
Assez simple, comptez le nombre de carrés entre (0,0) et (n, n) où le coin inférieur gauche est à l'intérieur du cercle et le coin supérieur droit est à l'extérieur du cercle, puis multipliez par 4.
la source
Pyth , 29 octets
Essayez!
Explication
la source
Lot, 147 octets
Assez inspiré par les réponses AWK et Haskell.
la source
Utilitaires Bash + Unix, 127 octets
Essayez-le en ligne!
Parcourez tous les points du premier quadrant, comptez-les et multipliez par 4. Cela peut être très lent, mais cela fonctionne.
la source
JavaScript (ES7), 76 octets
la source
n
bas en haut0
?n
rayon et l'k
itération et toutes les tentatives sont sorties des mêmes octetsk<n?...
mais je perds ces octets de réorganisationn**2-k++**2
car la priorité de l'opérateur est incorrecte en cas de marche arrière et la soustraction n'est pas commutative, donc le côté gauche doit toujours avoirk-1
et a besoin de parenthèses. A moins que vous n'ayez trouvé un moyen?