Dado um número não negativo n
, imprima o número de maneiras de expressar n
como a soma de dois quadrados de números inteiros n == a^2 + b^2
( OEIS A004018 ). Observe que a
e b
pode ser positivo, negativo ou zero, e sua ordem é importante. Menos bytes ganha.
Por exemplo, n=25
dá 12
porque 25
pode ser expresso como
(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
Aqui estão os valores até n=25
. Tenha cuidado para que seu código funcione 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
Aqui estão os valores até n=100
como uma lista.
[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]
Curiosidades: a sequência contém termos arbitrariamente altos e o limite de sua média atual é π.
Entre os melhores:
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,...
. Cortando a sequência após qualquer número diferente de zero, a média até agora é 1. E, as execuções de 0 têm cada vez menos impacto posteriormente na sequência.Respostas:
Python (
59 5756 bytes)Demonstração online
Como na minha resposta CJam, isso usa a inversão de Möbius e é executado em tempo pseudoquasilinear.
Obrigado ao Sp3000 pela economia de 2 bytes e ao feersum por 1.
fonte
-1**x
é sempre-1
. Eu esperava-1
que fosse um token literal inteiro único, em vez de um unário de baixa precedência menos um seguido por um.**x
.Mathematica, 13 bytes
Se os internos forem permitidos, é assim que se faz no Mathematica.
Para 0 <= n <= 100
fonte
Python 2, 44 bytes
É quase o mesmo que a solução do xsot (que é baseada na solução de Peter Taylor ), mas economiza 8 bytes, simplificando a maneira como os sinais são tratados.
Observe que, para um programa completo, podemos salvar 2 bytes na função sem incorrer em custos fora da função:
Dois bytes adicionais para um programa completo desta maneira:
Pois
n > 0
existe uma solução muito legível de 40 bytes:fonte
Pitão, 13 bytes
Suíte de teste
fonte
Q
.J, 16 bytes
Este é um verbo monádico (em outras palavras, uma função unária). Experimente online ou veja passar em todos os casos de teste .
Explicação
fonte
Python 2,
69555352 bytesEsta é uma função recursiva baseada na excelente solução de Peter Taylor .
fonte
f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2
. Além disso, acho que não nos preocupamos em exceder a profundidade de recursão máxima padrão?/4<<2
truque do xsot o torna mais curto do que eu tinha.Julia, 40 bytes
Ungolfed:
Observe que o loop não inclui
i==0
, porque quandon
é um quadrado, ele já está incluídoi=sqrt(n)
e existem apenas quatro, e não oito, para esse formulário (0^2+k^2, 0^2+(-k)^2, k^2+0^2, (-k)^2+0^2
).fonte
CJam,
2523 bytesEsta é uma solução teórica que requer tempo e memória O (9 n ) para a entrada n .
Ao custo de um byte extra - para um total de 24 bytes - podemos reduzir a complexidade para O (n 2 ) :
Experimente online!
Como funciona
Ou
ou
Então
fonte
CJam (
25 24 2221 bytes)Demonstração online
Isso é executado em tempo pseudoquasilinear * e usa a declaração do OEIS que
A entrada
0
é obviamente um caso especial (as transformações e aniquiladores da Möbius não combinam bem), mas acabou custando apenas um caractere.* Pseudo- porque é quase linear no valor da entrada, não no tamanho da entrada; quase porque faz
Theta(n)
operações em números inteiros de tamanho na ordem den
; umab
operação de mod de bits deve levarb lg b
tempo; portanto, no geral, isso levaTheta(n lg n lg lg n)
tempo.fonte
Japonês ,
423733 bytesJapt é uma versão abreviada de Ja vaScri pt . Intérprete
Como funciona
Talvez exista uma técnica melhor; sugestões são bem vindas.
fonte
Python 3,
686160 bytesUsar duas compreensões de lista aninhadas é muito caro. Em vez disso, isso verifica se as duas coordenadas no círculo do raio sqrt (n) são inteiros.
Peter Taylor venceu isso com uma abordagem baseada na inversão de Moebius .
fonte
n=0
elegância.Oitava, 28 bytes
fonte
Haskell, 42 bytes
Exapmle do uso:
fonte
q
um guarda é inteligente, lembrarei desse truque.Julia,
897963 bytesEsta é uma função nomeada
a
que aceita um número inteiro e retorna um número flutuante. Chama uma função auxiliarg
.Ungolfed:
A abordagem aqui usa uma simplificação da fórmula de Wesley Ivan Hurt listada no OEIS. A simplificação foi encontrada por Glen O, a mesma pessoa que raspou 26 bytes nesta resposta!
fonte
x^.5
vez desqrt(x)
salvar 3 bytes. E(n==0)
economiza 2 bytes1÷(n+1)
. E você pode salvar mais 4 caracteres usando emcos(π*sqrt(x))^2÷1
vez defloor(cos(π*sqrt(x))^2)
. Além disso, use em1:n/2
vez de1:n÷2
, porque não há mal em usar um floatg(x)
e ele ficará bloqueado para os números inteiros dei
qualquer maneira. Esum(i->g(i)g(n-i),1:n/2)
também raspará mais alguns personagens.sum
truque falha porn=0
isso, então eu mantive a compreensão da matriz.i=0
caso acontecer na soma, poderá ativar o sinal4g(n)
. Portanto(n==0)-4g(n)-4g(n/2)+8sum(i->g(i)g(n-i),0:n/2)
, o que não ocorrerá no erro. Mas você pode fazer ainda melhor, observando as simetrias -(n==0)+4sum([g(i)g(n-i)for i=1:n])
Pitão,
1615 bytesExperimente online no Pyth Compiler .
Como funciona
fonte
TI-BASIC, 23 bytes
Bem direto.
Σ(
é somatório.Estranhamente,
sum(seq(sum(seq(
lança umERR:ILLEGAL NEST
, e o mesmo aconteceΣ(Σ(
, massum(seq(Σ(
está bem. Eu escolhi colocar oΣ(
interior para salvar um parente próximo.fonte
sum
eΣ
?X²+Y²=Ans
valores de X entre-Ans
eAns
. sum (é a soma de uma lista , portanto, precisamos criar a lista primeiro usando seq (..., Y, -Ans, AnsJavaScript (ES6),
6660 bytes6 bytes salvos graças a @ edc65 !
Explicação
Teste
fonte
n=>eval('for(r=0,a=~n;a++<n;)for(b=~n;b++<n;)r+=a*a+b*b==n')
eval
osfor
loops em uma função de seta sem parênteses. Eu também esqueci o~
operador haha.Python 3,
936269 bytesO Itertools não estava funcionando, então usei dois intervalos novamente, mas movi o intervalo para salvar bytes.
Editar: o código anterior não funcionou, pois defini o intervalo acima de n antes de definir n.
fonte
APL,
232019 bytesExplicação:
Além do fato de que o APL não possui J's
i:
(números de -n a n), isso funciona da mesma forma que a resposta J.Não podemos usar um trem porque obter o
-\⍳2×⍵
não analisar como(-\) ⍳ (2×⍵)
custaria três bytes; da mesma forma com outro par de atops. Todos esses parênteses tornam a função regular mais curta.Experimente aqui . A saída de
1
significa que todos os valores correspondem.fonte
Matlab 41 bytes
Ainda menor que as respostas anteriores
Essencialmente, a resposta da Agawa001 com energia e sqrt substituídos
fonte
Doces ,
1714 bytesEntrada empurrada para a pilha inicialmente
~TbAT1C(sWs+Aeh)Z
~T0C(sWs+Aeh)Z
fonte
CJam, 28
Não é realmente curto, mas eficiente. Por exemplo, o resultado para 15625 é instantaneamente 28. Usa a fórmula baseada em fatoração da OEIS.
Experimente online
Explicação:
Alguns detalhes sobre o cálculo:
(exponent + 1) & -1
, que éexponent + 1
(exponent + 1) & 1
, que é 0 se o expoente for ímpar e 1 se for parTodos esses valores multiplicados juntos e multiplicados por 4 são exatamente a fórmula OEIS.
fonte
Python 2, 68 bytes
Define uma função chamada
x()
que leva um número n.Experimente online. http://ideone.com/aRoxGF
fonte
print
oureturn
.n=0
en=1
(0 e 2 em vez de 1 e 4). Talvez os limites de alcance precisem ser ajustados?n+1
.Pitão,
4135333027 bytesExperimente online.
Edit: Graças a isaacg , eu consegui
m
e*F
trabalhei! SIM!Editar: Coloque o bit a bit e volte para economizar mais bytes! Também removi todas as coisas "Anteriormente". Estava começando a ficar confuso.
Graças ao aditsu e à sua solução CJam, e ao maltysen e suas dicas (um dia vou começar
m*Fd
a trabalhar. Um dia ...)Observe que,
se o primo é 1 mod 4, obtemos
-1 & (exponent + 1)
, que éexponent + 1
mas se o primo for 3 mod 4, obtemos
1 & (exponent + 1)
, que é0
se o expoente for ímpar e1
se for parMultiplique tudo isso juntos (vezes 4 no início) e obteremos o número de somas de dois quadrados que somam nossa entrada.
fonte
Python, 57 bytes
Bom desafio. Infelizmente, não estou conseguindo mais curto do que isso no momento.
fonte
PARI / GP,
3428 bytesUsando funções geradoras:
Economizou 6 bytes graças a Mitch Schwartz .
Usando built-ins, 33 bytes (economizados 1 byte graças a Mitch Schwartz .):
fonte
matid(2)
salva um byte.n->sum(i=-n,n,x^i^2)^2\x^n%x
Matlab, 72 bytes
fonte
disp
neste desafio Luis! =)Matlab,
6350 bytesIsso supera o outro código com o mesmo título, assim eu coloco: D.
O programa encontra as soluções inteiras positivas e multiplica por 4 para incluir as negativas.
Pode executar todos os 25 primeiros casos de teste
fonte
disp
neste desafio ! =)format compact
=)JavaScript, 89 bytes
Sei que essa não é a resposta JavaScript mais curta, mesmo que eu remova as linhas de E / S, mas acho que é a resposta JS com melhor desempenho, fornecendo o resultado para um milhão em alguns segundos (dez milhões demoravam cerca de minuto).
fonte
PHP, 70 bytes, não competindo
algoritmo roubado de uma das respostas do Python ... esqueci qual; queria entender pelo menos parcialmente o que está acontecendo antes de eu postar.
fonte
for(;$x<=$n=$argv[1];)$s+=(-($n%(2*$x+1)<1))**$x++*4;echo$n?$s:1;
economiza 5 bytes.$x-~$x
é igual a2*$x+1
e agora você pode iniciar sem atribuir a variável.