Escriba un programa o función que, dado un radio entero r, devuelva el número de cuadrados unitarios que atraviesa el círculo con radio r centrado en el origen. Si el círculo pasa exactamente a través de un punto en la cuadrícula que no cuenta como pasar a través de los cuadrados de las unidades adyacentes.
Aquí hay una ilustración para r = 5 :
Ilustración de Kival Ngaokrajang, encontrada en OEIS
Ejemplos:
0 → 0
1 → 4
4 → 28
5 → 28
49 → 388
50 → 380
325 → 2540
5524 → 44180
5525 → 44020
N = 50
).Respuestas:
Python 2 , 54 bytes
Pruébalo en línea!
Menos golf (55 bytes) ( TIO )
Esto estima la salida como
8*r
, luego corrige los cruces de vértices. El resultado es8*r-g(r*r)
, dondeg(x)
cuenta el número de formas de escribirx
como una suma de dos cuadrados (exceptog(0)=0
).Si el círculo nunca atravesara ningún vértice, el número de celdas tocadas sería igual al número de bordes cruzados. El círculo pasa a través de
2*r
líneas verticales y2*r
horizontales, pasando cada una en ambas direcciones, para un total de8*r
.Pero, cada cruce en un vértice cuenta como dos cruces de borde mientras solo ingresa a una nueva celda. Entonces, compensamos restando el número de cruces de vértices. Esto incluye los puntos en ejes
(r,0)
como así como triples pitagóricos como(4,3)
parar=5
.Contamos para un solo cuadrante los puntos
(x,y)
conx>=0
yy>0
conx*x+y*y==n
, luego multiplicamos por 4. Hacemos esto contando lossqrt(r*r-x*x)
números que son números enterosx
en el intervalo[0,r)
.fuente
Mathematica, 48 bytes
Mira el primer cuadrante y cuenta el número de celdas de la cuadrícula para las cuales la entrada cae entre las normas de las esquinas inferiores izquierda y superior derecha de la celda (por supuesto, multiplicando el resultado por 4).
fuente
8#-SquaresR[2,#^2]Sign@#&
basa en la publicación de xnorSquaresR
. Siéntase libre de publicarlo usted mismo (o deje que xnor lo publique).Python 2 , 72 bytes
Pruébalo en línea!
fuente
Jalea ,
21131211 bytesPruébalo en línea!
Cómo funciona
fuente
Perl 6, 61 bytes
Cómo funciona
fuente
AWK, 90 bytes
Uso:
Solo una simple búsqueda a través del cuadrante 1 para encontrar todos los cuadros que se cruzarán con el círculo. La simetría permite la multiplicación por 4. Podría pasar de
-$1 to $1
, pero eso tomaría más bytes y sería menos eficiente. Obviamente, este no es el algoritmo más eficiente en tiempo, pero solo lleva unos 16 segundos ejecutar el caso 5525 en mi máquina.fuente
Haskell, 74 bytes
Bastante sencillo, cuente el número de cuadrados entre (0,0) y (n, n) donde la parte inferior izquierda está dentro del círculo y la parte superior derecha está fuera del círculo, luego multiplique por 4.
fuente
Pyth , 29 bytes
¡Intentalo!
Explicación
fuente
Lote, 147 bytes
Algo inspirado por las respuestas de AWK y Haskell.
fuente
Bash + Unix utilidades, 127 bytes
Pruébalo en línea!
Simplemente revise todos los puntos en el primer cuadrante, cuéntelos y multiplique por 4. Puede ser muy lento, pero funciona.
fuente
JavaScript (ES7), 76 bytes
fuente
n
abajo a0
?n
radio como lak
iteración y todos los intentos salieron en los mismos bytesk<n?...
pero pierdo el orden de esos bytesn**2-k++**2
porque la prioridad del operador es incorrecta al ir en reversa y la resta no es conmutativa, por lo que el lado izquierdo siempre necesita tenerk-1
paréntesis. ¿A menos que hayas encontrado un camino?