f=lambda r,x=0:r-x and-~((r*r-x*x)**.5%1>0)*4+f(r,x+1)
Cobalah online!
Kurang golf (55 byte) ( TIO )
lambda r:8*r-4*sum((r*r-x*x)**.5%1==0for x in range(r))
Ini memperkirakan output sebagai 8*r
, kemudian mengoreksi penyeberangan verteks. Hasilnya adalah 8*r-g(r*r)
, di mana g(x)
dihitung jumlah cara untuk menulis x
sebagai jumlah dari dua kotak (kecuali g(0)=0
).
Jika lingkaran tidak pernah melewati simpul, jumlah sel yang disentuh akan sama dengan jumlah tepi yang dilintasi. Lingkaran melewati 2*r
gridlines vertikal dan gridlines 2*r
horisontal, melewati masing-masing di kedua arah, dengan total 8*r
.
Tapi, masing-masing persimpangan pada titik dihitung sebagai dua persimpangan tepi sementara hanya memasuki satu sel baru. Jadi, kami mengimbanginya dengan mengurangi jumlah penyeberangan titik. Ini termasuk titik pada sumbu seperti (r,0)
serta tiga kali lipat Pythagoras seperti (4,3)
untuk r=5
.
Kami menghitung untuk kuadran tunggal poin (x,y)
dengan x>=0
dan y>0
dengan x*x+y*y==n
, lalu kalikan dengan 4. Kami melakukan ini dengan menghitung angka sqrt(r*r-x*x)
yang merupakan bilangan bulat untuk x
dalam interval [0,r)
.