Tổng các số vuông lẻ nhỏ hơn N


19

Viết chương trình hoặc hàm để xuất tổng các số vuông lẻ (OEIS # A016754) nhỏ hơn đầu vào n .

44 số đầu tiên trong chuỗi là:

1, 9, 25, 49, 81, 121, 169, 225, 289, 361, 441, 529, 625, 729, 841, 961, 1089, 
1225, 1369, 1521, 1681, 1849, 2025, 2209, 2401, 2601, 2809, 3025, 3249, 3481, 
3721, 3969, 4225, 4489, 4761, 5041, 5329, 5625, 5929, 6241, 6561, 6889, 7225, 7569

Công thức cho chuỗi là a(n) = ( 2n + 1 ) ^ 2.

Ghi chú

  • Hành vi của chương trình của bạn có thể không được xác định cho n < 1(nghĩa là tất cả các đầu vào hợp lệ là >= 1.)

Các trường hợp thử nghiệm

1 => 0
2 => 1
9 => 1
10 => 10
9801 => 156849
9802 => 166650
10000 => 166650

1
Cả hai lý do gần đây đều là lý do hợp lệ để kết thúc một thử thách ...
Mego

Câu trả lời:


22

Thạch, 6 byte

½Ċ|1c3

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Lý lịch

Với tất cả các số nguyên dương k , ta có 1² + 3² + + (2k - 1) ² = k (2k - 1) (2k +1) 3 .

Vì có m C r = m! ((Mr)! R!) R-kết hợp của một tập hợp các phần tử m , ở trên có thể được tính là (2k + 1) C 3 = (2k + 1) 2k (2k - 1) 6 = k (2k - 1) (2k + 1) 3.

Để áp dụng công thức, chúng ta phải tìm 2k + 1 cao nhất sao cho (2k - 1) ² <n . Bỏ qua tính chẵn lẻ trong một khoảnh khắc, chúng ta có thể tính m cao nhất sao cho (m - 1) ² <nm = ceil (srqt (n)) . Để tăng điều kiện m nếu nó là số chẵn, chỉ cần tính m | 1 (bitwise HOẶC với 1 ).

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

½Ċ|1c3  Main link. Argument: n

½       Compute the square root of n.
 Ċ      Round it up to the nearest integer.
  |1    Bitwise OR with 1 to get an odd number.
    c3  Compute (2k + 1) C 3 (combinations).

6

JavaScript (ES6), 30 byte

f=(n,i=1)=>n>i*i&&i*i+f(n,i+2)

31 byte nếu f(1)cần trả về 0 thay vì false:

f=(n,i=1)=>n>i*i?i*i+f(n,i+2):0

6

05AB1E , 10 8 byte

Mã số:

<tLDÉÏnO

Giải trình:

<         # Decrease by 1, giving a non-inclusive range.
 t        # Take the square root of the implicit input.
  L       # Generate a list from [1 ... sqrt(input - 1)].
   DÉÏ    # Keep the uneven integers of the list.
      n   # Square them all.
       O  # Take the sum of the list and print implicitly.

Có thể có ích : t;L·<nO.

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .


6

Haskell, 30 byte

f n=sum[x^2|x<-[1,3..n],x^2<n]

Đáng ngạc nhiên là trông bình thường.


4

C #, 126 131 byte

Phiên bản chỉnh sửa để phù hợp với câu hỏi mới:

class P{static void Main(){int x,s=0,n=int.Parse(System.Console.ReadLine());for(x=1;x*x<n;x+=2)s+=x*x;System.Console.Write(s);}}

Sử dụng giới hạn mã hóa cứng:

using System;namespace F{class P{static void Main(){int x,s=0;for(x=1;x<100;x+=2)s+=x*x;Console.Write(s);Console.Read();}}}

4
Chào mừng bạn đến với Câu đố lập trình và Code Golf! Các định dạng đã thỏa thuận cho tiêu đề câu trả lời ở đây là # Language name, number bytesđể thống nhất.
con mèo

2
Tại sao bạn Console.Readở cuối?
Martin Ender

1
namespaces không cần thiết cho các tập tin duy nhất.
ASCII chỉ

1
Bạn cũng có thể lưu một vài byte bằng cách thực hiện System.Console.Write(s);nếu nó hoạt động và nếu bạn không cần Console.Read.
ASCII - chỉ

2
@Thomas Bạn có thể chạy chương trình của mình bằng Ctrl + F5 trong VS trong trường hợp đó cửa sổ sẽ vẫn mở sau khi chương trình kết thúc.
Martin Ender

4

Thạch, 7

’½R²m2S

Dùng thử trực tuyến hoặc thử phiên bản sửa đổi cho nhiều giá trị

Suỵt ... Dennis đang ngủ ...

Cảm ơn Sp3000 trong trò chuyện vì sự giúp đỡ của họ!

Giải trình:

’½R²m2S
’           ##  Decrement to prevent off-by-one errors
 ½R²        ##  Square root, then floor and make a 1-indexed range, then square each value
    m2      ##  Take every other value, starting with the first
      S     ##  sum the result

9
Dennis thực sự đã thức.
Dennis

@Dennis Ahh! Và cảnh báo quá, rõ ràng ...
FryAmTheEggman


4

R, 38 36 byte

function(n,x=(2*0:n+1)^2)sum(x[x<n])

@Giuseppe đã lưu hai byte bằng cách di chuyển xvào danh sách đối số để lưu các dấu ngoặc nhọn. Ý tưởng tuyệt vời!

Bị đánh cắp

function(n, x = (2*(0:n) + 1)^2)  # enough odd squares (actually too many)
  sum(x[x < n])                   # subset on those small enough
}

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


2
Chào mừng đến với PPCG!
Martin Ender

Trang web này là tuyệt vời, cảm ơn!
Michael M

Bạn sẽ có thể lưu hai byte bằng cách chuyển xsang một đối số hàm mặc định và sau đó bạn có thể loại bỏ các dấu ngoặc nhọn.
Giuseppe

3

C, 51, 50 48 byte

f(n,s,i)int*s;{for(*s=0,i=1;i*i<n;i+=2)*s+=i*i;}

Bởi vì tại sao không chơi golf bằng một trong những ngôn ngữ dài dòng nhất? (Này, ít nhất đó không phải là Java!)

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

Chương trình không hoàn chỉnh, với I / O kiểm tra:

int main()
{
    int s;
    f(10, &s);
    printf("%d\n", s);
    char *foobar[1];
    gets(foobar);
}

f(n,s,i)int*s;{for(*s=0,i=1;i*i<n;i+=2)*s+=i*i;}

most verbose languagesChơi golf nhiều hơn Python, C #, LISP, Forth, v.v., C thực sự khá tốt cho golf
mèo

@cat Tôi không nghĩ nó chơi golf nhiều hơn trăn. Nó chắc chắn tốt hơn java, rỉ sét và C #, nhưng mọi câu trả lời của python về thử thách này là < 50 bytes. Ngoài ra, có một bài meta có liên quan ở đây .
DJMcMayhem

3

Trên thực tế, 7 byte

√K1|3@█

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

Cũng cho 7 byte:

3,√K1|█

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

Điều này sử dụng công thức tương tự như trong câu trả lời Jelly của Dennis.

Giải trình:

√K1|3@█
√K       push ceil(sqrt(n))
  1|     bitwise-OR with 1
    3@█  x C 3

Người tiếp theo sẽ được gọi Literally?
mèo

3

Octave, 23 byte

@(x)(x=1:2:(x-1)^.5)*x'

Kiểm tra:

[f(1); f(2); f(3); f(10); f(9801); f(9802); f(10000)]
ans =    
        0
        1
        1
       10
   156849
   166650
   166650

3

CJam, 15 byte

qi(mq,2%:)2f#1b

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

Giải pháp 10000 mã hóa:

Giải pháp 12 byte của Martin:

99,2%:)2f#1b

Giải pháp 13 byte ban đầu của tôi:

50,{2*)2#}%:+

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


Mã của bạn là 14 byte (bạn có một dòng cấp dữ liệu trong liên kết), nhưng tôi nghĩ rằng nó không đúng cho đầu vào 9801, vì thử thách yêu cầu các ô vuông nhỏ hơn đầu vào.
Martin Ender

@MartinButtner Vâng, bạn nói đúng. Tôi sẽ xem liệu tôi có thể tìm thấy một bản sửa lỗi thanh lịch không
Một Simmons

2

Bình thường, 10 byte

s<#Qm^hyd2

Bộ kiểm tra

Giải trình:

s<#Qm^hyd2
    m          Map over the range of input (0 ... input - 1)
       yd      Double the number
      h        Add 1
     ^   2     Square it
 <#            Filter the resulting list on being less than
   Q           The input
s              Add up what's left

Thay thế (10 byte):s<#Q%2t^R2
Leaky Nun

2

Mathcad, 31 "byte"

nhập mô tả hình ảnh ở đây

Lưu ý rằng Mathcad sử dụng các phím tắt để nhập một số toán tử, bao gồm cả định nghĩa và tất cả các toán tử lập trình. Ví dụ: ctl-] đi vào một vòng lặp while - nó không thể được gõ và chỉ có thể được nhập bằng phím tắt hoặc từ thanh công cụ Lập trình. "Byte" được coi là số lượng thao tác bàn phím cần thiết để nhập một mục Mathcad (ví dụ: tên biến hoặc toán tử).

Vì tôi không có cơ hội chiến thắng trong cuộc thi này, tôi nghĩ tôi sẽ thêm một chút đa dạng với phiên bản công thức trực tiếp.


MathCAD được tính điểm như thế nào? Tôi có thể lấy nó ở đâu?
con mèo

Lời giải thích về việc bạn cho điểm là hơi ... mỏng manh, IMO
con mèo

1
Bạn cần phải thực hiện một câu hỏi meta cho việc chấm điểm của ngôn ngữ này.
Mego

Câu hỏi meta nghe có vẻ tốt. Cố gắng đưa ra một lời giải thích không mỏng manh cho việc ghi bàn sẽ nhanh chóng biến thành Chiến tranh và Hòa bình.
Stuart Bruff

2

Vợt, 57 byte

(λ(n)(for/sum([m(map sqr(range 1 n 2))]#:when(< m n))m))

2

MATL , 10 byte

qX^:9L)2^s

EDIT (ngày 30 tháng 7 năm 2016): mã được liên kết thay thế 9Lbằng cách 1Lthích ứng với những thay đổi gần đây trong ngôn ngữ.

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

q    % Implicit input. Subtract 1
X^   % Square root
:    % Inclusive range from 1 to that
9L)  % Keep odd-indexed values only
2^   % Square
s    % Sum of array

1

Python, 39 byte

f=lambda n,i=1:+(i*i<n)and i*i+f(n,i+2)

Nếu, vì n=1, nó hợp lệ cho đầu ra Falsechứ không phải 0, thì chúng ta có thể tránh chuyển đổi trường hợp cơ sở để có được 37 byte

f=lambda n,i=1:i*i<n and i*i+f(n,i+2)

Thật kỳ lạ mà tôi đã không tìm thấy một cách ngắn hơn để có được 0cho i*i>=nvà khác không khác. Trong Python 2, người ta vẫn nhận được 39 byte với

f=lambda n,i=1:~-n/i/i and i*i+f(n,i+2)

boollà một lớp con của intPython, có nghĩa Falselà một giá trị chấp nhận được 0.
con mèo

Có thể trùng lặp câu trả lời của orlp
Mego

1

Python, 42 38 byte

f=lambda n,i=1:i*i<n and i*i+f(n,i+2)

1

Python 2, 38 byte

s=(1-input()**.5)//2*2;print(s-s**3)/6

Dựa trên công thức của Dennis , với s==-2*k. Đầu ra một float. Trong thực tế, đầu vào là căn bậc hai, giảm dần, sau đó làm tròn đến số chẵn tiếp theo.


1

PARI / GP , 33 32 26 byte

Chuyển thể từ mã của Dennis :

n->t=(1-n^.5)\2*2;(t-t^3)/6

Ý tưởng đầu tiên của tôi (30 byte), sử dụng công thức đa thức đơn giản:

n->t=((n-1)^.5+1)\2;(4*t^3-t)/3

Đây là một triển khai hiệu quả, thực sự không khác lắm so với phiên bản không được viết mà tôi sẽ viết:

a(n)=
{
  my(t=ceil(sqrtint(n-1)/2));
  t*(4*t^2-1)/3;
}

Một triển khai thay thế (37 byte) lặp lại trên mỗi ô vuông:

n->s=0;t=1;while(t^2<n,s+=t^2;t+=2);s

Một giải pháp thay thế khác (35 byte) thể hiện tính tổng mà không có biến tạm thời:

n->sum(k=1,((n-1)^.5+1)\2,(2*k-1)^2)

Một giải pháp khác, không đặc biệt cạnh tranh (40 byte), sử dụng định mức L 2 . Điều này sẽ tốt hơn nếu có sự hỗ trợ cho các vectơ với các chỉ số kích thước bước. (Người ta có thể tưởng tượng cú pháp n->norml2([1..((n-1)^.5+1)\2..2])sẽ giảm 8 byte.)

n->norml2(vector(((n-1)^.5+1)\2,k,2*k-1))

1

Haskell, 32 31 byte

 n#x=sum[x^2+n#(x+2)|x^2<n]
 (#1)

Ví dụ sử dụng: (#1) 9802-> 166650.

Chỉnh sửa: @xnor đã lưu một byte, với sự hiểu biết danh sách thông minh. Cảm ơn!


Đó là một byte ngắn hơn để lừa gạt người bảo vệ:n#x=sum[x^2+n#(x+2)|x^2<n]
xnor

1

Julia, 29 byte

f(n,i=1)=i^2<n?i^2+f(n,i+2):0

Đây là một hàm đệ quy chấp nhận một số nguyên và trả về một số nguyên.

Chúng tôi bắt đầu một chỉ mục ở mức 1 và nếu bình phương của nó nhỏ hơn đầu vào, chúng tôi lấy hình vuông và thêm kết quả của việc sử dụng lại chỉ số + 2, để đảm bảo rằng các số chẵn bị bỏ qua, nếu không chúng tôi trả về 0.


1

Oracle SQL 11.2, 97 byte

SELECT NVL(SUM(v),0)FROM(SELECT POWER((LEVEL-1)*2+1,2)v FROM DUAL CONNECT BY LEVEL<:1)WHERE v<:1;

1

Julia, 26 byte

x->sum((r=1:2:x-1)∩r.^2)

Điều này xây dựng phạm vi của tất cả các số nguyên dương, lẻ dưới n và mảng bình phương của các số nguyên trong phạm vi đó, sau đó tính tổng các số nguyên trong cả hai lần lặp.

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


1

Reng v.3.3, 36 byte

0#ci#m1ø>$a+¡n~
:m%:1,eq^c2*1+²c1+#c

Hãy thử nó ở đây!

Giải trình

1: khởi tạo

 0#ci#m1ø

Đặt cthành 0(bộ đếm) và đầu vào Icho mrìu. đi đến dòng tiếp theo

2: vòng lặp

:m%:1,eq^c2*1+²c1+#c

:nhân đôi giá trị hiện tại (số lẻ bình phương) và [Tôi mđặt max xuống. Tôi đã sử dụng thủ thuật ít hơn trong một câu trả lời khác , mà tôi sử dụng ở đây. %:1,ekiểm tra nếu STOS <Tosh. Nếu có, q^đi lên và thoát ra khỏi vòng lặp. Nếu không thì:

         c2*1+²c1+#c

cđặt bộ đếm xuống, nhân 2*đôi nó, 1+thêm một cái và ²bình phương nó. c1+#Cgia tăng c, và vòng lặp đi lại.

3: chung kết

        >$a+¡n~

$giảm giá trị cuối cùng (lớn hơn mong muốn), a+¡thêm cho đến khi chiều dài của ngăn xếp là 1, n~xuất ra và kết thúc.



1

Toán học 30 byte

Total[Range[1,Sqrt[#-1],2]^2]&

Hàm không tên này bình phương tất cả các số lẻ nhỏ hơn đầu vào ( Range[1,Sqrt[#-1],2]) và thêm chúng.


1

PHP, 64 byte

function f($i){$a=0;for($k=-1;($k+=2)*$k<$i;$a+=$k*$k);echo $a;}

Mở rộng:

function f($i){
    $a=0;
    for($k=-1; ($k+=2)*$k<$i; $a+=$k*$k);
    echo $a;
}

Trên mỗi lần lặp của forvòng lặp, nó sẽ thêm 2 vào k và kiểm tra xem k 2 có nhỏ hơn không $i, nếu nó được thêm k 2 vào $a.


1

R, 60 byte

function(n){i=s=0;while((2*i+1)^2<n){s=s+(2*i+1)^2;i=i+1};s}

Có chính xác như được mô tả trong thử thách, bao gồm trả về 0 cho trường hợp n = 1. Bị thoái hóa, ';' đại diện cho ngắt dòng trong R, bỏ qua bên dưới:

function(n){         # Take input n
i = s = 0            # Declare integer and sum variables
while((2*i+1)^2 < n) # While the odd square is less than n
s = s + (2*i+1)^2    # Increase sum by odd square
i = i + 1            # Increase i by 1
s}                   # Return sum, end function expression

1

Java 8, 128 119 117 111 49 byte

n->{int s=0,i=1;for(;i*i<n;i+=2)s+=i*i;return s;}

Dựa trên giải pháp C # của @Thomas .

Giải trình:

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

n->{           // Method with integer as both parameter and return-type
  int s=0,     //  Sum, starting at 0
      i=1;     //  Index-integer, starting at 1
  for(;i*i<n;  //  Loop as long as the square of `i` is smaller than the input
      i+=2)    //    After every iteration, increase `i` by 2
    s+=i*i;    //   Increase the sum by the square of `i`
  return s;}   //  Return the result-sum

0

Python 2, 49 byte

Điều này đã kết thúc ngắn hơn a lambda.

x=input()
i=1;k=0
while i*i<x:k+=i*i;i+=2
print k

Dùng thử trực tuyến

Ngắn nhất của tôi lambda, 53 byte :

lambda x:sum((n-~n)**2for n in range(x)if(n-~n)**2<x)
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.