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