f=lambda r,x=0:r-x and-~((r*r-x*x)**.5%1>0)*4+f(r,x+1)
Hãy thử trực tuyến!
Ít chơi gôn hơn (55 byte) ( TIO )
lambda r:8*r-4*sum((r*r-x*x)**.5%1==0for x in range(r))
Điều này ước tính đầu ra là 8*r, sau đó sửa chữa cho các giao điểm đỉnh. Kết quả là 8*r-g(r*r), trong đó g(x)đếm số cách viết xdưới dạng tổng của hai hình vuông (trừ g(0)=0).
Nếu vòng tròn không bao giờ đi qua bất kỳ đỉnh nào, số lượng ô được chạm sẽ bằng số cạnh được giao. Vòng tròn đi qua các 2*rđường lưới dọc và đường lưới 2*rngang, đi qua mỗi hướng theo cả hai hướng, với tổng số 8*r.
Nhưng, mỗi giao cắt tại một đỉnh được tính là hai giao điểm cạnh trong khi chỉ nhập một ô mới. Vì vậy, chúng tôi bù bằng cách trừ đi số lượng giao điểm đỉnh. Điều này bao gồm các điểm trên các trục như (r,0)cũng như bộ ba Pythagore như (4,3)cho r=5.
Chúng tôi đếm cho một góc phần tư duy nhất các điểm (x,y)có x>=0và y>0với x*x+y*y==n, sau đó nhân với 4. Chúng tôi làm điều này bằng cách đếm số của số sqrt(r*r-x*x)đó là toàn bộ số xtrong khoảng [0,r).