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 x
dướ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*r
ngang, đ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>=0
và y>0
vớ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ố x
trong khoảng [0,r)
.