Diberikan angka non-negatif n
, hasilkan jumlah cara untuk menyatakan n
sebagai jumlah dari dua kuadrat dari bilangan bulat n == a^2 + b^2
( OEIS A004018 ). Catat itu a
dan b
bisa positif, negatif, atau nol, dan urutannya penting. Bytes paling sedikit menang.
Misalnya, n=25
memberi 12
karena 25
dapat dinyatakan sebagai
(5)^2 + (0)^2
(4)^2 + (3)^2
(3)^2 + (4)^2
(0)^2 + (5)^2
(-3)^2 + (4)^2
(-4)^2 + (3)^2
(-5)^2 + (0)^2
(-4)^2 + (-3)^2
(-3)^2 + (-4)^2
(0)^2 + (-5)^2
(3)^2 + (-4)^2
(4)^2 + (-3)^2
Berikut adalah nilai hingga n=25
. Hati-hati agar kode Anda berfungsi n=0
.
0 1
1 4
2 4
3 0
4 4
5 8
6 0
7 0
8 4
9 4
10 8
11 0
12 0
13 8
14 0
15 0
16 4
17 8
18 4
19 0
20 8
21 0
22 0
23 0
24 0
25 12
Berikut adalah nilai hingga n=100
sebagai daftar.
[1, 4, 4, 0, 4, 8, 0, 0, 4, 4, 8, 0, 0, 8, 0, 0, 4, 8, 4, 0, 8, 0, 0, 0, 0, 12, 8, 0, 0, 8, 0, 0, 4, 0, 8, 0, 4, 8, 0, 0, 8, 8, 0, 0, 0, 8, 0, 0, 0, 4, 12, 0, 8, 8, 0, 0, 0, 0, 8, 0, 0, 8, 0, 0, 4, 16, 0, 0, 8, 0, 0, 0, 4, 8, 8, 0, 0, 0, 0, 0, 8, 4, 8, 0, 0, 16, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 8, 4, 0, 12]
Fakta menyenangkan: Urutan berisi istilah yang sewenang-wenang tinggi, dan batas rata-rata berjalannya adalah π.
Papan peringkat:
var QUESTION_ID=64812,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/64812/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
1,0,2,0,0,3,0,0,0,4,0,0,0,0,5,...
. Memotong urutan setelah nomor bukan nol, rata-rata sejauh ini adalah 1. Dan, berjalan dari 0 memiliki dampak yang semakin sedikit di urutan berikutnya.Jawaban:
Python (
59 5756 byte)Demo online
Seperti dengan jawaban CJam saya, ini menggunakan inversi Möbius dan berjalan dalam pseudoquasilinear.
Berkat Sp3000 untuk penghematan 2 byte, dan feersum untuk 1.
sumber
-1**x
adalah selalu begitu-1
. Saya berharap-1
untuk menjadi token bilangan bulat tunggal daripada minus rendah didahulukan dikurangi diikuti oleh satu.**x
.Mathematica, 13 byte
Jika built-in diizinkan, ini adalah cara melakukannya di Mathematica.
Untuk 0 <= n <= 100
sumber
Python 2, 44 byte
Ini hampir sama dengan solusi xsot (yang didasarkan pada solusi Peter Taylor ), tetapi menyimpan 8 byte dengan menyederhanakan cara tanda ditangani.
Perhatikan bahwa untuk program lengkap, kita dapat menghemat 2 byte dalam fungsi tanpa menimbulkan biaya di luar fungsi:
Dua byte tambahan untuk program lengkap dengan cara ini:
Karena
n > 0
ada solusi 40 byte yang sangat terbaca:sumber
Pyth, 13 byte
Suite uji
sumber
Q
.J, 16 byte
Ini adalah kata kerja monadik (dengan kata lain, fungsi unary). Cobalah secara online atau lihat lulus semua kasus uji .
Penjelasan
sumber
Python 2,
69555352 byteIni adalah fungsi rekursif yang didasarkan pada solusi sempurna Peter Taylor .
sumber
f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2
. Juga, saya kira kita tidak peduli melebihi kedalaman rekursi maksimum default?/4<<2
trik xsot membuatnya lebih pendek dari yang saya miliki.Julia, 40 byte
Tidak Disatukan:
Perhatikan bahwa loop tidak termasuk
i==0
, karena ketikan
kotak, itu sudah termasuk olehi=sqrt(n)
, dan hanya ada empat, bukan delapan, untuk formulir itu (0^2+k^2, 0^2+(-k)^2, k^2+0^2, (-k)^2+0^2
).sumber
CJam,
2523 byteIni adalah solusi teoretis yang membutuhkan O (9 n ) waktu dan memori untuk input n .
Dengan biaya satu byte tambahan - untuk total 24 byte - kita dapat mengurangi kompleksitas menjadi O (n 2 ) :
Cobalah online!
Bagaimana itu bekerja
Antara
atau
Kemudian
sumber
CJam (
25 24 2221 bytes)Demo online
Ini berjalan dalam pseudoquasilinear * dan menggunakan pernyataan dari OEIS itu
Input
0
jelas merupakan kasus khusus (Möbius tranforms dan annihilator tidak cocok bersama), tetapi pada akhirnya hanya memakan satu char.* Pseudo- karena itu adalah quasilinear dalam nilai input, bukan ukuran input; kuasi karena melakukan
Theta(n)
operasi pada bilangan bulat ukuran pada urutann
; sebuahb
operasi -bit mod harus mengambilb lg b
waktu, sehingga secara keseluruhan ini membutuhkanTheta(n lg n lg lg n)
waktu.sumber
Japt ,
423733 byteJapt adalah versi singkat dari Ja vaScri pt . Penerjemah
Bagaimana itu bekerja
Mungkin ada teknik yang lebih baik; saran dipersilahkan.
sumber
Python 3,
686160 byteMenggunakan dua daftar pemahaman bersarang terlalu mahal. Sebagai gantinya, ini memeriksa apakah kedua koordinat pada lingkaran jari-jari sqrt (n) adalah bilangan bulat.
Peter Taylor telah mengalahkan ini dengan pendekatan berbasis inversi Moebius .
sumber
n=0
elegan.Oktaf, 28 byte
sumber
Haskell, 42 byte
Contoh penggunaan:
sumber
q
penjaga itu cerdas, saya akan ingat trik ini.Julia,
897963 byteIni adalah fungsi bernama
a
yang menerima integer dan mengembalikan float. Itu memanggil fungsi pembantug
.Tidak Disatukan:
Pendekatan di sini menggunakan penyederhanaan formula Wesley Ivan Hurt yang terdaftar di OEIS. Penyederhanaan ditemukan oleh Glen O, orang yang sama yang mencukur 26 byte dari jawaban ini!
sumber
x^.5
daripadasqrt(x)
menyimpan 3 byte. Dan(n==0)
menghemat 2 byte lebih1÷(n+1)
. Dan Anda dapat menyimpan 4 karakter lebih banyak dengan menggunakancos(π*sqrt(x))^2÷1
daripadafloor(cos(π*sqrt(x))^2)
. Juga, gunakan1:n/2
daripada1:n÷2
, karena tidak ada salahnya menggunakan float dig(x)
dan itu akan dikunci ke bilangan bulat untuki
tetap. Dansum(i->g(i)g(n-i),1:n/2)
akan mencukur beberapa karakter lagi juga.sum
trick gagal untukn=0
meskipun, jadi aku terus array yang pemahaman.i=0
kasingnya terjadi, Anda dapat mengaktifkannya4g(n)
. Jadi(n==0)-4g(n)-4g(n/2)+8sum(i->g(i)g(n-i),0:n/2)
, yang tidak akan mengalami kesalahan. Tetapi Anda dapat melakukan yang lebih baik lagi, dengan mencatat simetri -(n==0)+4sum([g(i)g(n-i)for i=1:n])
Pyth,
1615 byteCobalah online di Pyth Compiler .
Bagaimana itu bekerja
sumber
TI-BASIC, 23 byte
Cukup mudah.
Σ(
adalah penjumlahan.Anehnya,
sum(seq(sum(seq(
melemparERR:ILLEGAL NEST
, dan begitu jugaΣ(Σ(
, tetapisum(seq(Σ(
baik-baik saja. Saya memilih untuk meletakkanΣ(
di dalam untuk menyimpan paren dekat.sumber
sum
danΣ
?X²+Y²=Ans
dari nilai X antara-Ans
danAns
. jumlah (adalah jumlah daftar , jadi kita perlu membuat daftar terlebih dahulu menggunakan seq (..., Y, -Ans, AnsJavaScript (ES6),
6660 byte6 byte disimpan berkat @ edc65 !
Penjelasan
Uji
sumber
n=>eval('for(r=0,a=~n;a++<n;)for(b=~n;b++<n;)r+=a*a+b*b==n')
eval
untuk menempatkanfor
loop ke fungsi panah tanpa tanda kurung. Saya juga lupa tentang~
operator haha.Python 3,
936269 byteItertools tidak berfungsi jadi saya menggunakan dua rentang lagi, tetapi memindahkan rentang untuk menghemat byte.
Sunting: Kode sebelumnya tidak benar-benar berfungsi, karena saya menetapkan rentang n sebelum saya mendefinisikan n.
sumber
APL,
232019 bytePenjelasan:
Selain fakta bahwa APL tidak memiliki
i:
fungsi J (angka dari -n ke n), ini berfungsi seperti jawaban J.Kami tidak dapat menggunakan kereta api karena mendapatkan yang
-\⍳2×⍵
tidak parse seperti(-\) ⍳ (2×⍵)
akan menelan biaya tiga byte; sama dengan sepasang atops lainnya. Semua tanda kurung membuat fungsi reguler lebih pendek.Coba di sini . Output dari
1
semua nilai cocok.sumber
Matlab 41 byte
Bahkan lebih kecil dari jawaban sebelumnya
Pada dasarnya jawaban Agawa001 dengan kekuatan dan sqrt diganti
sumber
Candy ,
1714 byteInput didorong ke stack pada awalnya
~TbAT1C(sWs+Aeh)Z
~T0C(sWs+Aeh)Z
sumber
CJam, 28
Tidak terlalu pendek, tetapi efisien. Misalnya hasil untuk 15625 adalah langsung 28. Menggunakan rumus berbasis faktorisasi dari OEIS.
Cobalah online
Penjelasan:
Beberapa detail tentang perhitungan:
(exponent + 1) & -1
, yaituexponent + 1
(exponent + 1) & 1
, yaitu 0 jika eksponennya ganjil, dan 1 jika genapSemua nilai ini dikalikan bersama dan dikalikan dengan 4 persis dengan formula OEIS.
sumber
Python 2, 68 byte
Menentukan fungsi yang dipanggil
x()
yang mengambil angka n.Cobalah online. http://ideone.com/aRoxGF
sumber
print
ataureturn
pernyataan.n=0
dann=1
(0 dan 2 bukannya 1 dan 4). Mungkin batas rentang perlu disesuaikan?n+1
.Pyth,
4135333027 byteCobalah online.
Sunting: Berkat isaacg , saya dapat
m
dan*F
bekerja! IYA!Sunting: Masukkan bitwise dan kembali untuk penghematan byte lebih banyak! Juga saya menghapus semua hal "Sebelumnya". Itu mulai berantakan.
Terima kasih kepada aditsu dan solusi CJam-nya, dan untuk maltysen dan tip-tipnya (Suatu hari saya akan mulai
m*Fd
bekerja. Suatu hari ...)Perhatikan bahwa,
jika prime adalah 1 mod 4, kita dapatkan
-1 & (exponent + 1)
, yaituexponent + 1
tetapi jika prime adalah 3 mod 4, kita dapatkan
1 & (exponent + 1)
, yaitu0
jika eksponennya aneh, dan1
jika genapLipat gandakan semuanya (kali 4 di awal) dan kami mendapatkan jumlah penjumlahan dari dua kotak yang menambah input kami.
sumber
Python, 57 byte
Tantangan yang bagus. Sayangnya saya tidak mendapatkannya lebih pendek dari ini saat ini.
sumber
PARI / GP,
3428 byteMenggunakan fungsi pembangkit:
Disimpan 6 byte berkat Mitch Schwartz .
Menggunakan built-in, 33 byte (disimpan 1 byte berkat Mitch Schwartz .):
sumber
matid(2)
menghemat satu byte.n->sum(i=-n,n,x^i^2)^2\x^n%x
Matlab, 72 byte
sumber
disp
dalam tantangan ini Luis! =)Matlab,
6350 byteIni mengalahkan kode lain yang sama berjudul, jadi saya katakan: D.
Program ini menemukan solusi integer positif kemudian dikalikan dengan 4 untuk mencakup yang negatif.
Itu dapat melakukan semua 25 kasus uji pertama
sumber
disp
dalam tantangan ini ! =)format compact
=)JavaScript, 89 byte
Saya tahu ini bukan jawaban JavaScript terpendek bahkan jika saya harus menghapus garis i / o, tapi saya pikir itu adalah jawaban JS berkinerja terbaik yang memberi saya hasil untuk satu juta dalam beberapa detik (sepuluh juta mengambil sekitar menit).
sumber
PHP, 70 byte, tidak bersaing
algoritma dicuri dari salah satu jawaban Python ... Saya lupa yang mana; ingin setidaknya sebagian memahami apa yang terjadi sebelum saya memposting.
sumber
for(;$x<=$n=$argv[1];)$s+=(-($n%(2*$x+1)<1))**$x++*4;echo$n?$s:1;
menghemat 5 Bytes.$x-~$x
sama dengan2*$x+1
dan sekarang Anda dapat mulai tanpa menetapkan variabel.