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).