Tulis sebuah program atau fungsi yang diberi radius bilangan bulat r mengembalikan jumlah unit kuadrat lingkaran dengan jari-jari r berpusat pada titik asal melewati. Jika lingkaran melewati titik pada grid yang tidak dihitung sebagai melewati kuadrat unit yang berdekatan.
Berikut ilustrasi untuk r = 5 :
Ilustrasi oleh Kival Ngaokrajang, ditemukan di OEIS
Contoh:
0 → 0
1 → 4
4 → 28
5 → 28
49 → 388
50 → 380
325 → 2540
5524 → 44180
5525 → 44020
N = 50
).Jawaban:
Python 2 , 54 byte
Cobalah online!
Kurang golf (55 byte) ( TIO )
Ini memperkirakan output sebagai
8*r
, kemudian mengoreksi penyeberangan verteks. Hasilnya adalah8*r-g(r*r)
, di manag(x)
dihitung jumlah cara untuk menulisx
sebagai jumlah dari dua kotak (kecualig(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 gridlines2*r
horisontal, melewati masing-masing di kedua arah, dengan total8*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)
untukr=5
.Kami menghitung untuk kuadran tunggal poin
(x,y)
denganx>=0
dany>0
denganx*x+y*y==n
, lalu kalikan dengan 4. Kami melakukan ini dengan menghitung angkasqrt(r*r-x*x)
yang merupakan bilangan bulat untukx
dalam interval[0,r)
.sumber
Mathematica, 48 byte
Lihat kuadran pertama dan hitung jumlah sel kisi di mana input berada di antara norma sudut kiri bawah dan kanan atas sel (tentu saja mengalikan hasilnya dengan 4, tentu saja).
sumber
8#-SquaresR[2,#^2]Sign@#&
didasarkan pada posting xnorSquaresR
. Jangan ragu untuk memposting itu sendiri (atau biarkan xn mempostingnya).Python 2 , 72 byte
Cobalah online!
sumber
Jelly ,
21131211 byteCobalah online!
Bagaimana itu bekerja
sumber
Perl 6, 61 byte
Bagaimana itu bekerja
sumber
AWK, 90 byte
Pemakaian:
Cukup pencarian sederhana melalui kuadran 1 untuk menemukan semua kotak yang akan memotong lingkaran. Simetri memungkinkan untuk dikalikan dengan 4. Bisa dari
-$1 to $1
, tetapi itu akan membutuhkan lebih banyak byte dan kurang efisien. Jelas ini bukan algoritma yang paling efisien waktu, tetapi hanya membutuhkan waktu sekitar 16 detik untuk menjalankan case 5525 pada mesin saya.sumber
Haskell, 74 byte
Cukup mudah, hitung jumlah kotak antara (0,0) dan (n, n) di mana kiri bawah di dalam lingkaran dan kanan atas di luar lingkaran, lalu kalikan dengan 4.
sumber
Pyth , 29 byte
Cobalah!
Penjelasan
sumber
Batch, 147 byte
Agak terinspirasi oleh jawaban AWK dan Haskell.
sumber
Utilitas Bash + Unix, 127 byte
Cobalah online!
Ikuti saja semua poin di kuadran pertama, hitung, dan kalikan dengan 4. Ini bisa sangat lambat, tetapi berhasil.
sumber
JavaScript (ES7), 76 byte
sumber
n
bawah ke0
?n
jari-jari dank
iterasi dan semua upaya keluar dengan byte yang samak<n?...
tetapi saya kehilangan byte-byte yang dipesan ulangn**2-k++**2
karena prioritas operator salah ketika mundur dan pengurangan tidak komutatif sehingga sisi kiri selalu perlu memilikik-1
dan membutuhkan tanda kurung. Kecuali Anda sudah menemukan jalan?