Conta le somme di due quadrati


45

Dato un numero non negativo n, fornire il numero di modi per esprimere ncome la somma di due quadrati di numeri interi n == a^2 + b^2( OEIS A004018 ). Si noti che ae bpuò essere positivo, negativo o pari a zero, e il loro ordine è importante. Vince il minor numero di byte.

Ad esempio, n=25dà 12perché 25può essere espresso come

(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

Ecco i valori fino a n=25. Fai attenzione a che il tuo codice funzioni 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

Ecco i valori fino a n=100come un elenco.

[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]

Curiosità: la sequenza contiene termini arbitrariamente alti e il limite della sua media corrente è π.

Classifica:


4
Aspetta cosa?? "La sequenza contiene termini arbitrariamente alti e il limite della sua media corrente è π."
— Stewie Griffin,

@StewieGriffin Le due affermazioni sono coerenti. Considera la sequenza 1,0,2,0,0,3,0,0,0,4,0,0,0,0,5,.... Tagliare la sequenza dopo ogni numero diverso da zero, la media finora è 1. E, le sequenze di 0 hanno sempre meno impatto in seguito nella sequenza.
— xnor

5
So che è coerente .. =) Avevo controllato i primi 10.000 numeri quando ho pubblicato il commento. Quello che non capisco è: perché mai è uguale a Pi?
— Stewie Griffin,

29
@StewieGriffin La somma dei termini fino a N corrisponde ai punti (a, b) con a ^ 2 + b ^ 2 <= N. Questi sono i punti reticolari nel cerchio di raggio sqrt (N), la cui area è πN.
— xnor

2
@xnor e ecco la magia :(
— Andras Deak

Risposte:


19

Python ( 59 57 56 byte)

lambda n:0**n+sum((-(n%(x-~x)<1))**x*4for x in range(n))

Demo online

Come per la mia risposta CJam, questa utilizza l'inversione di Möbius e scorre in tempo pseudoquasilineare.

Grazie a Sp3000 per un risparmio di 2 byte e feersum per 1.


1
Quelle parentesi sono fastidiose.
— lirtosiast

@ThomasKwa, parlamene. La cosa che mi ha davvero sorpreso, in una delle versioni che ho passato sulla strada per la prima che ho pubblicato, è stata -1**xsempre -1. Mi aspettavo -1che fosse un singolo token letterale intero anziché un meno unario a bassa precedenza seguito da uno.
— Peter Taylor,

2
Congratulazioni per la generosità! Il tuo codice è più corto di qualsiasi cosa mi sia venuta in mente. La tua soluzione si basa su un'idea matematica completamente nuova e inaspettata, e mi fa piacere che ciò sia possibile anche in una sfida così semplice. Il risultato inverso di Mobius è piuttosto carino e ho avuto il piacere di ricavare una prova per me stessa.
— xnor

1 byte può essere salvato spostando la moltiplicazione da 4 a dopo **x.
— feersum

@PeterTaylor Puoi elaborare come funziona il tuo algoritmo / puoi indicarmi una risorsa? Non riesco proprio a capire come applicare l'inversione di möbius al numero di somme del problema di suqares.
— flawr

15

Mathematica, 13 byte

Se sono consentiti i built-in, ecco come farlo in Mathematica.

2~SquaresR~#&

Per 0 <= n <= 100

2~SquaresR~# & /@ Range[0, 100]

{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}


1
Perché ovviamente Mathematica ha un built-in per questo.
— HyperNeutrino,

14

Python 2, 44 byte

f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2

Questo è quasi lo stesso della soluzione di xsot (che si basa sulla soluzione di Peter Taylor ), ma salva 8 byte semplificando il modo in cui i segni vengono gestiti.

Si noti che per un programma completo, è possibile salvare 2 byte nella funzione senza incorrere in un costo esterno alla funzione:

f=lambda n,x=1:x>n or(n%x<1)-f(n,x+2)/4<<2
print+f(input())

Due byte aggiuntivi per un programma completo in questo modo:

n=input()
f=lambda x:x>n or(n%x<1)-f(x+2)/4<<2
print+f(1)

Perché n > 0esiste una soluzione a 40 byte molto leggibile:

f=lambda n,x=1:n/x and(n%x<1)*4-f(n,x+2)

1
Complimenti per aver vinto la taglia! La sottrazione ricorsiva è un modo chiaro e breve per esprimere la somma alternata per divisori dispari senza bisogno di estrarre un segno dal divisore stesso. Inoltre, merito a xsot per aver semplificato la soluzione di Peter Taylor a una ricorsiva con una gestione intelligente di n = 0.
— xnor

12

Pyth, 13 byte

/sM^^R2}_QQ2Q

Suite di test

/sM^^R2}_QQ2Q
                 Q = eval(input())
       }_QQ      Inclusive range from -Q to Q (all possible a and b)
    ^R2          Map to their squares
   ^       2     Form all pairs
 sM              Sum pairs
/           Q    Count occurances of Q

In ritardo, ma non credo che tu abbia bisogno dell'ultimo Q.
— Erik the Outgolfer,

12

J, 16 byte

+/@,@:=+&*:/~@i:

Questo è un verbo monadico (in altre parole, una funzione unaria). Provalo online o guardalo passare tutti i casi di test .

Spiegazione

+/@,@:=+&*:/~@i:  Denote input by n
              i:  The array of integers from -n to n
           /~@    Take outer product wrt the following function:
       +           the sum of
        &*:        squares of both inputs
                  This results in a 2D array of a^2+b^2 for all a, b between -n and n
      =           Replace by 1 those entries that are equal to n, and others by 0
   ,@:            Flatten the binary matrix
+/@               Take its sum

11

Python 2, 69 55 53 52 byte

f=lambda n,x=1:+(x>n)or(2-x%4)*(n%x<1)+f(n,x+2)/4<<2

Questa è una funzione ricorsiva basata sull'eccellente soluzione di Peter Taylor .


1
Questo è un grande miglioramento. Ma c'è ancora un modo per renderlo più breve e ti incoraggio a cercarlo.
— xnor

1
@xnor Un altro byte in basso. Spero che tu non abbia più trucchi nelle maniche.
— xsot

2
Non so se devo fare una risposta di esso, è solo la soluzione più uno trucco: f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2. Inoltre, immagino che non ci interessi a superare la profondità massima di ricorsione predefinita?
— Mitch Schwartz,

1
@MitchSchwartz Penso che sia un incredibile miglioramento degno della generosità e probabilmente dell'ottimizzazione finale che xnor aveva in mente.
— xsot,

1
@MitchSchwartz Sì, questa è l'ottimizzazione a cui stavo pensando! E il /4<<2trucco di xsot lo rende più corto di quello che avevo.
— xnor

8

Julia, 40 byte

n->n>0?4sum(i->(n-i^2)^.5%1==0,1:n^.5):1

Ungolfed:

function f(n)
  if n==0
    return 1           # Handle special case of n=0
  else
    m=0                # Start the counter at zero
    for i=1:sqrt(n)    # Loop over the values (i) whose squares are
                       # less than n (except zero)
      k=sqrt(n-i^2)    # Find k such that n=k^2+i^2
      if k==floor(k)   # if k is an integer, we've found a pair
        m+=4           # Add one for each of k^2+i^2, (-k)^2+(-i)^2, and the other two
      end
    end
    return m           # Return the resulting count
  end
end

Nota che il ciclo non include i==0, perché quando nè un quadrato, è già incluso da i=sqrt(n), e ci sono solo quattro, non otto, per quel form ( 0^2+k^2, 0^2+(-k)^2, k^2+0^2, (-k)^2+0^2).


7

CJam, 25 23 byte

Zri:R#Ym*{Rf-Yf#:+R=},,

Questa è una soluzione teorica che richiede O (9 n ) tempo e memoria per l'ingresso n .

Al costo di un byte extra - per un totale di 24 byte - possiamo ridurre la complessità a O (n 2 ) :

ri:R)Y*Ym*{Rf-Yf#:+R=},,

Provalo online!

Come funziona

O

Z                  Push 3.
 ri:R              Read an integer from STDIN and save it in R.
     #             Compute 3**R.

o

ri:R               Read an integer from STDIN and save it in R.
    )Y*            Add 1 and multiply by 2.

Poi

Ym*                Take the second Cartesian power, i.e., compute all pairs.
   {          },   Filter the pairs:
    Rf-              Subtract R from each.
       Yf#           Square the differences.
          :+         Add the squares.
            R=       Compare with R.
                   If = pushed 1, keep the pair.
                ,  Count the kept pairs.

E con un risparmio di un byte è possibile ridurre la complessità a Õ (n)
— Peter Taylor,

Si, ho visto. È stupefacente.
— Dennis,

7

CJam ( 25 24 22 21 byte)

{:X!X{X\2*)%!4*\-}/z}

Demo online

Questo viene eseguito in tempo pseudoquasilineare * e utilizza la dichiarazione dell'OEIS che

La trasformata di Moebius è la sequenza del periodo 4 [4, 0, -4, 0, ...]. - Michael Somos, 17 settembre 2007

L'input 0 è ovviamente un caso speciale (le trasformazioni e gli annientatori di Möbius non vanno bene insieme), ma alla fine è costato solo un carattere.

* Pseudo- perché è quasilineare nel valore dell'input, non nella dimensione dell'input; quasi perché esegue Theta(n)operazioni su numeri interi di dimensioni nell'ordine di n; un'operazione bmod -bit dovrebbe richiedere b lg btempo, quindi nel complesso questo richiede Theta(n lg n lg lg n)tempo.


6

Japt , 42 37 33 byte

Japt è una versione abbreviata di Ja vaScri pt . Interprete

V=Un oU+1;Vr@X+(Vf_p2 +Y*Y¥U)l ,0

Come funziona

           // Implicit: U = input number
V=Un oU+1  // Set variable V to range(-U, U+1). Ends up like [-U,-U+1,...,U-1,U]
Vr@    ,0  // Reduce each item Y in V with this function, starting at 0:
X+(     l  //  Return the previous value X + the length of:
Vf_p2      //   V filtered by items Z where Z*Z
+Y*Y==U)   //    + Y*Y equals U.
           // This ends up as the combined length of all fitting pairs of squares.
           // Implicit: return last expression

Forse c'è una tecnica migliore; suggerimenti sono ben accetti


6

Python 3, 68 61 60 byte

lambda n:0**n+4*sum(i**.5%1+(n-i)**.5%1==0for i in range(n))

L'uso di due comprensioni nidificate è troppo costoso. Al contrario, controlla se entrambe le coordinate sul cerchio di raggio sqrt (n) sono numeri interi.

Peter Taylor lo ha battuto con un approccio basato sull'inversione di Moebius .


Molto bene. Stavo armeggiando con una funzione ricorsiva ma non sono riuscito a risolverlo n=0elegantemente.
— xsot,


5

Haskell, 42 byte

f n|q<-[-n..n]=sum[1|a<-q,b<-q,a*a+b*b==n]

Esempio di utilizzo:

*Main> map f [0..25]
[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]
*Main> 

3
Legare quna guardia è intelligente, ricorderò questo trucco.
— xnor

5

Julia, 89 79 63 byte

g(x)=cos(π*x^.5)^2÷1
a(n)=(n==0)+4sum([g(i)g(n-i)for i=1:n])

Questa è una funzione denominata ache accetta un numero intero e restituisce un float. Chiama una funzione di aiuto g.

Ungolfed:

function g(x::Integer)
    floor(cos(π*sqrt(x))^2)
end

function a(n::Integer)
    (n == 0) + 4*sum([g(i)*g(n-i) for i=1:n])
end

L'approccio qui utilizza una semplificazione della formula di Wesley Ivan Hurt elencata su OEIS. La semplificazione è stata trovata da Glen O, la stessa persona che ha eliminato 26 byte di questa risposta!


Utilizzare x^.5invece di sqrt(x)salvare 3 byte. E (n==0)salva oltre 2 byte 1÷(n+1). E puoi salvare altri 4 caratteri usando cos(π*sqrt(x))^2÷1invece di floor(cos(π*sqrt(x))^2). Inoltre, usa 1:n/2piuttosto che 1:n÷2, perché non c'è nulla di male nell'usare un float g(x)e sarà comunque bloccato sugli interi i. E sum(i->g(i)g(n-i),1:n/2)raderà anche altri personaggi.
— Glen O,

@GlenO Ottimi suggerimenti, grazie. Il sumtrucco però non riesce n=0, quindi ho mantenuto la comprensione dell'array.
— Alex A.

1
Quindi, può essere recuperato: se lasci che il i=0caso si verifichi nella somma, puoi attivare il segno 4g(n). Quindi (n==0)-4g(n)-4g(n/2)+8sum(i->g(i)g(n-i),0:n/2), che non si imbatterà nell'errore. Ma puoi fare ancora meglio, notando le simmetrie -(n==0)+4sum([g(i)g(n-i)for i=1:n])
— Glen O

@GlenO Questa semplificazione è seriamente geniale. Ti consiglio di inviarlo come formula alternativa per la sequenza su OEIS!
— Alex A.

4

Pyth, 16 15 byte

lfqQs^R2T^}_QQ2

Provalo online nel compilatore Pyth .

Come funziona

lfqQs^R2T^}_QQ2

          }_QQ   Compute the inclusive range from -Q to Q (input).
         ^    2  Take the second Cartesian power, i.e., compute all pairs.
 f               Filter; for each T in the list of pairs:
     ^R2T          Compute the squares of T's elements.
    s              Add the squares.
  qQ               Compare the sum with Q.
                 If q returned True, keep T.
l                Count the kept pairs.

4

TI-BASIC, 23 byte

sum(seq(Σ(X²+Y²=Ans,X,-Ans,Ans),Y,-Ans,Ans

Abbastanza diretto. Σ(è la somma.

Stranamente, sum(seq(sum(seq(lancia un ERR:ILLEGAL NEST, e così fa Σ(Σ(, ma sum(seq(Σ(va bene. Ho scelto di mettere l' Σ(interno per salvare un paren vicino.


Qual è la differenza tra sume Σ?
— alephalpha,

1
@alephalpha Σ (prende una somma, sommando tutti i X²+Y²=Ansvalori di X tra -Anse Ans. sum (è la somma di una lista , quindi dobbiamo prima creare la lista usando seq (..., Y, -Ans, Ans
— lirtosiast

4

JavaScript (ES6), 66 60 byte

n=>eval("for(r=0,a=~n;a++<n;)for(b=~n;b++<n;)r+=a*a+b*b==n")

6 byte salvati grazie a @ edc65 !

Spiegazione

n=>eval(`              // use eval to allow for loops in an unparenthesised arrow function
  for(r=0,             // r = number of pairs
    a=~n;a++<n;        // a = first number to square
  )
      for(b=~n;b++<n;) // b = second number to square
        r+=a*a+b*b==n  // add one to the result if a^2 + b^2 == n
                       // implicit: return r
`)

Test

n = <input type="number" oninput='result.innerHTML=(

n=>eval("for(r=0,a=~n;a++<n;)for(b=~n;b++<n;)r+=a*a+b*b==n")

)(+this.value)' /><pre id="result"></pre>


1
60:n=>eval('for(r=0,a=~n;a++<n;)for(b=~n;b++<n;)r+=a*a+b*b==n')
— edc65,

@ edc65 Nice! Non pensavo di usare evalper mettere i forloop in una funzione freccia senza parentesi. Mi sono anche dimenticato ~dell'operatore haha.
— user81655,

4

Python 3, 93 62 69 byte

Itertools non funzionava, quindi ho usato di nuovo due intervalli, ma ho spostato l'intervallo per salvare byte.

Modifica: il codice precedente in realtà non funzionava, poiché ho definito l'intervallo su n prima di aver definito n.

lambda n:sum(i*i+j*j==n for i in range(-n,n+1)for j in range(-n,n+1))

2

APL, 23 20 19 byte

{+/⍵=∊∘.+⍨×⍨0,,⍨⍳⍵}

Spiegazione:

{+/⍵=∊∘.+⍨×⍨0,,⍨⍳⍵}        Monadic function:
                 ⍳⍵          1 2 3 ... ⍵
               ,⍨            Duplicate
             0,              Concatenate to 0
          ×⍨                 Square everything
      ∘.+⍨                   Make an addition table
     ∊                       Flatten
   ⍵=                        1s where equal to the input
 +/                          Sum up the 1s

A parte il fatto che APL non ha la funzione di J i:(numeri da -n a n), questo funziona praticamente come la risposta di J.

Non possiamo usare un treno perché ottenere il -\⍳2×⍵non analizzare in quanto (-\) ⍳ (2×⍵)costerebbe tre byte; allo stesso modo con un'altra coppia di top. Tutte quelle parentesi riducono la funzione regolare.

Provalo qui . L'output di 1significa che tutti i valori corrispondono.


2

Matlab 41 byte

Ancora più piccolo delle risposte precedenti

@(n)nnz(~mod(sqrt(n-(1:n^.5).^2),1))*4+~n

Sostanzialmente sostituita la risposta di Agawa001 con potenza e sqrt


2

Candy , 17 14 byte

Input inserito inizialmente nello stack

~TbAT1C(sWs+Aeh)Z

~T0C(sWs+Aeh)Z

peekA    # copy arg from stack to register A
range2   # create double sided range on stack, -A, 1-A, ... A-1, A
digit0   # prefix argument to 'cart', 
cart     # cartesian product of current stack(0), and other stack(0)
while    # while stack not empty
  sqr    # pop and square and push
  swap   # swap two stack elements
  sqr    # pop and square and push
  add    # pop and pop and add and push
  pushA  # push original argument
  equal  # equality test 0/1
  popAddZ  # Z := Z + pop
endwhile
pushZ    # push Z onto stack, will be output to stdout on termination

2

CJam, 28

qi_mF{3a>},{~)\4%2-&}%4+:*1?

Non molto breve, ma efficiente. Ad esempio, il risultato per 15625 è immediatamente 28. Utilizza la formula basata sulla fattorizzazione di OEIS.
Provalo online

Spiegazione:

qi       read input and convert to integer
_        make a copy (will be used to handle the 0 case at the end)
mF       factorize into [prime exponent] pairs
{…},     filter the array of pairs
  3a>    with the condition that the pair is greater than [3]
          which means the prime factor must be ⩾3
{…}%     transform each pair as follows:
  ~      dump the prime factor and exponent onto the stack
  )      increment the exponent
  \      swap with the prime
  4%     get the remainder mod 4 (it will be 1 or 3)
  2-     subtract 2 (resulting in -1 or 1)
  &      bitwise AND with the incremented exponent (see below)
4+       append a 4 to the array
:*       multiply all
1?       if the input was 0, use 1, else use the above result

Alcuni dettagli sul calcolo:

  • se il primo è 1 mod 4, il codice calcola (exponent + 1) & -1 , che èexponent + 1
  • se il primo è 3 mod 4, il codice calcola (exponent + 1) & 1, che è 0 se l'esponente è dispari e 1 se pari

Tutti questi valori moltiplicati insieme e moltiplicati per 4 sono esattamente la formula OEIS.


2

Python 2, 68 byte

def x(n):r=range(-n,n+1);print sum(a*a+b*b==n for a in r for b in r)

Definisce una funzione chiamata x() che accetta un numero n.

Provalo online. http://ideone.com/aRoxGF


Manca un'istruzione printo return.
— Zgarb,

Grazie, mi ero completamente dimenticato. Il collegamento ha però la dichiarazione di stampa. Ho modificato il mio codice mentre lo stavo realizzando.
— Rɪᴋᴇʀ

Ok non ti preoccupare. Ma questo sembra anche dare risultati errati per n=0e n=1(0 e 2 invece di 1 e 4). Forse i limiti di portata devono essere regolati?
— Zgarb,

@Zgarb Sì, dovrebbero finire a n+1.
— lirtosiast,

1
Lo cercherò.
— Rɪᴋᴇʀ

2

Pyth, 41 35 33 30 27 byte

Provalo online.

Modifica: grazie a isaacg , ho ottenuto me *Fal lavoro! SÌ!

?Q*F+4m.&tt%ed4hhdr-PQ2 8 1
                                (implicit) Q = input()
?Q                              If Q != 0
      m                           Map to d (exponent, prime) from ...
                  r-PQ2 8         run-length-encoded(PQ with 2's removed)
       .&                           Bitwise and
           %ed4                       d[-1] % 4
         tt                           -2
                hd                  with d[0]
               h                      +1
    +4                            Append 4 to the resulting array
  *F                              Then multiply it all together
                          1     Else 1

Modificare: inserisci bit a bit e reinseriscilo per ulteriori risparmi di byte! Inoltre ho rimosso tutte le cose "precedentemente". Stava iniziando a essere ingombra.

Grazie ad aditsu e alla sua soluzione CJam, a Maltysen e ai suoi consigli (un giorno mi metterò m*Fdal lavoro. Un giorno ...)

J4Vr-PQ2 8=J*J.&tt%eN4hhN;?QJ1
                                (implicit) Q=input()
J4                              J=4
    -PQ2                        Remove all 2's from the prime factorization of Q
   r     8                      run-length encode (exponent, prime factor)
  V                      ;      For N in range( the above ):
          =J*J                      J = J * ...
                tt%eN4                N[-1] mod 4 -2 
                      hhN             (exponent + 1)
              .&                    bitwise and
                          ?QJ1  if Q != 0 print(J) else print(1)

Nota che,

  • se il primo è 1 mod 4, otteniamo -1 & (exponent + 1), che èexponent + 1

  • ma se il primo è 3 mod 4, otteniamo 1 & (exponent + 1), ovvero 0se l'esponente è dispari e 1se pari

Moltiplica tutto insieme (volte 4 all'inizio) e otteniamo il numero di somme di due quadrati che si sommano al nostro input.


2

Python, 57 byte

Bella sfida. Purtroppo al momento non lo sto diventando più corto di così.

lambda n:0**n+sum(2-d%4for d in range(1,n+1)if d%2>n%d)*4

2

PARI / GP, 34 28 byte

Utilizzo delle funzioni di generazione:

Risparmiato 6 byte grazie a Mitch Schwartz .

n->sum(i=-n,n,x^i^2)^2\x^n%x

Utilizzando built-in, 33 byte (salvato 1 byte grazie a Mitch Schwartz .):

n->if(n,2*qfrep(matid(2),n)[n],1)

qfrep (q, B, {flag = 0}): vettore di (metà) il numero di vettori di norme da 1 a B per la forma quadratica integrale e definita q. Se flag è 1, conta i vettori di norma pari da 1 a 2B.



matid(2)salva un byte.
— Mitch Schwartz,

1
E fino a 28 per l'approccio della funzione generatrice:n->sum(i=-n,n,x^i^2)^2\x^n%x
— Mitch Schwartz


1

Matlab, 63 50 byte

@(y)nnz(~mod(sqrt(y-power((1:sqrt(y)),2)),1))*4+~y

  • Questo batte l'altro codice con lo stesso titolo, quindi lo metto: D.

  • Il programma trova le soluzioni di numero intero positivo, quindi moltiplica per 4 per comprendere quelle negative.

  • Può eseguire tutti e 25 i primi casi di test

    for i=1:25 ans(i)
    end
    
       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
    


grazie @StewieGriffin l'ho incluso proprio come un gioco leale relativo a quello di luis
— Abr001am

Suggerimenti: quando prevedi di pubblicare i risultati da MATLAB, usa format compact=)
— Stewie Griffin,

1

JavaScript, 89 byte

n=prompt()
p=Math.pow
for (x=c=(+n?0:1);x<=n;x++)if(x&&p(n-p(x,2),.5)%1===0)c+=4
alert(c)

So che questa non è la risposta JavaScript più breve anche se dovessi rimuovere le linee di I / O, ma penso che sia la risposta JS più performante che mi dà il risultato per un milione in pochi secondi (dieci milioni hanno impiegato circa un minuto).


Puoi usare == invece di ===?
— lirtosiast

Potrei, usando solo le migliori pratiche, ah ah.
— Adam Dally,

1

PHP, 70 byte, non in competizione

for($x=-1;$x++<=$n=$argv[1];)$s+=(-($n%($x-~$x)<1))**$x*4;echo$n?$s:1;

algoritmo rubato da una delle risposte di Python ... Ho dimenticato quale; volevo capire almeno in parte quello che sta succedendo prima che pubblicassi.


for(;$x<=$n=$argv[1];)$s+=(-($n%(2*$x+1)<1))**$x++*4;echo$n?$s:1;salva 5 byte. $x-~$xè uguale a 2*$x+1e ora puoi iniziare senza assegnare la variabile.
— Jörg Hülsermann,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.