İki karenin toplamını say


45

Negatif olmayan bir sayı verildiğinde , iki tam sayı karesinin toplamı olarak nifade etme yollarının sayısını verin ( OEIS A004018 ). Not olduğunu ve pozitif, negatif veya sıfır, ve sıralarının konularda olabilir. En az bayt kazanır.nn == a^2 + b^2ab

Örneğin, n=25verir 12çünkü 25olarak ifade edilebilir

(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

İşte değerlere kadar n=25. Kodunuzun çalıştığına dikkat edin 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

İşte n=100liste olarak değerlerdir .

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

Eğlenceli gerçekler: Dizi, keyfi yüksek olan terimleri içerir ve çalışma ortalamasının sınırı π'dir.

Liderler Sıralaması:


4
Bir dakika ne?? "Dizi, keyfi yüksek olan terimleri içerir ve çalışma ortalamasının sınırı π'dir."
Stewie Griffin,

@StewieGriffin İki ifade tutarlıdır. Sırayı düşünün 1,0,2,0,0,3,0,0,0,4,0,0,0,0,5,.... Sıfır olmayan herhangi bir sayıdan sonra dizilimin kesilmesi, şu ana kadar ortalama 1'dir. Ve, 0'ların dizileri daha sonra dizilimde daha az ve daha az etkiye sahiptir.
xnor

5
Tutarlı olduğunu biliyorum .. =) Yorum gönderdiğimde 10.000 ilk rakamı kontrol etmiştim. Anlamadığım şey: Neden dünyadaki Pi'ye eşit?
Stewie Griffin

29
@StewieGriffin N'ye kadar olan terimlerin toplamı, ^ 2 + b ^ 2 <= N olan noktalara (a, b) karşılık gelir. Bunlar, alanı πN olan yarıçapı sqrt (N) çemberindeki kafes noktalarıdır.
xnor

2
@xnor ve orada sihir var :(
Andras Deak 1

Yanıtlar:


19

Python ( 59 57 56 bayt)

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

Çevrimiçi demo

CJam cevabımda olduğu gibi, bu da Möbius inversiyonunu kullanıyor ve sözde quasilinearear zamanda çalışıyor.

Sayesinde SP3000 2 bayt tasarruf için ve feersum 1 için.


1
Bu parantezler can sıkıcıdır.
lirtosiast

@ThomasKwa, anlat bana. Beni asıl şaşırtan şey, gönderdiğim ilk sürümden geçtiğim sürümlerden birinde -1**x, her zaman öyleydi -1. -1Bir önceliğinin düşük öncelikli unary eksi yerine tek bir tamsayı belirteci olması bekleniyordu .
Peter Taylor

2
Ödül için tebrikler! Kodunuz, geldiğim her şeyden daha kısa. Çözümünüz tamamen yeni ve beklenmedik bir matematiksel düşünceye dayanıyor ve bu kadar basit görünen bir zorlukla bile mümkün olabileceğime sevinç veriyor. Mobius'un ters sonucu oldukça güzel ve bunun için bir kanıt elde etmekten zevk duydum. kendim.
xnor

Çarpma işleminin 4 ile sonrasında hareket ettirilmesiyle 1 bayt kaydedilebilir **x.
feersum

@PeterTaylor Algoritmanızın nasıl çalıştığını / beni bir kaynağa yönlendirebilir misiniz? Möbius inversiyonunu suqar sorunlarının toplamına nasıl uygulayabileceğinizi tam olarak göremiyorum.
kusur

15

Mathematica, 13 bayt

Yerleşiklere izin verilirse, Mathematica'da nasıl yapılır.

2~SquaresR~#&

0 için <= 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 , 12, 8, 0, 0, 8, 0, 0, 4, 0, 8, 0, 4, 8, 0, 0, 8, 8, 0, 0, 0, 0, 8, 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
Elbette Mathematica'nın bunun için yerleşik bir özelliği var.
HyperNeutrino,

14

Python 2,44 bayt

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

Bu xsot en hemen hemen aynıdır solüsyon (Peter Taylor'ın dayanmaktadır çözümü ), ancak işaretler ele alışını basitleştirerek 8 bayt kaydeder.

Tam bir program için, fonksiyonun dışında bir maliyet ödemeden fonksiyonda 2 byte tasarruf sağlayabileceğimize dikkat edin:

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

Bu şekilde tam bir program için iki ek bayt:

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

Çünkü n > 0çok okunaklı 40 baytlık bir çözüm var:

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

1
Ödül kazandığın için tebrikler! Özyinelemeli çıkarma, garip bölenler için alternatif toplamı, bölenden bir işaret çıkarmaya gerek kalmadan ifade etmenin temiz ve kısa bir yoludur. Ayrıca, Peter Taylor'un çözümünü n = 0 akıllıca ele alma özyinelemeli bir çözüm için modernize etmek için xsot'a teşekkür ederiz.
xnor

12

Pyth, 13 bayt

/sM^^R2}_QQ2Q

Test odası

/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

Geç, ama sonuncusuna ihtiyacın olduğunu sanmıyorum Q.
Outgolfer Erik,

12

J, 16 bayt

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

Bu monadik bir fiildir (başka bir deyişle, tekdüze bir işlev). Çevrimiçi deneyin veya tüm test senaryolarını geçtiğini görün .

açıklama

+/@,@:=+&*:/~@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 bayt

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

Bu, Peter Taylor'ın mükemmel çözümüne dayanan özyinelemeli bir işlevdir .


1
Bu harika bir gelişme. Ancak, onu daha da kısaltmanın bir yolu var ve onu aramanızı tavsiye ediyorum.
XNOR

1
@xnor Başka bir bayt aşağı. Umarım daha fazla numara yapamazsın.
15'de xsot

2
Bunu sadece çözüm artı bir hüner, bundan bir cevap yapmak gerekip gerekmediğini bilmiyorum: f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2. Ayrıca, varsayılan maksimum özyineleme derinliğini aşmayı umursamıyoruz.
Mitch Schwartz

1
@MitchSchwartz Bence bu ödül almaya layık olan inanılmaz bir gelişme ve muhtemel son optimizasyon aklı başındaydı.
9s15'de xsot

1
@MitchSchwartz Evet, düşündüğüm optimizasyon buydu! Ve xsot'un /4<<2numarası, sahip olduğumdan daha kısa sürüyor.
XNOR

8

Julia, 40 bayt

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

Döngünün içermediğine dikkat edin i==0, çünkü nbir kare olduğunda , zaten tarafından i=sqrt(n)eklenir ve bu form için yalnızca sekiz değil, dört ( 0^2+k^2, 0^2+(-k)^2, k^2+0^2, (-k)^2+0^2) vardır.


7

CJam, 25 23 bayt

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

Bu gerektiren bir teorik çözüm O (9 , n ) giriş için zaman ve bellek n .

Bir ekstra bayt pahasına - toplam 24 bayt için - karmaşıklığı O (n 2 ) seviyesine indirebiliriz :

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

Çevrimiçi deneyin!

Nasıl çalışır

ya

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

veya

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

Sonra

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.

Ve bir bayt tasarrufunda, karmaşıklığı Õ (n)
Peter Taylor

Evet gördüm. Bu harika.
Dennis

7

CJam ( 25 24 22 21 bayt)

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

Çevrimiçi demo

Bu, sözde quasilinearear * süresinde çalışır ve OEIS’ten gelen ifadeyi kullanır.

Moebius dönüşümü 4. dönem dizisidir [4, 0, -4, 0, ...]. - Michael Somos, 17 Eylül 2007

Girdi 0açık bir şekilde özel bir durum (Möbius tranforms ve yok ediciler birlikte iyi gitmiyor), ancak sadece bir karaktere mal oldu.

* Sözde - çünkü girişin değerinde değil, girişin değerinde kuasilindir; quasi Theta(n)sırasıyla büyüklükteki tamsayılar üzerinde işlem yaptığı için n; Bir b-bit mod işlemi b lg bzaman almalıdır , bu yüzden genel olarak bu Theta(n lg n lg lg n)zaman alır .


6

Japt , 42 37 33 bayt

Japt kısaltılmış versiyonudur Ja vaScri nk . yorumlayıcı

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

Nasıl çalışır

           // 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

Belki daha iyi bir teknik var; öneri bekliyoruz.


6

Python 3, 68 61 60 bayt

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

İki iç içe liste kavrama kullanmak çok pahalıdır. Bunun yerine, bu, yarıçap sqrt (n) çemberindeki her iki koordinatın da tamsayı olup olmadığını kontrol eder.

Peter Taylor bunu Moebius-inversiyon tabanlı bir yaklaşımla yendi .


Aferin. Özyinelemeli bir işlev ile uğraşıyordum ama n=0zarif bir şekilde çözemedi .
xsot


5

Haskell, 42 bayt

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

Kullanım exapmle:

*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
qBir muhafızda ciltleme zekice, bu numarayı hatırlayacağım.
xnor

5

Julia, 89 79 63 bayt

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

Bu abir tamsayı kabul eden ve bir şamandıra döndüren adlandırılmış bir işlevdir . Bir yardımcı fonksiyon çağırır 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

Buradaki yaklaşım Wesley Ivan Hurt'un OEIS'te listelenen formülünü basitleştiriyor. Sadeleştirme, bu cevabın 26 baytını tıraş eden aynı kişi olan Glen O tarafından bulundu!


3 byte kaydetmek x^.5yerine kullanın sqrt(x). Ve (n==0)2 bayttan fazla tasarruf sağlar 1÷(n+1). Ve cos(π*sqrt(x))^2÷1yerine 4 karakter daha kaydedebilirsiniz floor(cos(π*sqrt(x))^2). Ayrıca, 1:n/2yerine kullanmak 1:n÷2, çünkü içinde yüzmek kullanmak zararsızdır g(x)ve iyine de tam sayılara kilitlenir . Ve sum(i->g(i)g(n-i),1:n/2)biraz daha karakter traş edecek.
Glen Ç

@GlenO Harika öneriler, teşekkürler. sumHüner başarısız n=0Ben dizi anlama tuttu bu yüzden olsa.
Alex A.

1
Böylece, kurtarılabilir - i=0davanın toplamda gerçekleşmesine izin verirseniz, işareti açabilirsiniz 4g(n). Yani (n==0)-4g(n)-4g(n/2)+8sum(i->g(i)g(n-i),0:n/2), hangi hatayla karşılaşmayacaksınız. Fakat simetrileri dikkate alarak daha da iyisini yapabilirsiniz -(n==0)+4sum([g(i)g(n-i)for i=1:n])
Glen O

@GlenO Bu sadeleştirme olduğunu ciddiye dahi. Bunu, OEIS'teki sıra için alternatif bir formül olarak göndermenizi tavsiye ederim!
Alex A.

4

Pyth, 16 15 bayt

lfqQs^R2T^}_QQ2

Pyth Compiler'da çevrimiçi olarak deneyin .

Nasıl çalışır

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 bayt

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

Oldukça basit. Σ(toplamıdır.

Garip bir şekilde, bir sum(seq(sum(seq(fırlatır ERR:ILLEGAL NESTve yapar Σ(Σ(, ama sum(seq(Σ(iyidir. Σ(İçine yakın bir pariteyi kurtarmak için koymayı seçtim .


Arasındaki fark nedir sumve Σ?
alephalpha

1
@alephalpha Σ (bir toplamı alır X²+Y²=Ans, X'in tüm değerlerini -Ansve Ans. toplamı arasına ekler) (bir listenin toplamıdır , bu yüzden önce seq (..., Y, -Ans, Ans
lirtosiast 26:15

4

JavaScript (ES6), 66 60 bayt

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

@ Edc65 sayesinde 6 bayt kurtarıldı !

açıklama

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
`)

Ölçek

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 26:15

@ edc65 Güzel! Döngüleri parantez olmadan bir ok işlevine evalkoymak için kullanmayı düşünmedim for. Ayrıca ~haha operatörünü de unuttum .
user81655 26:15

4

Python 3, 93 62 69 bayt

İtertools çalışmıyordu, bu yüzden tekrar iki aralık kullandım, ancak baytları kurtarmak için menzili dışarı çıkardım.

Düzenleme: Önceki kod aslında işe yaramadı, çünkü n tanımından önce n aralığını tanımladım.

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 bayt

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

Açıklama:

{+/⍵=∊∘.+⍨×⍨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

APL'nin J'nin i:(-n - n arasındaki sayılar) işlevine sahip olmaması gerçeği dışında , bu J cevabı gibi çalışır.

Bir treni kullanamayız, çünkü üç byte'a mal olacak -\⍳2×⍵şekilde ayrıştırmamak (-\) ⍳ (2×⍵); benzer şekilde diğer üstteki çiftlerle. Tüm bu parantezler normal işlevi kısaltır.

Burada dene . Ortalama çıktısı 1tüm değerlerin eşleştiği anlamına gelir.


2

Matlab 41 bayt

Önceki cevaplardan daha küçük

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

Esasen Agawa001'in güç ve sqrt ile verdiği cevap değiştirildi


2

Şeker , 17 14 bayt

Giriş başlangıçta yığının üzerine itildi

~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?

Çok kısa değil, ama verimli. Örneğin, 15625 için sonuç anında 28'dir. OEIS'ten faktoring temelli formülü kullanır.
Çevrimiçi deneyin

Açıklama:

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

Hesaplama ile ilgili bazı detaylar:

  • üssü 1 mod 4 ise, kod hesaplar (exponent + 1) & -1;exponent + 1
  • üssü 3 mod 4 ise, kod hesaplar (exponent + 1) & 1; üs, üstelik tuhaf ise 0 ve eşitse 1

Tüm bu değerler birlikte ve 4 ile çarpılarak tam olarak OEIS formülüdür.


2

Python 2,68 bayt

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

x()N sayısını alan bir işlevi tanımlar .

Çevrimiçi deneyin. http://ideone.com/aRoxGF


Bir printveya returnifadeyi kaçırıyorsunuz .
Zgarb

Teşekkürler, tamamen unuttum. Bağlantı olsa da print deyimi vardır. Kodu yaparken kodumu değiştirdim.
Rɪᴋᴇʀ

Tamam, endişelenme. Ancak bu da n=0ve sonuçları için yanlış görünüyor n=1(1 ve 4 yerine 0 ve 2). Belki menzil limitlerinin ayarlanması gerekir?
Zgarb

@Zgarb Evet, bitmeliler n+1.
lirtosiast

1
Ben onu ararım.
Rɪᴋᴇʀ

2

Pyth, 41 35 33 30 27 bayt

Çevrimiçi deneyin.

Düzenleme: isaacg sayesinde aldım mve *Fçalışıyorum! EVET!

?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

Düzenleme: daha fazla bayt tasarrufu için bit yönünde ve geri yerleştirin! Ayrıca tüm "Eski" şeyleri kaldırdım. Dağınık olmaya başladı.

Sayesinde aditsu ve ve onun CJam çözüm maltysen ve onun ipuçları (Bir gün alacak m*Fdişe. Bir gün ...)

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)

Bunu not et,

  • asal 1 mod 4 -1 & (exponent + 1)ise,exponent + 1

  • asal 3 mod 4 ise ancak biz almak 1 & (exponent + 1)olan 0üs tekse ve 1eğer hatta

Hepsini bir arada çarpın (başlangıçta 4 kez) ve girdilerimize ekleyen iki karenin toplam sayısını elde ederiz.


2

Python, 57 bayt

Güzel meydan okuma. Maalesef şu anda bundan daha kısa sürmüyorum.

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 bayt

Üretme işlevlerini kullanma:

Mitch Schwartz sayesinde 6 bayt kaydedildi .

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

Dahili, 33 bayt ( Mitch Schwartz sayesinde 1 bayt kaydedildi .):

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

qfrep (q, B, {flag = 0}): integral ve kesin kuadratik form q için 1'den B'ye norm vektörlerinin sayısının (yarısı) vektörü. Bayrak 1 ise, 1 ila 2B arasındaki norm çiftlerini sayın.



matid(2)bir bayt kaydeder.
Mitch Schwartz

1
Ve üreten fonksiyon yaklaşımı için 28'e kadar:n->sum(i=-n,n,x^i^2)^2\x^n%x
Mitch Schwartz


1

Matlab, 63 50 bayt

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

  • Bu aynı haklı kodu yener, bu yüzden şunu koydum: D.

  • Program pozitif tamsayı çözümlerini bulur ve ardından negatif olanları kapsayacak şekilde 4 ile çarpar.

  • 25 ilk test durumunun tümünü gerçekleştirebilir

    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
    


thanks @StewieGriffin ben sadece luis 'ile ilgili adil bir oyun olarak dahil ettim
Abr001am

İpuçları: MATLAB'dan sonuçları göndermeyi planlıyorsanız, format compact=) kullanın
Stewie Griffin

1

JavaScript, 89 bayt

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)

G / Ç satırlarını kaldırsam bile bunun en kısa JavaScript yanıtı olmadığını biliyorum, ancak birkaç saniye içinde milyonlarca sonuç veren en iyi performans gösteren JS yanıtı olduğunu düşünüyorum (yaklaşık 10 milyon dolar aldı. dakika).


=== yerine == kullanabilir misiniz?
lirtosiast

Sadece en iyi uygulamaları kullanarak, ha ha.
Adam Dally

1

PHP, 70 bayt, rakip değil

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

Python cevaplarından birinden çalınan algoritma ... Hangisini unuttum; Ben göndermeden önce en azından ne olduğunu kısmen anlamak istedim.


for(;$x<=$n=$argv[1];)$s+=(-($n%(2*$x+1)<1))**$x++*4;echo$n?$s:1;5 Bayt kaydeder. $x-~$xeşittir 2*$x+1ve şimdi değişkeni atamadan başlayabilirsiniz.
Jörg Hülsermann
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.