Dado un número no negativo n
, genera el número de formas de expresar n
como la suma de dos cuadrados de enteros n == a^2 + b^2
( OEIS A004018 ). Tenga en cuenta que a
y b
puede ser positivo, negativo o cero, y su orden es importante. Pocos bytes ganan.
Por ejemplo, n=25
da 12
porque 25
se puede expresar 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
Aquí están los valores hasta n=25
. Tenga cuidado de que su 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
Aquí están los valores hasta en n=100
una 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]
Datos curiosos: la secuencia contiene términos que son arbitrariamente altos, y el límite de su promedio de ejecución es π.
Tabla de clasificación:
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 la secuencia después de cualquier número distinto de cero, el promedio hasta ahora es 1. Y, las corridas de 0 tienen cada vez menos impacto en la secuencia.Respuestas:
Python (
59 5756 bytes)Demostración en línea
Al igual que con mi respuesta de CJam, esto utiliza la inversión de Möbius y se ejecuta en tiempo pseudoquasilineal.
Gracias a Sp3000 por el ahorro de 2 bytes y feersum por 1.
fuente
-1**x
siempre es así-1
. Esperaba-1
que fuera un token literal entero único en lugar de un unario menos de baja precedencia seguido de uno.**x
.Mathematica, 13 bytes
Si se permiten incorporados, esta es la forma de hacerlo en Mathematica.
Para 0 <= n <= 100
fuente
Python 2, 44 bytes
Esto es casi lo mismo que la solución de xsot (que se basa en la solución de Peter Taylor ), pero ahorra 8 bytes al simplificar la forma en que se manejan los signos.
Tenga en cuenta que para un programa completo, podemos guardar 2 bytes en la función sin incurrir en un costo fuera de la función:
Dos bytes adicionales para un programa completo de esta manera:
Porque
n > 0
hay una solución de 40 bytes muy legible:fuente
Pyth, 13 bytes
Banco de pruebas
fuente
Q
.J, 16 bytes
Este es un verbo monádico (en otras palabras, una función unaria). Pruébelo en línea o vea cómo pasa todos los casos de prueba .
Explicación
fuente
Python 2,
69555352 bytesEsta es una función recursiva basada en la excelente solución de Peter Taylor .
fuente
f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2
. Además, supongo que no nos importa exceder la profundidad de recursión máxima predeterminada./4<<2
truco de xsot lo hace más corto que el que tenía.Julia, 40 bytes
Sin golf:
Tenga en cuenta que el ciclo no incluye
i==0
, porque cuandon
es un cuadrado, ya está incluido pori=sqrt(n)
, y solo hay cuatro, no ocho, para esa forma (0^2+k^2, 0^2+(-k)^2, k^2+0^2, (-k)^2+0^2
).fuente
CJam,
2523 bytesEsta es una solución teórica que requiere O (9 n ) tiempo y memoria para la entrada n .
A costa de un byte adicional, para un total de 24 bytes , podemos reducir la complejidad a O (n 2 ) :
Pruébalo en línea!
Cómo funciona
Ya sea
o
Entonces
fuente
CJam (
25 24 2221 bytes)Demostración en línea
Esto se ejecuta en tiempo pseudoquasilineal * y usa la declaración del OEIS que
La entrada
0
es obviamente un caso especial (las transformaciones de Möbius y los aniquiladores no van bien juntos), pero terminaron costando solo un personaje.* Pseudo- porque es cuasilineal en el valor de la entrada, no en el tamaño de la entrada; cuasi porque realiza
Theta(n)
operaciones en enteros de tamaño del orden den
; Unab
operación de mod de bits debería llevarb lg b
tiempo, por lo que en general esto llevaTheta(n lg n lg lg n)
tiempo.fuente
Japt ,
423733 bytesJapt es una versión abreviada de Ja vaScri pt . Interprete
Cómo funciona
Quizás haya una mejor técnica; Las sugerencias son bienvenidas.
fuente
Python 3,
686160 bytesUsar dos comprensiones de listas anidadas es demasiado costoso. En cambio, esto verifica si ambas coordenadas en el círculo de radio sqrt (n) son enteros.
Peter Taylor ha superado esto con un enfoque basado en la inversión de Moebius .
fuente
n=0
elegancia.Octava, 28 bytes
fuente
Haskell, 42 bytes
Uso exapmle:
fuente
q
a un guardia es inteligente, recordaré este truco.Julia,
897963 bytesEsta es una función con nombre
a
que acepta un número entero y devuelve un flotante. Llama a una función auxiliarg
.Sin golf:
El enfoque aquí utiliza una simplificación de la fórmula de Wesley Ivan Hurt que figura en OEIS. ¡Glen O, la misma persona que recortó 26 bytes de esta respuesta, encontró la simplificación!
fuente
x^.5
lugar desqrt(x)
guardar 3 bytes. Y(n==0)
ahorra 2 bytes más1÷(n+1)
. Y puede guardar 4 caracteres más utilizando encos(π*sqrt(x))^2÷1
lugar defloor(cos(π*sqrt(x))^2)
. Además, use en1:n/2
lugar de1:n÷2
, porque no hay daño al usar un flotadorg(x)
y dei
todos modos estará bloqueado a los enteros . Ysum(i->g(i)g(n-i),1:n/2)
afeitará algunos personajes más, también.sum
truco fallan=0
, así que mantuve la comprensión de la matriz.i=0
caso suceda en la suma, puede activar el inicio de sesión4g(n)
. Entonces(n==0)-4g(n)-4g(n/2)+8sum(i->g(i)g(n-i),0:n/2)
, lo que no se encontrará con el error. Pero puedes hacerlo aún mejor, observando las simetrías ...(n==0)+4sum([g(i)g(n-i)for i=1:n])
Pyth,
1615 bytesPruébelo en línea en el compilador Pyth .
Cómo funciona
fuente
TI-BASIC, 23 bytes
Muy claro.
Σ(
es sumatoria.Extrañamente,
sum(seq(sum(seq(
lanza unERR:ILLEGAL NEST
, y lo haceΣ(Σ(
, perosum(seq(Σ(
está bien. Elegí poner elΣ(
interior para salvar a un pariente cercano.fuente
sum
yΣ
?X²+Y²=Ans
valores de X de entre-Ans
yAns
. sum (es la suma de una lista , por lo que debemos crear la lista primero usando seq (..., Y, -Ans, AnsJavaScript (ES6),
6660 bytes¡6 bytes guardados gracias a @ edc65 !
Explicación
Prueba
fuente
n=>eval('for(r=0,a=~n;a++<n;)for(b=~n;b++<n;)r+=a*a+b*b==n')
eval
para poner losfor
bucles en una función de flecha sin paréntesis. También me olvidé del~
operador jaja.Python 3,
936269 bytesItertools no funcionaba, así que volví a usar dos rangos, pero moví el rango para guardar bytes.
Editar: el código anterior en realidad no funcionó, ya que definí el rango sobre n antes de definir n.
fuente
APL,
232019 bytesExplicación:
Aparte del hecho de que APL no tiene la función J
i:
(números de -n a n), esto funciona más o menos como la respuesta J.No podemos usar un tren porque hacer
-\⍳2×⍵
que no se analice como(-\) ⍳ (2×⍵)
costaría tres bytes; de manera similar con otro par de atops. Todos esos paréntesis acortan la función regular.Pruébalo aquí . La salida de
1
significa que todos los valores coinciden.fuente
Matlab 41 bytes
Incluso más pequeño que las respuestas anteriores.
Esencialmente, la respuesta de Agawa001 con potencia y sqrt reemplazados
fuente
Candy ,
1714 bytesEntrada empujada a la pila inicialmente
~TbAT1C(sWs+Aeh)Z
~T0C(sWs+Aeh)Z
fuente
CJam, 28
No realmente corto, pero eficiente. Por ejemplo, el resultado para 15625 es instantáneamente 28. Utiliza la fórmula basada en factorización de OEIS.
Pruébalo en línea
Explicación:
Algunos detalles sobre el cálculo:
(exponent + 1) & -1
, que esexponent + 1
(exponent + 1) & 1
, que es 0 si el exponente es impar y 1 si es parTodos estos valores multiplicados juntos y multiplicados por 4 son exactamente la fórmula OEIS.
fuente
Python 2, 68 bytes
Define una función llamada
x()
que toma un número n.Pruébalo en línea. http://ideone.com/aRoxGF
fuente
print
oreturn
.n=0
yn=1
(0 y 2 en lugar de 1 y 4). Tal vez los límites de rango necesitan ajuste?n+1
.Pyth,
4135333027 bytesPruébalo en línea.
Editar: Gracias a isaacg , tengo
m
y*F
para trabajar! ¡SI!Editar: ¡ Ponga el bit a bit y vuelva para obtener más ahorros de bytes! También eliminé todas las cosas "Anteriormente". Estaba empezando a estar abarrotado.
Gracias a aditsu y su solución CJam, y a maltysen y sus consejos (algún día iré
m*Fd
a trabajar. Un día ...)Tenga en cuenta que,
si el primo es 1 mod 4, obtenemos
-1 & (exponent + 1)
, que esexponent + 1
pero si el primo es 3 mod 4, obtenemos
1 & (exponent + 1)
, que es0
si el exponente es impar, y1
si es parMultiplique todo junto (multiplicado por 4 al principio) y obtenemos el número de sumas de dos cuadrados que se suman a nuestra entrada.
fuente
Python, 57 bytes
Buen desafío Desafortunadamente, no lo estoy haciendo más corto que esto en este momento.
fuente
PARI / GP,
3428 bytesUsando funciones generadoras:
Guardado 6 bytes gracias a Mitch Schwartz .
Utilizando incorporados, 33 bytes (1 byte guardado gracias a Mitch Schwartz ):
fuente
matid(2)
Guarda un byte.n->sum(i=-n,n,x^i^2)^2\x^n%x
Matlab, 72 bytes
fuente
disp
en este desafío Luis! =)Matlab,
6350 bytesEsto supera al otro código con el mismo derecho, por lo que lo pongo: D.
El programa encuentra las soluciones enteras positivas y luego las multiplica por 4 para abarcar las negativas.
Puede realizar los 25 primeros casos de prueba
fuente
disp
en este desafío ! =)format compact
=)JavaScript, 89 bytes
Sé que esta no es la respuesta de JavaScript más corta, incluso si tuviera que eliminar las líneas de E / S, pero creo que es la respuesta JS de mejor rendimiento que me da el resultado de un millón en unos segundos (diez millones tomaron aproximadamente un minuto).
fuente
PHP, 70 bytes, no compitiendo
algoritmo robado de una de las respuestas de Python ... Olvidé cuál; Quería entender al menos parcialmente lo que está sucediendo antes de publicar.
fuente
for(;$x<=$n=$argv[1];)$s+=(-($n%(2*$x+1)<1))**$x++*4;echo$n?$s:1;
ahorra 5 bytes.$x-~$x
es igual a2*$x+1
y ahora puede comenzar sin asignar la variable.