หมายเลขเสี้ยมแบบจัตุรัส


28

A000330 - OEIS

งาน

งานของคุณเป็นเรื่องง่ายในการสร้างลำดับที่ได้รับดัชนีiค่ากับตำแหน่งว่าเป็นผลรวมของสี่เหลี่ยมจาก0ไม่เกินที่ii >= 0

ตัวอย่าง:

Input: 0
Output: 0           (0^2)

Input: 4
Output: 30          (0^2 + 1^2 + 2^2 + 3^2 + 4^2)

Input: 5
Output: 55          (0^2 + 1^2 + 2^2 + 3^2 + 4^2 + 5^2)

รายละเอียด:

  • คุณอาจไม่รับอินพุตและเอาท์พุทลำดับอย่างไม่มีกำหนด
  • คุณสามารถนำเข้าNและส่งออกNthองค์ประกอบของลำดับ;
  • คุณสามารถนำเข้าNและส่งออกNองค์ประกอบแรกของลำดับ

2
สังเกตจากสนุก OEIS: ลำดับนี้มีตรงสองสี่เหลี่ยมสมบูรณ์แบบ: และf(1) == 1 * 1 (1) f(24) == 70 * 70 (4900)
DJMcMayhem

เราจะเริ่มลำดับที่ได้f(1) = 1ไหม
Emigna

@Emigna ขอโทษ f(0) = 0แต่ไม่มีคุณจะต้องเริ่มต้นจาก ฉันได้ชี้ให้เห็นแล้วว่าคำตอบไม่กี่ข้อที่ล้มเหลวตามข้อกำหนดนั้น
เฟลิปาร์นาร์บาติสตา

f(0) = 0ความต้องการดังกล่าวทำลายโซลูชันบางส่วนของฉัน :(
ATaco

คำตอบ:



22

Python 2 , 22 ไบต์

lambda n:n*~n*~(n*2)/6

ลองออนไลน์!

ใช้สูตรนี้ปิดแบบฟอร์มn * (n + 1) * (2 * n + 1) / 6 รหัสทำการดำเนินการดังต่อไปนี้:

  • คูณnโดย ( n*):

    • ค่าบิตสมบูรณ์ของn ( ~n) ซึ่งเป็นหลักหมายถึง-1-n
    • และโดยที่สมบูรณ์บิตของ2n ( *~(n*2)) ซึ่งหมายความว่า-1-2n
  • หารด้วย6 ( /6)

Python 2 , 27 ไบต์

f=lambda n:n and f(n-1)+n*n

ลองออนไลน์!

ที่บันทึกไว้ 1 ขอบคุณไบต์Rodและขอบคุณที่ 1 GB


1
มันฉลาดมาก!
Skyler


14

JavaScript (ES6), 16 ไบต์

n=>n*(n+++n)*n/6

การสาธิต

อย่างไร?

การแสดงออกn+++nจะแยกเป็น(1)n++ + n ไม่ใช่ว่ามันสำคัญจริงๆเพราะn + ++nจะใช้งานได้ในกรณีนี้

ดังนั้น:

n*(n+++n)*n/6 =
n * (n + (n + 1)) * (n + 1) / 6 =
n * (2 * n + 1) * (n + 1) / 6

ซึ่งประเมินผลรวม (k = 0 ... n) (k²)


(1) นี้สามารถตรวจสอบได้โดยการทำn='2';console.log(n+++n)ซึ่งจะช่วยให้จำนวนเต็ม5ในขณะที่จะให้สตริงn + ++n'23'



6

Brain-Flakขนาด 36 ไบต์

({<(({}[()])())>{({})({}[()])}{}}{})

ลองออนไลน์!

# Main algorithm
(                                  )  # Push the sum of:
                {({})({}[()])}{}      #   The square of:
 {                              }     #     0 to i 

# Stuff for the loop
  <(({}[()])())>                      # Push i-1, i without counting it in the sum
                                 {}   # Pop the counter (0)

ทำได้ดีมาก! :) ฉันมาด้วย({<(({}))>{({})({}[()])}{}<({}[()])>})38
DJMcMayhem


6

Brain-Flakขนาด 34 ไบต์

({(({}[()])()){({}[()])({})}{}}{})

ลองออนไลน์!

มันทำงานยังไง?

ตอนแรกฉันมีความคิดเช่นเดียวกับRiley 1แต่รู้สึกผิดที่ใช้ Zeroer ฉันรู้แล้วว่า

{({}[()])({})}{}

คำนวณ n 2 - n

ทำไม? เราก็รู้

{({})({}[()])}{}

คำนวณ n 2และลูป n ครั้ง นั่นหมายความว่าถ้าเราสลับลำดับของทั้งสองผลักเราไปจากการเพิ่มผลรวมด้วย n + (n-1) ในแต่ละครั้งเพื่อเพิ่มผลรวมโดย (n-1) + (n-1) ในแต่ละครั้ง สิ่งนี้จะลดผลลัพธ์ทีละหนึ่งวงดังนั้นจึงทำให้ผลลัพธ์ของเรา n 2 - n ที่ระดับบนสุดนี้ -n ยกเลิกด้วย n ที่สร้างขึ้นโดยการกดที่เรา zeroing บรรเทาความต้องการ zeroer และช่วยเราสองไบต์

Brain-Flakขนาด 36 ไบต์

({({})(({}[()])){({})({}[()])}{}}{})

ลองออนไลน์!

นี่เป็นวิธีแก้ไขปัญหาอื่น ๆ ไม่ใช่เรื่องกอล์ฟ แต่มันแปลกมากฉันคิดว่าฉันจะปล่อยให้มันเป็นความท้าทายในการหาวิธีการทำงาน

หากคุณไม่ได้เข้าร่วมใน Brain-Flak แต่คุณยังต้องการความท้าทายที่นี่

ภาพ


1: ฉันคิดวิธีแก้ปัญหาก่อนที่จะดูคำตอบที่นี่ ดังนั้นไม่มีการลอกเลียนแบบที่นี่


ฉันรู้ว่าต้องมีวิธีในการทำสิ่งนี้และฉันก็รู้สึกว่าคุณจะเป็นคนหนึ่งในการหาคณิตศาสตร์สำหรับมัน
Riley




2

Brain-Flakขนาด 46 ไบต์

{(({})[()])}{}{({({})({}[()])}{}<>)<>}<>({{}})

ลองออนไลน์!



@Riley Ooh ดี :)
HyperNeutrino

แทนที่จะกดสี่เหลี่ยมลงบนสแต็กสำรองคุณสามารถรวมได้โดยตรงโดยการประเมินและไม่ผลักมันจากนั้นกดทั้งวงแทน สิ่งนี้เปลี่ยนครึ่งหลังของคุณเป็น({{({})({}[()])}{}}{})และช่วยให้คุณประหยัด 10 ไบต์ (หากยังไม่สมเหตุสมผลให้ปิงฉันในสแต็กที่สาม )
DJMcMayhem

2

CJam , 10 ไบต์

ri),{_*+}*

ลองออนไลน์!

ri            e# Input integer n
  )           e# Add 1
   ,          e# Range [0 1 ... n]
    {   }*    e# Fold (reduce)
     _        e# Duplicate
      *       e# Multiply
       +      e# Add

วิธีการเกี่ยวกับri),_.*:+หรือri),2f#:+?
Martin Ender

@ มาร์ตินความคิดที่ดี! ฉันคิดว่าคุณควรโพสต์เป็นคำตอบที่ต่างออกไป
Luis Mendo



2

APL (Dyalog) , 7 5 ไบต์

บันทึก 2 ไบต์ด้วย @Mego

+.×⍨⍳

ลองออนไลน์!

อย่างไร?

- พิสัย

+.× - สินค้าดอท

- ด้วยตัวเอง


@ อุรีเอลที่ไม่ดีของฉันฉันคิดว่า¨⍳มันเป็นสิ่งจำเป็น
เฟลิปาร์นาร์บาติสตา

2

R, 17 ไบต์

sum((0:scan())^2)

สวยตรงไปตรงมาจะใช้ประโยชน์จากความจริงที่ว่า^(ยกกำลัง) จะ vectorized ในR


1
(x=0:scan())%*%xสั้นลงหนึ่งไบต์ แต่ฉันเชื่อว่าคุณต้องการ a catเพื่อรับเอาต์พุต
Giuseppe

@Giuseppe ฉันเพิ่งลองและใช้งานรหัสของคุณไม่catได้มันจะส่งออกเมทริกซ์ 1x1
Rui Barradas

@RuiBarradas ฉันทามติ meta ปัจจุบันcatเป็นสิ่งจำเป็นสำหรับสิ่งนี้ที่จะมีคุณสมบัติเป็นโปรแกรมเต็มรูปแบบ หากคุณต้องการเปลี่ยนให้ตอบคำถามนี้และรับแรงฉุดระหว่างคนอื่น ๆ ในเว็บไซต์
Giuseppe

2

CJam , 9 ไบต์

ri),_.*:+

ลองออนไลน์!

คำอธิบาย

ri        e# Read input and convert to integer N.
  ),      e# Get range [0 1 2 ... N].
    _     e# Duplicate.
     .*   e# Pairwise products, giving [0 1 4 ... N^2].
       :+ e# Sum.

อีกวิธีหนึ่งคือ:

ri),2f#:+

นี่กำลังสองแต่ละองค์ประกอบโดยการแมป2#แทนการใช้ผลิตภัณฑ์ที่จับคู่ และเพื่อความสนุกอีกทางเลือกหนึ่งที่ไม่ถูกต้องสำหรับอินพุตขนาดใหญ่เนื่องจากใช้เลขคณิตแบบลอยตัว:

ri),:mh2#


2

เขาวงกต 11 ไบต์

:!\
+ :
*:#

ลองออนไลน์!

พิมพ์ลำดับไปเรื่อย ๆ

คำอธิบาย

ตัวชี้คำสั่งจะยังคงวิ่งไปรอบ ๆ สแควร์ของโค้ดซ้ำแล้วซ้ำอีก:

:!\    Duplicate the last result (initially zero), print it and a linefeed.
:      Duplicate the result again, which increases the stack depth.
#      Push the stack depth (used as a counter variable).
:*     Square it.
+      Add it to the running total.

2

Cubix , 15 ไบต์

Iu):^\+*p*6u@O,

ลองออนไลน์!

รหัสของฉันค่อนข้างเศร้า ):

คำนวณ n*(n+1)*(2n+1)/6

    I u
    ) :
^ \ + * p * 6 u
@ O , . . . . .
    . .
    . .

^Iu : read in input, u-turn
    : stack  n
:)\ : dup, increment, go right..oh, hey, it cheered up!
    : stack: n, n+1
+   : sum
    : stack: n, n+1, 2*n+1
*   : multiply
    : stack: n, n+1, 2*n+1, (n+1)*(2*n+1)
p   : move bottom of stack to top
    : stack: n+1, 2*n+1, (n+1)*(2*n+1), n
*   : multiply
6   : push 6
u   : right u-turn
,   : divide
O   : output
@   : terminate





2

Hexagony , 23 ไบต์

?'+)=:!@/*"*'6/{=+'+}/{

ลองออนไลน์!

คำอธิบาย

กางออก:

   ? ' + )
  = : ! @ /
 * " * ' 6 /
{ = + ' + } /
 { . . . . .
  . . . . .
   . . . .

นี่เป็นเพียงโปรแกรมเชิงเส้นที่/ใช้สำหรับการเปลี่ยนเส้นทางบางอย่าง รหัสเชิงเส้นคือ:

?'+){=+'+}*"*'6{=:!@

ซึ่งคำนวณn (n + 1) (2n + 1) / 6 มันใช้ขอบหน่วยความจำต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

จุดที่หน่วยความจำ (MP) เริ่มต้นที่ขอบป้ายnชี้ไปทางทิศเหนือ

?   Read input into edge labelled 'n'.
'   Move MP backwards onto edge labelled 'n+1'.
+   Copy 'n' into 'n+1'.
)   Increment the value (so that it actually stores the value n+1).
{=  Move MP forwards onto edge labelled 'temp' and turn around to face
    edges 'n' and 'n+1'.
+   Add 'n' and 'n+1' into edge 'temp', so that it stores the value 2n+1.
'   Move MP backwards onto edge labelled '2n+1'.
+   Copy the value 2n+1 into this edge.
}   Move MP forwards onto 'temp' again.
*   Multiply 'n' and 'n+1' into edge 'temp', so that it stores the value
    n(n+1).
"   Move MP backwards onto edge labelled 'product'.
*   Multiply 'temp' and '2n+1' into edge 'product', so that it stores the
    value n(n+1)(2n+1).
'   Move MP backwards onto edge labelled '6'.
6   Store an actual 6 there.
{=  Move MP forwards onto edge labelled 'result' and turn around, so that
    the MP faces edges 'product' and '6'.
:   Divide 'product' by '6' into 'result', so that it stores the value
    n(n+1)(2n+1)/6, i.e. the actual result.
!   Print the result.
@   Terminate the program.

ในทางทฤษฎีอาจเป็นไปได้ที่จะปรับโปรแกรมนี้ให้มีความยาวด้านข้าง 3 เนื่องจาก/ไม่จำเป็นสำหรับการคำนวณ:สามารถนำกลับมาใช้ใหม่เพื่อยุติโปรแกรมและ'"=+*{อาจนำมาใช้ซ้ำได้เช่นกัน คำสั่งต่ำกว่า 19 (สูงสุดสำหรับความยาวด้าน 3) ฉันสงสัยว่ามันเป็นไปได้ที่จะหาวิธีแก้ปัญหาด้วยมือแม้ว่าจะมีอยู่จริง


2

> <> , 15 13 11 ไบต์

บันทึก 2 ไบต์ขอบคุณที่ไม่ใช่ต้นไม้

0:n:l1-:*+!

ลองออนไลน์!

เอาต์พุตลำดับอย่างไม่มีกำหนด


1
14 ไบต์ (12 + 2 สำหรับการ-vตั้งค่าสถานะ): ::1+:}+**6,n( ลองออนไลน์! )
ไม่ใช่ต้นไม้

1
หรือ 11 ไบต์ (พิมพ์ตลอดไปเริ่มที่N=1): ลองออนไลน์!
ไม่ใช่ต้นไม้

@Notatree: lความคิดที่ดีมากในการใช้ ตรวจสอบกับ OP หากไม่เป็นไรให้เริ่มต้นที่ 1
Emigna

@Notatree: น่าเสียดายที่เราไม่ได้รับอนุญาตให้เริ่มต้นที่ 1 แต่ก็ยังบันทึกได้ 2 ไบต์ ขอบคุณ!
Emigna

1
(ฉันควรพูดถึงว่าฉันได้รับlแนวคิดจากคำตอบเขาวงกตของ Martin Ender )
ไม่ใช่ต้นไม้

2

Pyth , 7 5 ไบต์ขอบคุณ Steven H

s^R2h

คำอธิบาย:

s^R2h       Full program - inputs from stdin and outputs to stdout
s           output the sum of
    h       range(input), with
 ^R2         each element squared

ทางออกแรกของฉัน

sm*ddUh

ลองออนไลน์!

คำอธิบาย:

sm*ddUh    Full program - inputs from stdin and outputs to stdout
s          sum of
 m   Uh    each d in range(input)
  *dd      squared

ไม่มีจัตุรัสในตัวใน Pythe ไหม?
caird coinheringaahing

ไม่เท่าที่ฉันรู้ ...
เดฟ

ไม่มีจัตุรัสในตัว Pyth นอกจากนี้6 ไบต์
นาย Xcoder

1

แก้ไขได้ด้วย +1 ไบต์ของแต่ละคำตอบฉันจะแก้ไขเมื่อฉันออกจากมือถือ
เดฟ




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.