รวมจำนวนสแควร์คี่น้อยกว่า N


19

เขียนโปรแกรมหรือฟังก์ชั่นเพื่อการส่งออกรวมของตารางเลขคี่ (OEIS # A016754)น้อยกว่า nการป้อนข้อมูล

44 หมายเลขแรกในลำดับคือ:

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

a(n) = ( 2n + 1 ) ^ 2สูตรสำหรับลำดับคือ

หมายเหตุ

  • พฤติกรรมของโปรแกรมของคุณอาจไม่ได้กำหนดไว้สำหรับn < 1(นั่นคืออินพุตที่ถูกต้องทั้งหมดคือ>= 1)

กรณีทดสอบ

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

1
ทั้งในเหตุผลที่ปิดในครั้งนี้มีเหตุผลที่ถูกต้องที่จะปิดความท้าทาย ...
ชำเลืองไปที่

คำตอบ:


22

เยลลี่ 6 ไบต์

½Ċ|1c3

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

พื้นหลัง

สำหรับทุกจำนวนเต็มบวกkเรามี1² + + 3²⋯ + (2k - 1) ² = k (2k - 1) (2k +1) ÷ 3

เนื่องจากมีm C r = m! ÷ ((mr)! r!) r -รวมชุดขององค์ประกอบmสามารถคำนวณข้างต้นเป็น(2k + 1) C 3 = (2k + 1) 2k (2k - 1) ÷ 6 = k (2k - 1) (2k + 1) ÷ 3

เมื่อต้องการใช้สูตรที่เราจะต้องพบสูงสุด2k + 1เช่นว่า(2k - 1) ² <n ละเว้นความเท่าเทียมกันสำหรับช่วงเวลาที่เราสามารถคำนวณสูงสุดเมตรเช่นที่(ม. - 1) ² <nเป็นm = ceil (srqt (n)) เพื่อเพิ่มเงื่อนไขเมตรถ้ามันเป็นแม้กระทั่งการคำนวณเพียงเมตร | 1 (bitwise OR กับ1 )

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

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

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

31 ไบต์หากf(1)ต้องการคืนค่าศูนย์แทนที่จะเป็นเท็จ:

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

6

05AB1E , 10 8 ไบต์

รหัส:

<tLDÉÏnO

คำอธิบาย:

<         # 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.

t;L·<nOอาจจะมาในที่มีประโยชน์:

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .


6

Haskell ขนาด 30 ไบต์

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

ดูแปลกตาอย่างน่าประหลาด


4

C #, 126 131 ไบต์

รุ่นที่แก้ไขเพื่อให้สอดคล้องกับคำถามใหม่:

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

ใช้ขีด จำกัด hardcoded:

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
ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ! รูปแบบที่ตกลงกันไว้สำหรับคำตอบส่วนหัวที่นี่# Language name, number bytesเพื่อความสอดคล้อง
แมว

2
ทำไมคุณConsole.Readถึงจุดสิ้นสุด?
Martin Ender

1
namespaceไม่จำเป็นสำหรับไฟล์เดียว
ASCII เท่านั้นเท่านั้น

1
นอกจากนี้คุณควรจะสามารถที่จะบันทึกไม่กี่ไบต์โดยการทำว่าการทำงานและถ้าคุณไม่จำเป็นต้องSystem.Console.Write(s); Console.Read
ASCII เท่านั้น

2
@Thomas คุณสามารถเรียกใช้โปรแกรมด้วย Ctrl + F5 ใน VS ซึ่งในกรณีนี้หน้าต่างจะยังคงเปิดอยู่หลังจากโปรแกรมสิ้นสุดลง
Martin Ender

4

เยลลี่, 7

’½R²m2S

ลองใช้แบบออนไลน์หรือลองใช้รุ่นที่แก้ไขแล้วสำหรับค่าหลายค่า

Shh ... Dennis กำลังนอนหลับ ...

ขอบคุณ Sp3000 ในการแชทเพื่อขอความช่วยเหลือ!

คำอธิบาย:

’½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 Ahh! และแจ้งเตือนด้วยเช่นกัน ...
FryAmTheEggman


4

R, 38 36 ไบต์

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

@Giuseppe บันทึกสองไบต์ด้วยการย้ายxไปยังรายการอาร์กิวเมนต์เพื่อบันทึกวงเล็บปีกกา ไอเดียเด็ด ๆ !

Ungolfed

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

ลองออนไลน์!


2
ยินดีต้อนรับสู่ PPCG!
Martin Ender

เว็บไซต์นี้ยอดเยี่ยมขอบคุณ!
Michael M

คุณควรจะสามารถบันทึกสองไบต์โดยย้ายxไปยังอาร์กิวเมนต์ฟังก์ชันเริ่มต้นจากนั้นคุณสามารถลบวงเล็บปีกกา
Giuseppe

3

C, 51, 50 48 ไบต์

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

เพราะเหตุใดจึงไม่เล่นกอล์ฟในภาษาใดภาษาหนึ่งที่ละเอียดที่สุด? (เฮ้อย่างน้อยก็ไม่ใช่ Java!)

ลองออนไลน์!

โปรแกรมที่ไม่สมบูรณ์พร้อมทดสอบ I / O:

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 languagesgolfy มากกว่า Python, C #, LISP, Forth และอื่น ๆ C จริงๆแล้วค่อนข้างดีสำหรับการเล่นกอล์ฟ
แมว

@cat ฉันไม่คิดว่ามันเป็นกอล์ฟมากกว่างูหลาม มันแน่นอนดีกว่า Java, สนิมและ C # < 50 bytesแต่ทุกคำตอบหลามกับความท้าทายนี้อยู่ นอกจากนี้ยังมีการโพสต์เมตาที่เกี่ยวข้องที่นี่
DJMcMayhem

3

ที่จริงแล้ว 7 ไบต์

√K1|3@█

ลองออนไลน์!

นอกจากนี้สำหรับ 7 ไบต์:

3,√K1|█

ลองออนไลน์!

นี่ใช้สูตรเดียวกับในคำตอบของ Jelly Dennis

คำอธิบาย:

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

คนต่อไปจะถูกเรียกLiterally?
แมว

3

อ็อกเทฟ 23 ไบต์

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

การทดสอบ:

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

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

ลองออนไลน์!

โซลูชั่น Hardcoded 10000:

โซลูชั่น 12 byte ของ Martin:

99,2%:)2f#1b

โซลูชัน 13 ไบต์เดิมของฉัน:

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

ลองออนไลน์!


รหัสของคุณคือ 14 ไบต์ (คุณมีตัวป้อนบรรทัดต่อท้ายอยู่ในลิงก์) แต่ฉันคิดว่ามันไม่ถูกต้องสำหรับอินพุต 9801 เนื่องจากความท้าทายขอสี่เหลี่ยมเล็กกว่าอินพุต
Martin Ender

@MartinButtner ใช่คุณพูดถูก ฉันจะดูว่าฉันสามารถหาการแก้ไขที่สง่างาม
ซิมมอนส์


2

Mathcad, 31 "ไบต์"

enter image description here

โปรดทราบว่า Mathcad ใช้แป้นพิมพ์ลัดเพื่อป้อนตัวดำเนินการหลายรายการรวมถึงคำจำกัดความและตัวดำเนินการเขียนโปรแกรมทั้งหมด ตัวอย่างเช่น ctl-] เข้าสู่ while loop - ไม่สามารถพิมพ์ได้และสามารถป้อนได้โดยใช้แป้นพิมพ์ลัดหรือจากแถบเครื่องมือการเขียนโปรแกรม "Bytes" ถูกกำหนดให้เป็นจำนวนการใช้งานคีย์บอร์ดที่จำเป็นในการป้อนรายการ Mathcad (เช่นชื่อตัวแปรหรือโอเปอเรเตอร์)

เนื่องจากฉันไม่มีโอกาสชนะการแข่งขันนี้ฉันจึงคิดว่าฉันจะเพิ่มความหลากหลายด้วยรุ่นสูตรโดยตรง


MathCAD ให้คะแนนอย่างไร หาได้ที่ไหน
แมว

คำอธิบายของการให้คะแนนที่คุณให้นั้นค่อนข้างบอบบาง IMO
cat

1
คุณต้องตั้งคำถามเมตาสำหรับการให้คะแนนภาษานี้
Mego

คำถาม Meta ฟังดูดี การพยายามให้คำอธิบายที่ไม่บอบบางสำหรับการให้คะแนนจะกลายเป็นสงครามและสันติภาพอย่างรวดเร็ว
Stuart Bruff


2

MATL 10 ไบต์

qX^:9L)2^s

แก้ไข (30 กรกฎาคม 2016): รหัสที่เชื่อมโยงแทนที่9Lด้วย1Lเพื่อปรับให้เข้ากับการเปลี่ยนแปลงล่าสุดในภาษา

ลองออนไลน์!

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

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

ถ้าหากn=1มันใช้งานได้กับเอาต์พุตFalseแทนที่จะเป็นแบบ0นั้นเราสามารถหลีกเลี่ยงการแปลงตัวพิมพ์ใหญ่ได้ 37 ไบต์

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

มันแปลกที่ฉันไม่ได้พบวิธีที่สั้นกว่าที่จะได้รับ0สำหรับi*i>=nและไม่ใช่ศูนย์เป็นอย่างอื่น ใน Python 2 หนึ่งยังคงได้รับ 39 ไบต์ด้วย

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

boolเป็น subclass ของintในหลามซึ่งหมายความว่าเป็นค่าที่ยอมรับได้สำหรับFalse 0
แมว



1

Python 2, 38 ไบต์

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

ตามออกสูตรเดนนิสs==-2*kกับ ส่งออกลอย ในความเป็นจริงการป้อนข้อมูลจะถูกสแควร์รูทลดลงแล้วปัดขึ้นเป็นจำนวนคู่ถัดไป


1

PARI / GP , 33 32 26 ไบต์

ดัดแปลงจากรหัสของเดนนิส :

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

ความคิดแรกของฉัน (30 ไบต์) โดยใช้สูตรพหุนามง่าย ๆ :

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

นี่เป็นการใช้งานที่มีประสิทธิภาพจริง ๆ แล้วไม่แตกต่างจากเวอร์ชันที่ฉันไม่เขียนมาก:

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

อีกทางเลือกหนึ่ง (37 ไบต์) ซึ่งวนรอบแต่ละช่อง:

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

โซลูชันสำรองอื่น (35 ไบต์) แสดงการรวมโดยไม่มีตัวแปรชั่วคราว:

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

แต่แก้ไขปัญหาอื่นที่ไม่สามารถแข่งขันได้โดยเฉพาะอย่างยิ่ง (40 bytes) โดยใช้L 2บรรทัดฐาน สิ่งนี้จะดีกว่าถ้ามีการสนับสนุนเวกเตอร์ที่มีดัชนีขนาดขั้นตอน (ใคร ๆ ก็นึกภาพซินแท็คซ์n->norml2([1..((n-1)^.5+1)\2..2])ซึ่งจะลดลง 8 ไบต์)

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

1

Haskell, 32 31 ไบต์

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

ตัวอย่างการใช้งาน: (#1) 9802166650 ->

แก้ไข: @xnor บันทึกไบต์ด้วยความเข้าใจรายการที่ฉลาด ขอบคุณ!


สั้นลงเป็นจำนวนมากเพื่อที่จะโกงการ์ด:n#x=sum[x^2+n#(x+2)|x^2<n]
xnor

1

Julia, 29 ไบต์

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

นี่คือฟังก์ชันเรียกซ้ำที่ยอมรับจำนวนเต็มและส่งกลับจำนวนเต็ม

เราเริ่มต้นดัชนีที่ 1 และถ้าสแควร์น้อยกว่าอินพุทเรารับสแควร์และเพิ่มผลลัพธ์ของการ recusing บนดัชนี + 2 ซึ่งทำให้มั่นใจได้ว่าตัวเลขจะถูกข้ามไปมิฉะนั้นเราจะคืนค่า 0



1

จูเลีย 26 ​​ไบต์

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

สิ่งนี้จะสร้างช่วงของจำนวนเต็มบวกและคี่ทั้งหมดด้านล่างnและอาร์เรย์ของกำลังสองของจำนวนเต็มในช่วงนั้นจากนั้นคำนวณผลรวมของจำนวนเต็มทั้งใน iterables

ลองออนไลน์!


1

Reng v.3.3, 36 ไบต์

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

ลองที่นี่!

คำอธิบาย

1: การเริ่มต้น

 0#ci#m1ø

ตั้งค่าcเป็น0(ตัวนับ) และอินพุตIเป็นmขวานไปที่บรรทัดถัดไป

2: วนรอบ

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

:ทำซ้ำค่าปัจจุบัน (เลขคี่ยกกำลังสอง) และ [ฉันmวางmขวานลง ฉันใช้กลอุบายน้อยกว่าในคำตอบอื่นซึ่งฉันใช้ที่นี่ %:1,eตรวจสอบว่า STOS <TOS ถ้าเป็นก็q^ขึ้นไปและแตกออกจากลูป มิฉะนั้น:

         c2*1+²c1+#c

cวางเคาน์เตอร์ลง2*สองเท่า1+เพิ่มหนึ่งและยก²กำลังสองc1+#Cเพิ่มขึ้นcและวงไปอีกครั้ง

3: ขั้นสุดท้าย

        >$a+¡n~

$ปล่อยค่าสุดท้าย (มากกว่าที่ต้องการ) a+¡เพิ่มจนกระทั่งความยาวของสแต็กคือ 1 n~เอาต์พุตและสิ้นสุด



1

Mathematica 30 ไบต์

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

ฟังก์ชั่นที่ไม่มีชื่อนี้จะยกกำลังสองจำนวนคี่น้อยกว่าอินพุท ( Range[1,Sqrt[#-1],2]) และเพิ่มเข้าไป


1

PHP, 64 ไบต์

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

ขยาย:

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

ทวนของทุกforวงก็จะเพิ่ม 2 กับ k และตรวจสอบว่า k 2น้อยกว่า$iถ้ามันคือการเพิ่ม k 2$aไป


1

R, 60 ไบต์

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

ทำตามที่อธิบายไว้ในความท้าทายรวมถึงการคืนค่า 0 สำหรับกรณี n = 1 เสื่อมโทรม ';' แสดงให้เห็นถึงการ linebreak ใน R, ละเว้นด้านล่าง:

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

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

อิงตามโซลูชัน @Thomas 'C #แก้ปัญหา

คำอธิบาย:

ลองออนไลน์

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

lambdaเรื่องนี้จบลงด้วยการที่สั้นกว่า

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

ลองออนไลน์

ของฉันที่สั้นที่สุดlambda, 53 ไบต์ :

lambda x:sum((n-~n)**2for n in range(x)if(n-~n)**2<x)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.