L'image suivante montre le problème:
Écrivez une fonction qui, étant donné un entier comme rayon du cercle, calcule le nombre de points de réseau à l'intérieur du cercle centré (y compris la frontière).
L'image montre:
f[1] = 5 (blue points)
f[2] = 13 (blue + red points)
autres valeurs pour votre vérification / débogage:
f[3] = 29
f[10] = 317
f[1000] = 3,141,549
f[2000] = 12,566,345
Devrait avoir une performance raisonnable. Disons moins d'une minute pour f [1000].
Le code le plus court gagne. Les règles habituelles du Code-Golf s'appliquent.
Veuillez poster le calcul et le timing de f [1001] comme exemple.
Réponses:
J,
211918Construit des complexes de -x-xj à x + xj et prend de l'ampleur.
Modifier: avec
>:
Edit 2: Avec crochet et monadique
~
. Fonctionne quelques fois plus lentement pour une raison quelconque, mais reste 10 secondes pour f (1000).la source
i:
, je vole tellement que, merci!>:
. derp>:
. Mais bon, c'est une bonne réponse!:)
J,
2721Très brutal: calcule sqrt (x² + y²) sur la plage [-n, n] et compte les éléments ≤n . Temps encore très acceptable pour 1000.
Edit :
i:y
est un peu plus court quey-i.>:+:y
. Merci Jesse Millikan !la source
Ruby 1.9,
62 5854 caractèresExemple:
la source
Python 55 caractères
la source
f=lambda n:1+4*sum(int((n*n-i*i)**.5)for i in range(n))
est de 17 caractères plus court.Haskell, 41 octets
Compte les points dans le quadrant
x>=0, y>0
, multiplie par 4, ajoute 1 pour le point central.la source
Haskell, 44 octets
la source
w<-[-n..n]
où (généralement) il y a une valeur booléenne?JavaScript (ES6), 80 octets (non concurrent car ES6 est trop nouveau)
Version alternative, également 80 octets:
Version ES7, également 80 octets:
la source
Python 2, 48 octets
Comme la solution de fR0DDY , mais récursive, et renvoie un flottant. Le retour d'un int est de 51 octets:
la source
C (gcc) , 60 octets
Essayez-le en ligne!
Boucle sur le premier quadrant, multiplie le résultat par 4 et en ajoute un. Un peu moins golfé
la source
APL (Dyalog Extended) , 14 octets
Essayez-le en ligne!
Malgré l'absence de la
i:
gamme intégrée (de -n à n) de J, APL Extended a une syntaxe plus courte dans d'autres domaines.la source
Japt
-x
, 12 octetsEssayez-le en ligne!
Explication:
la source
PHP,
8583 octetsLe code:
Son résultat (consultez https://3v4l.org/bC0cY pour plusieurs versions PHP):
Le code non golfé:
Une implémentation naïve qui vérifie les
$n*($n+1)
points (et s'exécute 1000 plus lentement mais calcule toujoursf(1001)
en moins de 0,5 seconde) et la suite de tests (en utilisant les données d'exemple fournies dans la question) peuvent être trouvées sur github .la source
Clojure / ClojureScript, 85 caractères
Brute force le premier quadrant, y compris l'axe y mais pas l'axe x. Génère un 4 pour chaque point, puis les ajoute avec 1 pour l'origine. Fonctionne en moins de 2 secondes pour une entrée de 1000.
Abuse l'enfer
for
pour définir une variable et enregistrer quelques caractères. Faire la même chose pour créer un alias pourrange
n'enregistre aucun caractère (et le rend beaucoup plus lent), et il semble peu probable que vous allez enregistrer quoi que ce soit en créant une fonction carrée.la source
Pyke, 14 octets, non concurrent
Essayez-le ici!
la source
Mathematica, 35 caractères
Tiré de https://oeis.org/A000328
https://reference.wolfram.com/language/ref/SquaresR.html
SquaresR[2,k]
est le nombre de façons de représenter k comme la somme de deux carrés, ce qui est le même que le nombre de points de réseau sur un cercle de rayon k ^ 2. Somme de k = 0 à k = n ^ 2 pour trouver tous les points sur ou à l'intérieur d'un cercle de rayon n.la source
2~SquaresR~k~Sum~{k,0,#^2}&
pour le raccourcirTcl, 111 octets
Boucle x discrète simple sur le quadrant I, comptant le plus grand y en utilisant le théorème de Pythagore à chaque étape. Le résultat est 4 fois la somme plus un (pour le point central).
La taille du programme dépend de la valeur de r . Remplacez
{1001 0 -1}
par"$argv 0 -1"
et vous pouvez l'exécuter avec n'importe quelle valeur d'argument de ligne de commande pour r .Calcule f (1001) →
3147833.0
en environ 1030 microsecondes, processeur 64 bits AMD Sempron 130 2,6 GHz, Windows 7.De toute évidence, plus le rayon est grand, plus l'approximation de PI: f (10000001) s'exécute en environ 30 secondes, produisant une valeur à 15 chiffres, ce qui correspond à la précision d'un double IEEE.
la source
Stax , 11 octets
Exécuter et déboguer
la source