f=lambda r,x=0:r-x and-~((r*r-x*x)**.5%1>0)*4+f(r,x+1)
Попробуйте онлайн!
Меньше гольфа (55 байт) ( TIO )
lambda r:8*r-4*sum((r*r-x*x)**.5%1==0for x in range(r))
Это оценивает выходные данные как 8*r
, а затем корректирует пересечение вершин. Результат 8*r-g(r*r)
, где g(x)
считается количество способов записи x
в виде суммы двух квадратов (кроме g(0)=0
).
Если бы окружность никогда не проходила через какие-либо вершины, количество прикосновений к ячейкам равнялось бы количеству пересеченных ребер. Круг проходит через 2*r
вертикальные линии сетки и 2*r
горизонтальные линии сетки, проходя каждый в обоих направлениях, в общей сложности 8*r
.
Но каждое пересечение в вершине считается как два пересечения ребер при входе только в одну новую ячейку. Таким образом, мы компенсируем, вычитая количество пересечений вершин. Это включает в себя точки на осях, (r,0)
а также пифагорейские тройки, как (4,3)
для r=5
.
Мы рассчитываем для одного квадранта точки (x,y)
с x>=0
и y>0
с x*x+y*y==n
, затем умножаем на 4. Мы делаем это путем подсчета числа, являющегося sqrt(r*r-x*x)
целым числом для x
интервала [0,r)
.