Tổng số hai hình vuông


45

Cho một số không âm n, xuất ra số cách biểu thị ndưới dạng tổng của hai bình phương số nguyên n == a^2 + b^2( OEIS A004018 ). Lưu ý rằng abcó thể là tích cực, tiêu cực hoặc bằng không, và thứ tự của chúng có vấn đề. Ít byte nhất sẽ thắng.

Ví dụ, n=25cho 12bởi vì 25có thể được thể hiện như

(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

Dưới đây là các giá trị lên đến n=25. Hãy cẩn thận rằng mã của bạn làm việc cho 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

Dưới đây là các giá trị lên đến n=100như một danh sách.

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

Sự thật thú vị: Chuỗi chứa các thuật ngữ cao tùy ý và giới hạn trung bình đang chạy của nó là π.

Bảng xếp hạng:


4
Đợi đã, cái gì ?? "Chuỗi chứa các thuật ngữ cao tùy ý và giới hạn trung bình đang chạy của nó là π."
Stewie Griffin

@StewieGriffin Hai tuyên bố là nhất quán. Hãy xem xét trình tự 1,0,2,0,0,3,0,0,0,4,0,0,0,0,5,.... Cắt chuỗi sau bất kỳ số khác nào, trung bình cho đến nay là 1. Và, các lần chạy 0 có tác động ít hơn và ít hơn sau đó trong chuỗi.
xnor

5
Tôi biết nó nhất quán .. =) Tôi đã kiểm tra 10.000 số đầu tiên khi tôi đăng nhận xét. Điều tôi không nhận được là: Tại sao nó lại bằng Pi?
Stewie Griffin

29
@StewieGriffin Tổng các thuật ngữ lên đến N tương ứng với các điểm (a, b) với a ^ 2 + b ^ 2 <= N. Đây là các điểm mạng trong vòng tròn bán kính sqrt (N), có diện tích là πN.
xnor

2
@xnor và có phép màu :(
Andras Deak

Câu trả lời:


19

Python ( 59 57 56 byte)

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

Bản demo trực tuyến

Như với câu trả lời của tôi về CJam, điều này sử dụng phép đảo ngược Möbius và chạy trong thời gian giả.

Cảm ơn Sp3000 cho khoản tiết kiệm 2 byte và facerum cho 1.


1
Những dấu ngoặc đơn gây phiền nhiễu.
lirtosiast

@ThomasKwa, nói cho tôi biết về nó. Điều thực sự làm tôi ngạc nhiên, trong một trong những phiên bản tôi đã trải qua trên đường đến phiên bản đầu tiên tôi đăng, đó -1**xlà luôn luôn -1. Tôi dự kiến ​​sẽ -1là một mã thông báo bằng số nguyên duy nhất chứ không phải là một dấu trừ đơn nguyên có độ ưu tiên thấp theo sau là một.
Peter Taylor

2
Chúc mừng tiền thưởng! Mã của bạn ngắn hơn bất cứ thứ gì tôi nghĩ ra. Giải pháp của bạn dựa trên một ý tưởng toán học hoàn toàn mới và bất ngờ, và nó mang lại cho tôi niềm vui rằng điều này có thể xảy ra ngay cả trong một thử thách đơn giản như vậy. Kết quả nghịch đảo của Mobius khá đẹp và tôi rất vui khi nhận được bằng chứng cho riêng tôi.
xnor

Có thể lưu 1 byte bằng cách di chuyển phép nhân lên 4 đến sau **x.
frageum

@PeterTaylor Bạn có thể giải thích cách thuật toán của bạn hoạt động / bạn có thể chỉ cho tôi một tài nguyên không? Tôi hoàn toàn không thể thấy làm thế nào bạn có thể áp dụng nghịch đảo möbius cho số lượng các vấn đề suqares.
flawr

15

Toán học, 13 byte

Nếu các phần dựng sẵn được cho phép, đây là cách thực hiện trong Mathicala.

2~SquaresR~#&

Cho 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
Bởi vì tất nhiên Mathicala có tích hợp sẵn cho việc này.
HyperNeutrino

14

Python 2, 44 byte

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

Điều này gần giống như giải pháp của xsot (dựa trên giải pháp của Peter Taylor ), nhưng tiết kiệm 8 byte bằng cách đơn giản hóa cách xử lý các dấu hiệu.

Lưu ý rằng đối với một chương trình đầy đủ, chúng ta có thể lưu 2 byte trong hàm mà không phải chịu chi phí ngoài hàm:

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

Hai byte bổ sung cho một chương trình đầy đủ theo cách này:

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

Để n > 0có một giải pháp 40 byte rất dễ đọc:

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

1
Chúc mừng bạn đã giành được tiền thưởng! Phép trừ đệ quy là một cách rõ ràng và ngắn gọn để biểu thị tổng xen kẽ cho các ước số lẻ mà không cần trích xuất một dấu hiệu từ chính ước số đó. Ngoài ra, tín dụng cho xsot để hợp lý hóa giải pháp của Peter Taylor cho một giải pháp đệ quy với xử lý thông minh n = 0.
xnor

12

Bình thường, 13 byte

/sM^^R2}_QQ2Q

Bộ kiểm tra

/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

Muộn, nhưng tôi không nghĩ bạn cần cái cuối cùng Q.
Erik the Outgolfer 5/12/2016

12

J, 16 byte

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

Đây là một động từ đơn âm (nói cách khác, một hàm unary). Hãy thử trực tuyến hoặc xem nó vượt qua tất cả các trường hợp thử nghiệm .

Giải trình

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

Đây là một chức năng đệ quy dựa trên giải pháp tuyệt vời của Peter Taylor .


1
Đây là một cải tiến tuyệt vời. Nhưng, vẫn còn một cách để làm cho nó ngắn hơn, và tôi khuyến khích bạn tìm kiếm nó.
xnor 8/12/2015

1
@xnor Một byte khác xuống. Tôi hy vọng bạn không có bất kỳ thủ thuật nào lên tay áo của bạn.
xsot

2
Tôi không biết liệu tôi có nên trả lời hay không, đó chỉ là giải pháp của bạn cộng với một mẹo : f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2. Ngoài ra, tôi đoán chúng ta không quan tâm đến việc vượt quá độ sâu đệ quy tối đa mặc định?
Mitch Schwartz

1
@MitchSchwartz Tôi nghĩ rằng đó là một cải tiến đáng kinh ngạc xứng đáng với tiền thưởng và có khả năng xnor tối ưu hóa cuối cùng đã có trong tâm trí.
xsot

1
@MitchSchwartz Vâng, đó là sự tối ưu hóa mà tôi đã nghĩ đến! Và /4<<2thủ thuật của xsot làm cho nó ngắn hơn những gì tôi đã có.
xnor

8

Julia, 40 byte

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

Ung dung:

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

Lưu ý rằng vòng lặp không bao gồm i==0, bởi vì khi nlà một hình vuông, nó đã được bao gồm bởi i=sqrt(n)và chỉ có bốn, không phải tám, cho dạng đó ( 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=},,

Đây là một giải pháp lý thuyết đòi hỏi thời gian và bộ nhớ O (9 n ) cho đầu vào n .

Với chi phí thêm một byte - với tổng số 24 byte - chúng ta có thể giảm độ phức tạp xuống O (n 2 ) :

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Hoặc

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

hoặc là

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

Sau đó

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.

Và với mức tiết kiệm một byte, có thể giảm độ phức tạp xuống (n)
Peter Taylor

Vâng tôi thấy. Thật đáng kinh ngạc.
Dennis

7

CJam ( 25 24 22 21 byte)

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

Bản demo trực tuyến

Điều này chạy trong thời gian giả * và sử dụng câu lệnh từ OEIS rằng

Biến đổi Moebius là chuỗi 4 giai đoạn [4, 0, -4, 0, ...]. - Michael Somos, ngày 17 tháng 9 năm 2007

Đầu vào 0 rõ ràng là một trường hợp đặc biệt (Möbius tranforms và annihilators không kết hợp tốt với nhau), nhưng cuối cùng chỉ tốn một char.

* Giả - vì đó là giá trị của giá trị đầu vào, không phải kích thước của đầu vào; gần như bởi vì nó Theta(n)hoạt động trên các số nguyên kích thước theo thứ tự n; một bhoạt động mod -bit nên mất b lg bthời gian, vì vậy tổng thể điều này cần có Theta(n lg n lg lg n)thời gian.


6

Japt , 42 37 33 byte

Japt là phiên bản rút gọn của Ja vaScri pt . Thông dịch viên

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

Làm thế nào nó hoạt động

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

Có lẽ có một kỹ thuật tốt hơn; đề nghị được chào đón.


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

Sử dụng hai cách hiểu danh sách lồng nhau là quá đắt. Thay vào đó, điều này kiểm tra nếu cả hai tọa độ trên vòng tròn bán kính sqrt (n) là số nguyên.

Peter Taylor đã đánh bại điều này bằng cách tiếp cận dựa trên Moebius .


Làm tốt. Tôi đã mày mò với một hàm đệ quy nhưng không thể giải quyết một n=0cách tao nhã.
xsot


5

Haskell, 42 byte

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

Cách sử dụng 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
Liên kết qvới một người bảo vệ là thông minh, tôi sẽ nhớ thủ thuật này.
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])

Đây là một hàm được đặt tên achấp nhận một số nguyên và trả về một số float. Nó gọi một chức năng của người trợ giúp g.

Ung dung:

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

Cách tiếp cận ở đây sử dụng đơn giản hóa công thức của Wesley Ivan Hurt được liệt kê trên OEIS. Sự đơn giản hóa được tìm thấy bởi Glen O, cũng chính là người đã loại bỏ 26 byte câu trả lời này!


Sử dụng x^.5thay vì sqrt(x)để lưu 3 byte. Và (n==0)tiết kiệm hơn 2 byte 1÷(n+1). Và bạn có thể lưu thêm 4 ký tự bằng cách sử dụng cos(π*sqrt(x))^2÷1chứ không phải floor(cos(π*sqrt(x))^2). Ngoài ra, sử dụng 1:n/2chứ không phải 1:n÷2vì không có hại khi sử dụng float g(x)và nó sẽ bị khóa với các số nguyên cho idù sao đi nữa. Và sum(i->g(i)g(n-i),1:n/2)sẽ cạo thêm một số nhân vật nữa.
Glen O

@GlenO Gợi ý tuyệt vời, cảm ơn. Thủ sumthuật thất bại n=0mặc dù, vì vậy tôi giữ cho mảng hiểu.
Alex A.

1
Vì vậy, nó có thể được phục hồi - nếu bạn để i=0trường hợp xảy ra trong tổng, bạn có thể bật ký hiệu 4g(n). Vì vậy (n==0)-4g(n)-4g(n/2)+8sum(i->g(i)g(n-i),0:n/2), mà sẽ không chạy vào lỗi. Nhưng bạn có thể làm tốt hơn nữa, bằng cách lưu ý các đối xứng -(n==0)+4sum([g(i)g(n-i)for i=1:n])
Glen O

@GlenO Sự đơn giản hóa đó là thiên tài nghiêm túc . Tôi khuyên bạn nên gửi nó như một công thức thay thế cho chuỗi trên OEIS!
Alex A.

4

Bình thường, 16 15 byte

lfqQs^R2T^}_QQ2

Hãy thử trực tuyến trong Trình biên dịch Pyth .

Làm thế nào nó hoạt động

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

Khá đơn giản. Σ(là tổng kết.

Kỳ lạ thay, sum(seq(sum(seq(ném một ERR:ILLEGAL NEST, và như vậy Σ(Σ(, nhưng sum(seq(Σ(là tốt. Tôi đã chọn để đặt Σ(bên trong để tiết kiệm một paren gần.


Sự khác biệt giữa sumvà là Σgì?
alephalpha

1
@alephalpha Σ (lấy tổng, cộng tất cả các X²+Y²=Ansgiá trị từ X giữa -AnsAns. (là tổng của danh sách , vì vậy chúng ta cần tạo danh sách trước bằng cách sử dụng 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 được lưu nhờ vào @ edc65 !

Giải trình

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

Kiểm tra

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 Đẹp quá! Tôi đã không nghĩ đến việc sử dụng evalđể đặt các forvòng lặp vào một hàm mũi tên mà không có dấu ngoặc đơn. Tôi cũng quên mất người ~điều hành haha.
dùng81655

4

Python 3, 93 62 69 byte

Itertools không hoạt động nên tôi đã sử dụng hai phạm vi một lần nữa, nhưng đã chuyển phạm vi ra để lưu byte.

Chỉnh sửa: Mã trước đó không thực sự hoạt động, vì tôi đã xác định phạm vi trên n trước khi tôi xác định 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,,⍨⍳⍵}

Giải trình:

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

Khác với thực tế là APL không có chức năng J i:(số từ -n đến n), điều này hoạt động khá giống với câu trả lời J.

Chúng tôi không thể sử dụng một chuyến tàu vì việc -\⍳2×⍵không phân tích cú pháp (-\) ⍳ (2×⍵)sẽ tốn ba byte; tương tự với các cặp atops khác. Tất cả các dấu ngoặc đơn làm cho hàm thường xuyên ngắn hơn.

Hãy thử nó ở đây . Đầu ra của 1phương tiện có nghĩa là tất cả các giá trị khớp.


2

Matlab 41 byte

Thậm chí nhỏ hơn như các câu trả lời trước

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

Về cơ bản câu trả lời của Agawa001 với sức mạnh và sqrt thay thế


2

Kẹo , 17 14 byte

Đầu vào được đẩy lên ngăn xếp ban đầu

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

Không thực sự ngắn, nhưng hiệu quả. Ví dụ: kết quả cho 15625 là ngay lập tức 28. Sử dụng công thức dựa trên yếu tố từ OEIS.
Dùng thử trực tuyến

Giải trình:

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

Một số chi tiết về tính toán:

  • nếu số nguyên tố là 1 mod 4, mã sẽ tính toán (exponent + 1) & -1 , đó làexponent + 1
  • nếu số nguyên tố là 3 mod 4, mã sẽ tính bằng (exponent + 1) & 10 nếu số mũ là số lẻ và 1 nếu số chẵn

Tất cả các giá trị này được nhân với nhau và nhân với 4 chính xác là công thức 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)

Xác định hàm gọi là x()số n.

Hãy thử trực tuyến. http://ideone.com/aRoxGF


Bạn đang thiếu một printhoặc returntuyên bố.
Zgarb

Cảm ơn, tôi hoàn toàn quên mất. Các liên kết có tuyên bố in mặc dù. Tôi đã chỉnh sửa mã của mình trong khi tôi đang tạo mã.
Rɪᴋᴇʀ

Được rồi, đừng lo lắng. Nhưng điều này dường như cũng cho kết quả không chính xác cho n=0n=1(0 và 2 thay vì 1 và 4). Có lẽ giới hạn phạm vi cần điều chỉnh?
Zgarb

@Zgarb Vâng, họ nên kết thúc tại n+1.
lirtosiast

1
Tôi sẽ tìm nó.
Rɪᴋᴇʀ

2

Pyth, 41 35 33 30 27 byte

Hãy thử trực tuyến.

Chỉnh sửa: Nhờ isaacg , tôi đã m*Flàm việc! ĐÚNG!

?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

Chỉnh sửa: Đặt bitwise và quay lại để tiết kiệm byte hơn! Ngoài ra tôi đã loại bỏ tất cả những thứ "Trước đây". Nó đã bắt đầu lộn xộn.

Cảm ơn aditsu và giải pháp CJam của anh ấy, và maltysen và những lời khuyên của anh ấy (Một ngày nào đó tôi sẽ đi m*Fdlàm. Một ngày ...)

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)

Lưu ý rằng,

  • nếu số nguyên tố là 1 mod 4, chúng tôi nhận được -1 & (exponent + 1), đó làexponent + 1

  • nhưng nếu số nguyên tố là 3 mod 4, chúng ta sẽ nhận được 1 & (exponent + 1), đó là 0nếu số mũ là số lẻ và 1nếu chẵn

Nhân tất cả lại với nhau (lần 4 lúc đầu) và chúng ta có được tổng của hai hình vuông cộng với đầu vào của chúng ta.


2

Python, 57 byte

Thử thách đẹp. Thật không may, tôi không nhận được nó ngắn hơn lúc này.

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

Sử dụng các hàm tạo:

Đã lưu 6 byte nhờ Mitch Schwartz .

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

Sử dụng tích hợp, 33 byte (được lưu 1 byte nhờ Mitch Schwartz .):

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

qfrep (q, B, {flag = 0}): vectơ của (một nửa) số lượng vectơ của định mức từ 1 đến B cho dạng bậc hai tích phân và xác định q. Nếu cờ là 1, đếm các vectơ của định mức chẵn từ 1 đến 2B.



matid(2)tiết kiệm một byte.
Mitch Schwartz

1
Và xuống còn 28 cho cách tiếp cận chức năng tạo:n->sum(i=-n,n,x^i^2)^2\x^n%x
Mitch Schwartz

1

Matlab, 72 byte

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


@StewieGriffin Cảm ơn! Nhưng trong trường hợp này, nó là một chương trình, không phải là một chức năng. Vì vậy, theo câu trả lời được chấp nhận trong liên kết của bạn, nó cần thiết, phải không?
Luis Mendo

1

Matlab, 63 50 byte

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

  • Điều này không đánh bại mã cùng tên khác, do đó tôi đặt nó: D.

  • Chương trình tìm các giải pháp số nguyên dương sau đó nhân với 4 để bao gồm các giải pháp âm.

  • Nó có thể thực hiện tất cả 25 trường hợp thử nghiệm đầu tiên

    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
    


cảm ơn @StewieGriffin tôi đã đưa nó vào như một trò chơi công bằng liên quan đến trò chơi của luis
Abr001am

Mẹo: Khi bạn dự định đăng kết quả từ MATLAB, hãy sử dụng 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)

Tôi biết đây không phải là câu trả lời JavaScript ngắn nhất ngay cả khi tôi đã xóa các dòng i / o, nhưng tôi nghĩ đó là câu trả lời JS hiệu quả nhất mang lại cho tôi kết quả trong một triệu trong vài giây (mười triệu mất khoảng một phút).


Bạn có thể sử dụng == thay vì === không?
lirtosiast

Tôi có thể, chỉ cần sử dụng thực hành tốt nhất, ha ha.
Adam Dally

1

PHP, 70 byte, không cạnh tranh

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

thuật toán bị đánh cắp từ một trong những câu trả lời của Python ... Tôi quên mất cái nào; muốn ít nhất một phần hiểu được những gì xảy ra trước khi tôi đăng.


for(;$x<=$n=$argv[1];)$s+=(-($n%(2*$x+1)<1))**$x++*4;echo$n?$s:1;tiết kiệm 5 byte. $x-~$xbằng 2*$x+1và bây giờ bạn có thể bắt đầu mà không cần gán biến.
Jörg Hülsermann
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.