Gambar berikut menunjukkan masalah:
Tulis fungsi yang, diberi bilangan bulat sebagai jari-jari lingkaran, menghitung jumlah titik kisi di dalam lingkaran pusat (termasuk batas).
Gambar menunjukkan:
f[1] = 5 (blue points)
f[2] = 13 (blue + red points)
nilai lain untuk pemeriksaan / debugging Anda:
f[3] = 29
f[10] = 317
f[1000] = 3,141,549
f[2000] = 12,566,345
Seharusnya memiliki kinerja yang wajar. Katakanlah kurang dari satu menit untuk f [1000].
Kode terpendek menang. Aturan Golf-Aturan Biasa berlaku.
Silakan kirim perhitungan dan waktu f [1001] sebagai contoh.
Jawaban:
J,
211918Membangun kompleks dari -x-xj ke x + xj dan membutuhkan magnitudo.
Edit: Dengan
>:
Sunting 2: Dengan kait dan monadik
~
. Berjalan beberapa kali lebih lambat untuk beberapa alasan, tetapi masih 10 detik untuk f (1000).sumber
i:
, saya sangat mencuri itu, terima kasih!>:
. derp>:
. Tapi hei, itu jawaban yang keren!:)
J,
2721Sangat brutal: menghitung sqrt (x² + y²) pada rentang [-n, n] dan menghitung item ≤n . Masih sangat dapat diterima kali untuk 1000.
Sunting :
i:y
sedikit lebih pendek dariy-i.>:+:y
. Terima kasih Jesse Millikan !sumber
Ruby 1.9,
62 5854 karakterContoh:
sumber
Python 55 Chars
sumber
f=lambda n:1+4*sum(int((n*n-i*i)**.5)for i in range(n))
lebih pendek 17 karakter.Haskell, 41 byte
Menghitung poin di kuadran
x>=0, y>0
, mengalikan dengan 4, menambahkan 1 untuk titik pusat.sumber
Haskell, 44 byte
sumber
w<-[-n..n]
mana (biasanya) ada nilai boolean?JavaScript (ES6), 80 byte (tidak bersaing karena ES6 terlalu baru)
Versi alternatif, juga 80 byte:
Versi ES7, juga 80 byte:
sumber
Python 2, 48 byte
Seperti solusi fR0DDY , tetapi rekursif, dan mengembalikan float. Mengembalikan int adalah 51 byte:
sumber
C (gcc) , 60 byte
Cobalah online!
Loop di kuadran pertama, gandakan hasilnya dengan 4 dan tambahkan satu. Sedikit kurang golf
sumber
APL (Dyalog Extended) , 14 byte
Cobalah online!
Meskipun tidak memiliki
i:
(kisaran inklusif dari -n ke n) yang dibangun di J, APL Extended memiliki sintaksis yang lebih pendek di area lain.sumber
Japt
-x
, 12 byteCobalah online!
Penjelasan:
sumber
PHP,
8583 byteKode:
Hasilnya (lihat https://3v4l.org/bC0cY untuk beberapa versi PHP):
Kode yang tidak dipisahkan:
Implementasi naif yang memeriksa
$n*($n+1)
poin (dan berjalan 1000 lebih lambat tetapi masih menghitungf(1001)
dalam waktu kurang dari 0,5 detik) dan test suite (menggunakan data sampel yang disediakan dalam pertanyaan) dapat ditemukan di github .sumber
Clojure / ClojureScript, 85 karakter
Brute memaksa kuadran pertama, termasuk sumbu y tetapi bukan sumbu x. Hasilkan 4 untuk setiap titik, lalu tambahkan bersama dengan 1 untuk titik asal. Berjalan di bawah 2 detik untuk input 1000.
Menyalahgunakan
for
untuk mendefinisikan variabel dan menyimpan beberapa karakter. Melakukan hal yang sama untuk membuat alias untukrange
tidak menyimpan karakter apa pun (dan membuatnya berjalan lebih lambat secara signifikan), dan sepertinya Anda tidak akan menyimpan apa pun dengan membuat fungsi persegi.sumber
Pyke, 14 byte, tidak bersaing
Coba di sini!
sumber
Mathematica, 35 karakter
Diangkat dari https://oeis.org/A000328
https://reference.wolfram.com/language/ref/SquaresR.html
SquaresR[2,k]
adalah jumlah cara untuk merepresentasikan k sebagai jumlah dari dua kuadrat, yang sama dengan jumlah titik kisi pada lingkaran jari-jari k ^ 2. Jumlahkan dari k = 0 hingga k = n ^ 2 untuk menemukan semua titik pada atau di dalam lingkaran jari-jari n.sumber
2~SquaresR~k~Sum~{k,0,#^2}&
untuk membuatnya lebih pendekTcl, 111 byte
Diskrit x loop sederhana di atas kuadran I, menghitung terbesar y menggunakan Teorema Pythagoras pada setiap langkah. Hasilnya adalah 4 kali jumlah ditambah satu (untuk titik tengah).
Ukuran program tergantung pada nilai r . Ganti
{1001 0 -1}
dengan"$argv 0 -1"
dan Anda dapat menjalankannya dengan nilai argumen baris perintah apa pun untuk r .Menghitung f (1001) →
3147833.0
dalam sekitar 1030 mikrodetik, prosesor AMD Sempron 130 2.6GHz 64-bit, Windows 7.Jelas, semakin besar jari-jari, semakin dekat perkiraan ke PI: f (10000001) berjalan dalam waktu sekitar 30 detik menghasilkan nilai 15-digit, yaitu tentang ketepatan ganda IEEE.
sumber
Stax , 11 byte
Jalankan dan debug itu
sumber