f=lambda r,x=0:r-x and-~((r*r-x*x)**.5%1>0)*4+f(r,x+1)
Pruébalo en línea!
Menos golf (55 bytes) ( TIO )
lambda r:8*r-4*sum((r*r-x*x)**.5%1==0for x in range(r))
Esto estima la salida como 8*r
, luego corrige los cruces de vértices. El resultado es 8*r-g(r*r)
, donde g(x)
cuenta el número de formas de escribir x
como una suma de dos cuadrados (excepto g(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 y 2*r
horizontales, pasando cada una en ambas direcciones, para un total de 8*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)
para r=5
.
Contamos para un solo cuadrante los puntos (x,y)
con x>=0
y y>0
con x*x+y*y==n
, luego multiplicamos por 4. Hacemos esto contando los sqrt(r*r-x*x)
números que son números enteros x
en el intervalo [0,r)
.