นับผลรวมของสองสี่เหลี่ยม


45

กำหนดตัวเลขที่ไม่เป็นลบnให้ส่งออกจำนวนวิธีที่แสดงnเป็นผลรวมของสองจำนวนเต็มของจำนวนเต็มn == a^2 + b^2( OEIS A004018 ) โปรดทราบว่าaและbสามารถเป็นบวกลบหรือศูนย์และลำดับของมันมีความสำคัญ ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ

ตัวอย่างเช่นn=25ให้12เพราะ25สามารถแสดงเป็น

(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

n=25นี่ค่าขึ้นไปที่มี ระวังรหัสของคุณให้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

นี่คือค่าสูงสุดn=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]

ข้อเท็จจริงที่สนุกสนาน: ลำดับประกอบด้วยคำศัพท์ที่มีค่าสูงและข้อ จำกัด ของค่าเฉลี่ยที่ใช้คือπ

ลีดเดอร์บอร์ด:


4
รออะไร?? "ลำดับมีเงื่อนไขที่สูงโดยพลการและค่าเฉลี่ยของการรันคือπ"
Stewie Griffin

@StewieGriffin สองข้อความนี้สอดคล้องกัน 1,0,2,0,0,3,0,0,0,4,0,0,0,0,5,...พิจารณาลำดับ การตัดลำดับออกหลังจากหมายเลขที่ไม่ใช่ศูนย์ใด ๆ ค่าเฉลี่ยจนถึง 1 และการวิ่งของ 0 นั้นมีผลกระทบน้อยลงในลำดับต่อมา
xnor

5
ฉันรู้ว่ามันสอดคล้องกัน .. =) ฉันได้ตรวจสอบหมายเลข 10.000 หมายเลขแรกเมื่อฉันโพสต์ความคิดเห็น สิ่งที่ฉันไม่ได้รับ: ทำไมบนโลกถึงมีค่าเท่ากับ Pi?
Stewie Griffin

29
@StewieGriffin ผลรวมของข้อกำหนดสูงสุดถึง N สอดคล้องกับจุด (a, b) ด้วย ^ 2 + b ^ 2 <= N นี่คือจุดขัดแตะในวงกลมรัศมี sqrt (N) ซึ่งมีพื้นที่เป็นπN
xnor

2
@xnor และมีเวทมนตร์ :(
Andras Deak

คำตอบ:


19

Python ( 59 57 56 ไบต์)

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

การสาธิตออนไลน์

เช่นเดียวกับคำตอบ CJam ของฉันนี่ใช้การสลับMöbiusและทำงานในเวลา pseudoquasilinear

ขอบคุณSp3000สำหรับการออม 2 ไบต์และfeersumสำหรับ 1


1
วงเล็บเหล่านั้นน่ารำคาญ
lirtosiast

@ThomasKwa บอกฉันเกี่ยวกับเรื่องนี้ สิ่งที่มันทำให้ผมประหลาดใจในรุ่นใดรุ่นหนึ่งที่ผมผ่านไปในทางที่จะเป็นคนแรกที่ผมโพสต์ที่เป็นที่อยู่เสมอ-1**x -1ฉันคาดหวังว่า-1จะเป็นโทเค็นตัวอักษรจำนวนเต็มเดียวแทนที่จะเป็นลบยูรีนที่มีลำดับความสำคัญต่ำตามด้วยหนึ่ง
Peter Taylor

2
ขอแสดงความยินดีกับรางวัล! รหัสของคุณสั้นกว่าทุกอย่างที่ฉันคิดไว้ วิธีการแก้ปัญหาของคุณขึ้นอยู่กับแนวคิดทางคณิตศาสตร์ที่ใหม่และไม่คาดคิดและมันทำให้ฉันมีความสุขที่เป็นไปได้แม้ในความท้าทายที่ดูตรงไปตรงมาผลลัพธ์ Mobius-inverse ค่อนข้างสวยและฉันก็ยินดีที่ได้รับการพิสูจน์ ตนเอง
xnor

สามารถบันทึกได้ 1 ไบต์โดยเลื่อนการคูณไปที่ 4 หลังจาก**xนั้น
feersum

@PeterTaylor คุณช่วยอธิบายว่าอัลกอริทึมของคุณทำงานอย่างไร / คุณช่วยชี้ทรัพยากรให้ฉันได้ไหม? ฉันไม่สามารถเห็นได้ว่าคุณสามารถใช้การผกผันmöbiusกับจำนวนผลรวมของปัญหา suqares ได้อย่างไร
ข้อบกพร่อง

15

Mathematica ขนาด 13 ไบต์

หากอนุญาตให้สร้างบิวด์อินนี่เป็นวิธีการทำใน Mathematica

2~SquaresR~#&

สำหรับ 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, 0, 8, 0, 0, 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, 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
เพราะแน่นอนว่า Mathematica นั้นมีในตัวสำหรับสิ่งนี้
HyperNeutrino

14

Python 2, 44 ไบต์

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

สิ่งนี้เกือบจะเหมือนกับโซลูชันของ xsot (ซึ่งอิงตามโซลูชันของ Peter Taylor ) แต่จะช่วยประหยัด 8 ไบต์โดยทำให้การจัดการสัญญาณง่ายขึ้น

โปรดทราบว่าสำหรับโปรแกรมเต็มเราสามารถบันทึก 2 ไบต์ในฟังก์ชั่นโดยไม่ต้องเสียค่าใช้จ่ายนอกฟังก์ชั่น:

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

สองไบต์เพิ่มเติมสำหรับโปรแกรมแบบเต็มด้วยวิธีนี้:

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

สำหรับn > 0โซลูชัน 40- ไบต์ที่อ่านง่ายมาก:

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

1
ยินดีด้วยสำหรับการชนะรางวัล! การลบแบบเรียกซ้ำเป็นวิธีที่สะอาดและสั้นในการแสดงผลรวมสลับสำหรับตัวหารที่แปลกโดยไม่จำเป็นต้องแยกเครื่องหมายออกจากตัวหาร นอกจากนี้ให้เครดิตกับ xsot สำหรับการปรับปรุงโซลูชันของ Peter Taylor ให้เป็นแบบเรียกซ้ำด้วยการจัดการอย่างชาญฉลาดที่ n = 0
xnor


12

J, 16 ไบต์

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

นี่คือคำกริยา monadic (ในคำอื่น ๆ ฟังก์ชัน unary) ลองมันออนไลน์หรือเห็นมันผ่านกรณีทดสอบทั้งหมด

คำอธิบาย

+/@,@:=+&*:/~@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 ไบต์

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

นี่คือฟังก์ชันเวียนตามออกทางออกที่ดีปีเตอร์เทย์เลอร์


1
นี่คือการปรับปรุงที่ดีมาก แต่ยังคงมีวิธีทำให้สั้นลงและฉันขอแนะนำให้คุณค้นหา
xnor

1
@xnor อีก byte down ฉันหวังว่าคุณจะไม่มีกลอุบายเพิ่มอีกต่อไป
xsot

2
f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2ผมไม่ทราบว่าฉันควรให้คำตอบของมันก็เป็นเพียงการแก้ปัญหาของคุณบวกหนึ่งเคล็ดลับ: นอกจากนี้ฉันคิดว่าเราไม่สนใจเกินความลึกเรียกซ้ำสูงสุดเริ่มต้นใช่หรือไม่
Mitch Schwartz

1
@MitchSchwartz ฉันคิดว่านั่นเป็นการปรับปรุงที่น่าเหลือเชื่อที่ควรค่าแก่ความโปรดปรานและน่าจะเป็นสิ่งที่ xnor คำนึงถึง
xsot

1
@MitchSchwartz ใช่นั่นคือการเพิ่มประสิทธิภาพที่ฉันคิด! และ/4<<2เคล็ดลับของ xsot ทำให้มันสั้นกว่าที่ฉันมี
xnor

8

จูเลีย 40 ไบต์

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

โปรดทราบว่าการวนซ้ำนั้นไม่รวมi==0เพราะเมื่อnเป็นสี่เหลี่ยมจตุรัสมันรวมอยู่แล้วi=sqrt(n)และมีเพียงสี่ไม่ใช่แปดสำหรับฟอร์มนั้น ( 0^2+k^2, 0^2+(-k)^2, k^2+0^2, (-k)^2+0^2)


7

CJam, 25 23 ไบต์

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

นี่คือวิธีการแก้ปัญหาที่ต้องใช้ทฤษฎีO (9 n )เวลาและหน่วยความจำสำหรับการป้อนข้อมูลn

ด้วยราคาเพิ่มหนึ่งไบต์ - รวมเป็น24 ไบต์ - เราสามารถลดความซับซ้อนเป็นO (n 2 ) :

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

ลองออนไลน์!

มันทำงานอย่างไร

ทั้ง

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

หรือ

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

แล้วก็

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.

และด้วยการประหยัดหนึ่งไบต์ก็เป็นไปได้ที่จะทำให้ความซับซ้อนลดลงเหลือÕ (n)
Peter Taylor

ใช่ฉันเคยเห็น. ที่น่าตื่นตาตื่นใจ.
Dennis

7

CJam ( 25 24 22 21 ไบต์)

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

การสาธิตออนไลน์

สิ่งนี้ทำงานในเวลา pseudoquasilinear * และใช้คำสั่งจาก OEIS นั้น

การแปลง Moebius เป็นระยะเวลา 4 ลำดับ [4, 0, -4, 0, ... ] - Michael Somos, Sep 17 2007

0เห็นได้ชัดว่าการป้อนข้อมูลเป็นกรณีพิเศษ (Tranform Möbiusและผู้ทำลายไม่เข้ากันได้ดี) แต่จบลงด้วยการเสียค่าใช้จ่ายเพียงหนึ่งถ่าน

* Pseudo- เนื่องจากเป็น quasilinear ในค่าของอินพุตไม่ใช่ขนาดของอินพุต เสมือนเพราะมันทำการTheta(n)ดำเนินการกับจำนวนเต็มขนาดในคำสั่งของn; การbดำเนินการ mod-bit ควรใช้b lg bเวลาดังนั้นโดยรวมจึงใช้Theta(n lg n lg lg n)เวลา


6

Japt , 42 37 33 ไบต์

Japtเป็นรุ่นสั้นJa vaScri พอยต์ ล่าม

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

มันทำงานอย่างไร

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

อาจมีเทคนิคที่ดีกว่า; ข้อเสนอแนะยินดีต้อนรับ


6

Python 3, 68 61 60 ไบต์

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

การใช้ความเข้าใจในรายการแบบซ้อนสองรายการนั้นแพงเกินไป แต่จะตรวจสอบว่าพิกัดทั้งสองในวงกลมรัศมี sqrt (n) เป็นจำนวนเต็มหรือไม่

ปีเตอร์เทย์เลอร์ได้ตีนี้ด้วยวิธีอุซ-ผกผันตาม


ทำได้ดี. ฉันกำลังซ่อมฟังก์ชั่นวนซ้ำ แต่ไม่สามารถแก้ไขได้n=0อย่างสวยงาม
xsot


5

Haskell, 42 ไบต์

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

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
การผูกมัดqในยามนั้นฉลาดฉันจะจำเคล็ดลับนี้ได้
xnor

5

Julia, 89 79 63 ไบต์

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

นี่คือฟังก์ชั่นaที่มีชื่อซึ่งยอมรับจำนวนเต็มและส่งกลับลอย 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

วิธีการที่นี่ใช้การทำให้เข้าใจสูตรของเวสลีย์อีวานเฮิร์ตที่ระบุไว้ใน OEIS การทำให้เข้าใจง่ายถูกค้นพบโดยเกลนโอซึ่งเป็นบุคคลเดียวกันกับผู้ที่โกนคำตอบนี้ 26 ไบต์!


ใช้x^.5แทนsqrt(x)การบันทึก 3 ไบต์ และ(n==0)ช่วยประหยัด 2 1÷(n+1)ไบต์มากกว่า และคุณสามารถบันทึก 4 ตัวอักษรมากขึ้นโดยใช้มากกว่าcos(π*sqrt(x))^2÷1 floor(cos(π*sqrt(x))^2)นอกจากนี้ให้ใช้1:n/2มากกว่า1:n÷2เพราะไม่มีอันตรายใด ๆ หากใช้การลอยในg(x)และมันจะถูกล็อคเป็นจำนวนเต็มสำหรับiต่อไป และsum(i->g(i)g(n-i),1:n/2)จะโกนตัวละครเพิ่มอีกด้วย
เกลน O

@GlenO คำแนะนำที่ดีขอบคุณ sumเคล็ดลับล้มเหลวสำหรับn=0แม้ว่าดังนั้นฉันเก็บความเข้าใจอาร์เรย์
Alex A.

1
ดังนั้นจึงสามารถกู้คืนได้ - หากคุณปล่อยให้i=0กรณีเกิดขึ้นในผลรวมคุณสามารถเปิดใช้งานสัญญาณ4g(n)ได้ ดังนั้น(n==0)-4g(n)-4g(n/2)+8sum(i->g(i)g(n-i),0:n/2)ซึ่งจะไม่พบข้อผิดพลาด แต่คุณสามารถทำได้ดียิ่งขึ้นโดยการสังเกตความสมมาตร(n==0)+4sum([g(i)g(n-i)for i=1:n])
เกลน O

@GlenO การทำให้เข้าใจง่ายนั้นเป็นอัจฉริยะอย่างจริงจัง ฉันขอแนะนำให้คุณส่งเป็นสูตรทางเลือกสำหรับลำดับใน OEIS!
Alex A.

4

Pyth, 16 15 ไบต์

lfqQs^R2T^}_QQ2

ลองใช้ออนไลน์ในPyth คอมไพเลอร์

มันทำงานอย่างไร

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 ไบต์

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

ตรงไปตรงมาสวย Σ(คือการรวม

น่าแปลกที่sum(seq(sum(seq(พ่นERR:ILLEGAL NESTและทำเช่นนั้นΣ(Σ(แต่sum(seq(Σ(ก็ไม่เป็นไร ฉันเลือกที่จะใส่Σ(ด้านในเพื่อประหยัดค่าใกล้เคียง


ความแตกต่างระหว่างsumและΣคืออะไร
alephalpha

1
@alephalpha Σ (รับผลรวมเพิ่มค่าทั้งหมดX²+Y²=Ansจาก X ระหว่าง-AnsและAns. ผลรวม (เป็นผลรวมของรายการดังนั้นเราจำเป็นต้องสร้างรายการแรกโดยใช้ seq (... , Y, -Ans, Ans
lirtosiast

4

JavaScript (ES6), 66 60 ไบต์

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

บันทึกได้ 6 ไบต์ด้วย@ edc65 !

คำอธิบาย

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

ทดสอบ

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! ฉันไม่คิดว่าevalจะใช้forลูปในฟังก์ชั่นลูกศรโดยไม่มีวงเล็บ ฉันลืมเกี่ยวกับ~ผู้ดำเนินการฮ่าฮ่า
user81655

4

Python 3, 93 62 69 ไบต์

Itertools ไม่ทำงานดังนั้นฉันจึงใช้สองช่วงอีกครั้ง แต่ย้ายช่วงออกเพื่อบันทึกไบต์

แก้ไข:รหัสก่อนหน้านี้ใช้งานไม่ได้จริงเนื่องจากฉันกำหนดช่วงเหนือ n ก่อนกำหนด 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 ไบต์

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

คำอธิบาย:

{+/⍵=∊∘.+⍨×⍨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 ไม่มีi:ฟังก์ชั่นJ (ตัวเลขจาก -n ถึง n) สิ่งนี้ทำงานได้ดีเหมือนกับคำตอบ J

เราไม่สามารถใช้รถไฟได้เนื่องจากการ-\⍳2×⍵ไม่แยกวิเคราะห์เหมือน(-\) ⍳ (2×⍵)ค่าใช้จ่ายสามไบต์ คล้ายกับคู่อื่น ๆ ของ atops วงเล็บเหล่านั้นทำให้ฟังก์ชั่นปกติสั้นลง

ลองมันนี่ ผลลัพธ์1หมายถึงค่าทั้งหมดตรงกัน


2

Matlab 41 ไบต์

ยิ่งเล็กลงเหมือนคำตอบก่อนหน้า

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

คำตอบที่สำคัญของ Agawa001 ที่ใช้พลังงานและ sqrt ถูกแทนที่


2

ลูกกวาด , 17 14 ไบต์

อินพุตถูกส่งไปยังสแต็กในตอนแรก

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

ไม่สั้นมาก แต่มีประสิทธิภาพ เช่นผลลัพธ์สำหรับ 15625 เป็น 28 ทันทีใช้สูตรตามตัวประกอบจาก OEIS
ลองออนไลน์

คำอธิบาย:

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

รายละเอียดบางอย่างเกี่ยวกับการคำนวณ:

  • ถ้านายกคือ 1 mod 4 รหัสจะคำนวณ(exponent + 1) & -1ซึ่งก็คือexponent + 1
  • ถ้านายกคือ 3 mod 4 รหัสจะคำนวณ(exponent + 1) & 1ซึ่งเป็น 0 ถ้าเลขชี้กำลังเป็นเลขคี่และ 1 ถ้าเป็นเลขคู่

ค่าทั้งหมดเหล่านี้คูณเข้าด้วยกันและคูณด้วย 4 เป็นสูตร OEIS ทั้งหมด


2

Python 2, 68 ไบต์

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

ลองออนไลน์ http://ideone.com/aRoxGF


คุณไม่มีคำสั่งprintหรือ return
Zgarb

ขอบคุณฉันลืมไปโดยสิ้นเชิง ลิงค์มีข้อความสั่งพิมพ์ ฉันแก้ไขรหัสในขณะที่กำลังสร้างรหัส
58

ตกลงไม่ต้องกังวล แต่สิ่งนี้ดูเหมือนจะให้ผลลัพธ์ที่ไม่ถูกต้องสำหรับn=0และn=1(0 และ 2 แทน 1 และ 4) อาจจำเป็นต้องปรับช่วง จำกัด หรือไม่
Zgarb

@Zgarb n+1ใช่พวกเขาควรจะสิ้นสุดที่
lirtosiast

1
ฉันจะตามหามัน
Rɪᴋᴇʀ

2

Pyth, 41 35 33 30 27 ไบต์

ลองออนไลน์

แก้ไข:ขอบคุณisaacgฉันได้mและ*Fทำงาน! ใช่!

?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

แก้ไข:ใส่บิตและกลับเข้ามาเพื่อการประหยัดไบต์! นอกจากนี้ฉันยังลบสิ่งที่ "เดิม" ทั้งหมด มันเริ่มที่จะรกรุงรัง

ขอบคุณaditsuและโซลูชั่น CJam ของเขาและmaltysenและเคล็ดลับของเขา (วันหนึ่งฉันจะm*Fdไปทำงานวันหนึ่ง ... )

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)

ทราบว่า

  • ถ้านายกคือ 1 mod 4 เราจะได้รับ-1 & (exponent + 1)ซึ่งก็คือexponent + 1

  • แต่ถ้านายกเป็น 3 mod 4 เราจะได้รับ1 & (exponent + 1)ซึ่งก็คือ0ถ้าเลขชี้กำลังเป็นเลขคี่และ1ถ้าเป็นเช่นนั้น

คูณทั้งหมดเข้าด้วยกัน (คูณ 4 ที่จุดเริ่มต้น) และเราได้จำนวนผลรวมของสองกำลังสองที่รวมเข้ากับอินพุตของเรา


2

Python ขนาด 57 ไบต์

ความท้าทายที่ดี น่าเสียดายที่ฉันไม่ได้ทำให้สั้นลงกว่านี้ในขณะนี้

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 ไบต์

ใช้ฟังก์ชั่นการสร้าง:

ที่บันทึกไว้ 6 ไบต์ขอบคุณที่มิทช์ชวาร์ตซ์

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

ใช้บิวด์อิน, 33 ไบต์ (บันทึก 1 ไบต์ขอบคุณMitch Schwartz ):

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

qfrep (q, B, {flag = 0}): vector ของ (ครึ่ง) จำนวนเวกเตอร์ของ norms จาก 1 ถึง B สำหรับรูปแบบสมการกำลังสองหนึ่งรูป หากการตั้งค่าสถานะเป็น 1 ให้นับเวกเตอร์ของค่ามาตรฐานจาก 1 ถึง 2B



matid(2)บันทึกเป็นไบต์
Mitch Schwartz

1
และลดลงเหลือ 28 สำหรับวิธีการสร้างฟังก์ชั่น:n->sum(i=-n,n,x^i^2)^2\x^n%x
Mitch Schwartz

1

Matlab, 72 ไบต์

n=input('');m=fix(sqrt(n));m=(-m:m).^2;disp(nnz(bsxfun(@plus,m,m')==n))


@ StewieGriffin ขอบคุณ! แต่ในกรณีนี้มันเป็นโปรแกรมไม่ใช่ฟังก์ชั่น ดังนั้นตามคำตอบที่ได้รับการยอมรับในลิงค์ของคุณมันเป็นสิ่งจำเป็นใช่ไหม?
Luis Mendo

1

Matlab, 63 50 ไบต์

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

  • สิ่งนี้จะเอาชนะรหัสที่มีสิทธิ์เหมือนกันดังนั้นฉันจึงใส่มัน: D

  • โปรแกรมค้นหาวิธีแก้ปัญหาจำนวนเต็มบวกจากนั้นคูณด้วย 4 เพื่อรวมค่าลบ

  • สามารถทำการทดสอบได้ 25 ครั้ง

    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
    


ขอบคุณ @StewieGriffin ฉันรวมมันเป็นเกมที่เกี่ยวข้องกับ luis 'one
Abr001am

เคล็ดลับ: เมื่อคุณวางแผนที่จะโพสต์ผลลัพธ์จาก MATLAB ให้ใช้format compact=)
Stewie Griffin

1

JavaScript, 89 ไบต์

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)

ฉันรู้ว่านี่ไม่ใช่คำตอบ JavaScript ที่สั้นที่สุดแม้ว่าฉันจะลบบรรทัด i / o แต่ฉันคิดว่ามันเป็นคำตอบของ JS ที่มีประสิทธิภาพดีที่สุดที่ให้ผลลัพธ์เป็นล้านภายในสองสามวินาที (สิบล้านใช้เวลาประมาณ a นาที).


คุณสามารถใช้ == แทน === ได้ไหม?
lirtosiast

ฉันทำได้โดยใช้แนวปฏิบัติที่ดีที่สุดฮ่า ๆ ๆ
Adam Dally

1

PHP, 70 ไบต์, ไม่ใช่การแข่งขัน

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

อัลกอริทึมที่ถูกขโมยมาจากคำตอบของงูหลามอย่างใดอย่างหนึ่ง ... ฉันลืมอันที่หนึ่ง; ต้องการอย่างน้อยบางส่วนเข้าใจสิ่งที่เกิดขึ้นก่อนโพสต์


for(;$x<=$n=$argv[1];)$s+=(-($n%(2*$x+1)<1))**$x++*4;echo$n?$s:1;บันทึก 5 ไบต์ $x-~$xเท่ากับ2*$x+1และคุณสามารถเริ่มต้นได้โดยไม่ต้องกำหนดตัวแปร
JörgHülsermann
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.