Avec un nombre non négatif n
, indiquez le nombre de façons d'exprimer n
la somme de deux carrés d'entiers n == a^2 + b^2
( OEIS A004018 ). Notez que a
et b
peut être positif, négatif ou nul et que leur ordre est important. Le moins d'octets gagne.
Par exemple, n=25
donne 12
parce que 25
peut être exprimé par
(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
Voici les valeurs jusqu'à n=25
. Veillez à ce que votre code fonctionne pour 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
Voici les valeurs jusqu'à n=100
une liste.
[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]
Faits amusants: la séquence contient des termes arbitrairement élevés et la limite de sa moyenne mobile est π.
Classement:
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,...
. En coupant la séquence après n'importe quel nombre différent de zéro, la moyenne jusqu'à présent est de 1. Et, les suites de 0 ont de moins en moins d'impact ultérieurement dans la séquence.Réponses:
Python (
59 5756 octets)Démo en ligne
Comme avec ma réponse CJam, cela utilise l'inversion de Möbius et s'exécute en temps pseudoquasilinéaire.
Merci à Sp3000 pour des économies de 2 octets et feersum pour 1.
la source
-1**x
c'est toujours-1
. Je m'attendais à ce-1
qu'il s'agisse d'un jeton littéral entier unique plutôt que d'un moins unaire de précédence faible suivi d'un.**x
.Mathematica, 13 octets
Si les fonctions intégrées sont autorisées, voici comment procéder dans Mathematica.
Pour 0 <= n <= 100
la source
Python 2, 44 octets
C'est presque la même chose que la solution de xsot (basée sur la solution de Peter Taylor ), mais économise 8 octets en simplifiant le traitement des signes.
Notez que pour un programme complet, nous pouvons économiser 2 octets dans la fonction sans encourir de coût en dehors de la fonction:
Deux octets supplémentaires pour un programme complet de cette façon:
Car
n > 0
il existe une solution très lisible à 40 octets:la source
Pyth, 13 octets
Suite de tests
la source
Q
.J, 16 octets
C'est un verbe monadique (en d'autres termes, une fonction unaire). Essayez-le en ligne ou voyez-le réussir tous les tests .
Explication
la source
Python 2,
69555352 octetsCeci est une fonction récursive basée sur l'excellente solution de Peter Taylor .
la source
f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2
. De plus, je suppose que nous ne nous soucions pas de dépasser la profondeur de récursivité maximale par défaut?/4<<2
truc de xsot le rend plus court que ce que j'avais.Julia, 40 octets
Ungolfed:
Notez que la boucle n'inclut pas
i==0
, car quandn
est un carré, il est déjà inclus pari=sqrt(n)
, et il n'y a que quatre, pas huit, pour cette forme (0^2+k^2, 0^2+(-k)^2, k^2+0^2, (-k)^2+0^2
).la source
CJam,
2523 octetsC’est une solution théorique qui nécessite 0 (9 n ) temps et de la mémoire pour la saisie n .
Au prix d'un octet supplémentaire, pour un total de 24 octets , nous pouvons réduire la complexité à O (n 2 ) :
Essayez-le en ligne!
Comment ça marche
Non plus
ou
ensuite
la source
CJam (
25 24 2221 octets)Démo en ligne
Cela fonctionne à l’heure pseudoquasilinéaire * et utilise l’affirmation de l’OEIS selon laquelle
L'entrée
0
est évidemment un cas particulier (les transformations de Möbius et les annihilateurs ne vont pas bien ensemble), mais ne coûtent qu'un personnage.* Pseudo- parce que c'est quasilinéaire dans la valeur de l'entrée, pas dans la taille de l'entrée; quasi parce qu'il effectue des
Theta(n)
opérations sur des entiers de taille de l'ordre den
; Uneb
opération de mod-bit devrait prendre dub lg b
temps, donc globalement cela prend duTheta(n lg n lg lg n)
temps.la source
Japt ,
423733 octetsJapt est une version abrégée de Ja vaScri pt . Interprète
Comment ça marche
Peut-être il y a une meilleure technique; les suggestions sont les bienvenues.
la source
Python 3,
686160 octetsL'utilisation de deux interprétations de liste imbriquées est trop chère. Au lieu de cela, ceci vérifie si les deux coordonnées sur le cercle de rayon sqrt (n) sont des entiers.
Peter Taylor a surmonté cela avec une approche basée sur l'inversion de Moebius .
la source
n=0
élégamment.Octave, 28 octets
la source
Haskell, 42 octets
Exemple d'utilisation:
la source
q
dans un garde est intelligente, je me souviendrai de cette astuce.Julia,
897963 octetsC'est une fonction nommée
a
qui accepte un entier et renvoie un float. Il appelle une fonction d'assistanceg
.Ungolfed:
Cette approche utilise une simplification de la formule de Wesley Ivan Hurt figurant dans OEIS. La simplification a été trouvée par Glen O, la même personne qui a rasé 26 octets de cette réponse!
la source
x^.5
plutôt quesqrt(x)
de sauvegarder 3 octets. Et(n==0)
enregistre 2 octets sur1÷(n+1)
. Et vous pouvez enregistrer 4 caractères supplémentaires en utilisantcos(π*sqrt(x))^2÷1
plutôt quefloor(cos(π*sqrt(x))^2)
. Aussi, utilisez1:n/2
plutôt que1:n÷2
parce qu'il n'y a pas de mal à utiliser un float dansg(x)
et qu'il sera verrouillé sur les entiers pour dei
toute façon. Etsum(i->g(i)g(n-i),1:n/2)
va raser d'autres personnages aussi.sum
astuce échouantn=0
cependant, j'ai donc gardé la compréhension du tableau.i=0
cas se produire dans la somme, vous pouvez activer le signe4g(n)
. Donc(n==0)-4g(n)-4g(n/2)+8sum(i->g(i)g(n-i),0:n/2)
, ce qui ne courra pas dans l'erreur. Mais vous pouvez faire encore mieux en notant les symétries -(n==0)+4sum([g(i)g(n-i)for i=1:n])
Pyth,
16 à15 octetsEssayez-le en ligne dans le compilateur Pyth .
Comment ça marche
la source
TI-BASIC, 23 octets
Assez simple.
Σ(
est la sommation.Étrangement,
sum(seq(sum(seq(
jette unERR:ILLEGAL NEST
, et doncΣ(Σ(
, mais toutsum(seq(Σ(
va bien. J'ai choisi de mettre leΣ(
à l'intérieur pour sauver un proche-paren.la source
sum
etΣ
?X²+Y²=Ans
valeurs de X entre-Ans
etAns
. sum (est la somme d'une liste , nous devons donc créer la liste d'abord en utilisant seq (..., Y, -Ans, AnsJavaScript (ES6),
6660 octets6 octets sauvegardés grâce à @ edc65 !
Explication
Tester
la source
n=>eval('for(r=0,a=~n;a++<n;)for(b=~n;b++<n;)r+=a*a+b*b==n')
eval
pour mettre lesfor
boucles dans une fonction de flèche sans parenthèses. J'ai aussi oublié l'~
opérateur haha.Python 3,
936269 octetsItertools ne fonctionnait pas, j'ai donc utilisé à nouveau deux plages, mais je l'ai déplacé pour économiser des octets.
Edit: Le code précédent ne fonctionnait pas vraiment, car j'avais défini la plage sur n avant de définir n.
la source
APL,
232019 octetsExplication:
Autre que le fait que APL n'a pas de J
i:
(nombres de -n à n), cela fonctionne assez bien comme la réponse J.Nous ne pouvons pas utiliser un train car obtenir le
-\⍳2×⍵
pour ne pas analyser comme(-\) ⍳ (2×⍵)
cela coûterait trois octets; de même avec une autre paire d'atops. Toutes ces parenthèses rendent la fonction régulière plus courte.Essayez ici . La sortie de
1
signifie que toutes les valeurs correspondent.la source
Matlab 41 octets
Encore plus petit que les réponses précédentes
Essentiellement, la réponse d'Agawa001 avec le pouvoir et le carré remplacés
la source
Candy ,
17 ans14 octetsEntrée poussée initialement sur la pile
~TbAT1C(sWs+Aeh)Z
~T0C(sWs+Aeh)Z
la source
CJam, 28 ans
Pas vraiment court, mais efficace. Par exemple, le résultat pour 15625 est instantanément de 28. Utilise la formule basée sur la factorisation d'OEIS.
Essayez-le en ligne
Explication:
Quelques détails sur le calcul:
(exponent + 1) & -1
, qui estexponent + 1
(exponent + 1) & 1
, qui est 0 si l'exposant est impair et 1 si mêmeToutes ces valeurs multipliées ensemble et multipliées par 4 sont exactement la formule OEIS.
la source
Python 2, 68 octets
Définit une fonction appelée
x()
qui prend un nombre n.Essayez-le en ligne. http://ideone.com/aRoxGF
la source
print
oureturn
.n=0
etn=1
(0 et 2 au lieu de 1 et 4). Peut-être que les limites de la plage doivent être ajustées?n+1
.Pyth,
4135333027 octetsEssayez-le en ligne.
Edit: Merci à isaacg , je suis arrivé
m
et*F
au travail! OUI!Modifier: Mettez le bitwise et retournez pour plus d'économies d'octets! De plus, j'ai enlevé tous les trucs "Anciennement". Il commençait à être encombré.
Merci à aditsu et à sa solution CJam, et à maltysen et ses astuces (Un jour, je me rendrai
m*Fd
au travail. Un jour ...)Notez que,
si le nombre premier est 1 mod 4, on obtient
-1 & (exponent + 1)
ce qui estexponent + 1
mais si le nombre premier est 3 mod 4, nous obtenons
1 & (exponent + 1)
, ce qui est0
si l'exposant est impair, et1
si mêmeMultipliez le tout ensemble (4 fois au début) et nous obtenons le nombre de sommes de deux carrés qui s'ajoutent à notre entrée.
la source
Python, 57 octets
Beau défi. Malheureusement, je n'ai pas le temps plus court que ça pour le moment.
la source
PARI / GP,
3428 octetsUtilisation des fonctions génératrices:
Enregistré 6 octets grâce à Mitch Schwartz .
Utilisation des fonctions intégrées, 33 octets (1 octet enregistré grâce à Mitch Schwartz .):
la source
matid(2)
enregistre un octet.n->sum(i=-n,n,x^i^2)^2\x^n%x
Matlab, 72 octets
la source
disp
de ce défi Luis! =)Matlab,
6350 octetsCeci bat l’autre code portant le même titre, je le résume donc: D.
Le programme trouve les solutions entières positives, puis multiplie par 4 pour englober les solutions négatives.
Il peut effectuer tous les 25 premiers cas de test
la source
disp
de ce défi ! =)format compact
=)JavaScript, 89 octets
Je sais que ce n'est pas la réponse JavaScript la plus courte, même si je devais supprimer les lignes d'e / s, mais je pense que c'est la réponse JS la plus performante qui m'a donné le résultat pour un million en quelques secondes (dix millions ont pris environ minute).
la source
PHP, 70 octets, pas en concurrence
algorithme dérobé à l’une des réponses Python ... j’ai oublié laquelle; voulait au moins partiellement comprendre ce qui se passait avant que je poste.
la source
for(;$x<=$n=$argv[1];)$s+=(-($n%(2*$x+1)<1))**$x++*4;echo$n?$s:1;
enregistre 5 octets.$x-~$x
est égal à2*$x+1
et vous pouvez maintenant commencer sans affecter la variable.