f=lambda r,x=0:r-x and-~((r*r-x*x)**.5%1>0)*4+f(r,x+1)
Experimente online!
Menos golfe (55 bytes) ( TIO )
lambda r:8*r-4*sum((r*r-x*x)**.5%1==0for x in range(r))
Isso estima a saída como 8*r
, em seguida, corrige os cruzamentos de vértice. O resultado é 8*r-g(r*r)
, onde g(x)
conta o número de maneiras de escrever x
como uma soma de dois quadrados (exceto g(0)=0
).
Se o círculo nunca passou por nenhum vértice, o número de células tocadas seria igual ao número de arestas cruzadas. O círculo passa pelas 2*r
linhas de grade verticais e 2*r
horizontais, passando cada uma nas duas direções, num total de 8*r
.
Porém, cada cruzamento em um vértice conta como dois cruzamentos de borda, enquanto apenas entra em uma nova célula. Assim, compensamos subtraindo o número de cruzamentos de vértices. Isso inclui os pontos nos eixos (r,0)
, assim como os triplos pitagóricos, como (4,3)
para r=5
.
Contamos para um único quadrante os pontos (x,y)
com x>=0
e y>0
com x*x+y*y==n
, em seguida, multiplicar por 4. Fazemos isso através da contagem do numer de sqrt(r*r-x*x)
que são número inteiro para x
no intervalo [0,r)
.