Số kim tự tháp vuông


28

A000330 - OEIS

Bài tập

Nhiệm vụ của bạn rất đơn giản, tạo ra một chuỗi, chỉ số đã cho i, giá trị trên vị trí đó là tổng bình phương từ 0đến inơi i >= 0.

Thí dụ:

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)

Đặc điểm kỹ thuật:

  • Bạn có thể không có đầu vào và đầu ra chuỗi vô thời hạn;
  • Bạn có thể lấy đầu vào Nvà đầu ra Nthphần tử của chuỗi;
  • Bạn có thể lấy đầu vào Nvà đầu ra các Nphần tử đầu tiên của chuỗi.

2
Quan sát thú vị từ OEIS: Chuỗi này chứa chính xác hai hình vuông hoàn hảo: f(1) == 1 * 1 (1)f(24) == 70 * 70 (4900).
DJMcMayhem

Chúng ta có thể bắt đầu trình tự tại f(1) = 1?
Emigna

@Emigna xin lỗi nhưng không, bạn cần bắt đầu từ f(0) = 0. Tôi đã chỉ ra rằng với một vài câu trả lời không đạt yêu cầu đó
Felipe Nardi Batista

Các f(0) = 0yêu cầu bị hủy hoại một vài trong số các giải pháp của tôi :(
ATaco

Câu trả lời:



22

Python 2 , 22 byte

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

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

Điều này sử dụng công thức dạng đóng n * (n + 1) * (2 * n + 1) / 6 . Mã này thực hiện các hoạt động sau:

  • Bội số n bởi ( n*):

    • Phần bù bit của n ( ~n), về cơ bản có nghĩa là -1-n .
    • Và bằng cách bổ sung bitwise của 2n ( *~(n*2)), có nghĩa là -1-2n .
  • Chia cho 6 ( /6).

Python 2 , 27 byte

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

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

Đã lưu 1 byte nhờ Rod và 1 nhờ GB .


1
Điều này rất thông minh!
Skyler


14

JavaScript (ES6), 16 byte

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

Bản giới thiệu

Làm sao?

Biểu thức n+++nđược phân tích cú pháp là n++ + n(1) . Không phải là nó thực sự quan trọng bởi vì n + ++ncũng sẽ làm việc trong trường hợp này.

Vì thế:

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

đánh giá lại để sum (k = 0 ... n) (k²) .


(1) Điều này có thể được xác minh bằng cách thực hiện n='2';console.log(n+++n)cung cấp số nguyên 5, trong khi đó n + ++nsẽ cung cấp cho chuỗi '23'.




6

Brain-Flak , 34 byte

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

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

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

Ban đầu tôi có cùng ý tưởng với Riley 1 nhưng cảm thấy sai khi sử dụng zeroer. Sau đó tôi nhận ra rằng

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

Tính n 2 - n.

Tại sao? Chúng tôi biết

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

Tính n 2 và vòng lặp n lần. Điều đó có nghĩa là nếu chúng ta chuyển đổi thứ tự của hai lần đẩy, chúng ta sẽ đi từ tăng tổng bằng n + (n-1) mỗi lần để tăng tổng theo (n-1) + (n-1) mỗi lần. Điều này sẽ làm giảm kết quả một lần trên mỗi vòng lặp, do đó làm cho kết quả của chúng tôi là 2 - n. Ở cấp độ cao nhất, điều này sẽ hủy bỏ với n được tạo ra bởi cú đẩy mà chúng tôi đã làm giảm bớt sự cần thiết của một số 0 và tiết kiệm cho chúng tôi hai byte.

Brain-Flak , 36 byte

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

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

Đây là một giải pháp khác, nó không phải là golf nhưng nó khá lạ nên tôi nghĩ tôi sẽ để nó như một thách thức để tìm ra cách nó hoạt động.

Nếu bạn không tham gia Brain-Flak nhưng bạn vẫn muốn thử thách ở đây thì đó là tổng kết.

Hình ảnh


1: Tôi đã đưa ra giải pháp của mình trước khi tôi xem các câu trả lời ở đây. Vì vậy, không có đạo văn ở đây.


Tôi biết rằng phải có một cách để làm điều này, và tôi có cảm giác bạn sẽ là người tìm ra toán học cho nó.
Riley




2

Brain-Flak , 46 byte

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

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



@Riley Ooh tốt đẹp :)
HyperNeutrino

Thay vì đẩy hình vuông lên ngăn xếp thay thế, bạn có thể tính tổng nó trực tiếp bằng cách đánh giá và không đẩy nó, sau đó đẩy toàn bộ vòng lặp thay thế. Điều này thay đổi nửa thứ hai của bạn thành ({{({})({}[()])}{}}{})và tiết kiệm cho bạn 10 byte. (Nếu điều đó không có ý nghĩa, hãy ping tôi trong ngăn xếp thứ ba )
DJMcMayhem





2

R, 17 byte

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

Khá đơn giản, phải mất lợi thế từ thực tế là ^(lũy thừa) là vector hóa trong R .


1
(x=0:scan())%*%xngắn hơn một byte, nhưng tôi tin rằng bạn cần một catđầu ra.
Giuseppe

@Giuseppe Tôi vừa thử nó và mã của bạn hoạt động mà không có cat, nó tạo ra ma trận 1x1.
Rui Barradas

@RuiBarradas Đồng thuận meta hiện tại catlà cần thiết để điều này đủ điều kiện là một chương trình đầy đủ. Nếu bạn muốn thay đổi điều đó, hãy trả lời câu hỏi này và nhận một số lực kéo giữa những người R khác trên trang web.
Giuseppe

2

CJam , 9 byte

ri),_.*:+

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

Giải trình

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.

Cách khác:

ri),2f#:+

Điều này bình phương mỗi phần tử bằng cách ánh xạ 2#thay vì sử dụng các sản phẩm cặp. Và chỉ để giải trí, một sự thay thế khác không chính xác cho các đầu vào lớn vì nó sử dụng số học dấu phẩy động:

ri),:mh2#


2

Mê cung , 11 byte

:!\
+ :
*:#

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

In trình tự vô thời hạn.

Giải trình

Con trỏ lệnh chỉ tiếp tục chạy xung quanh bình phương mã nhiều lần:

:!\    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

Khối , 15 byte

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

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

Mã của tôi hơi buồn ):

Tính toán 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

Lục giác , 23 byte

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

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

Giải trình

Mở ra:

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

Đây thực sự chỉ là một chương trình tuyến tính với việc /sử dụng cho một số chuyển hướng. Mã tuyến tính là:

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

Mà tính n (n + 1) (2n + 1) / 6 . Nó sử dụng các cạnh bộ nhớ sau:

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

Trong đó điểm bộ nhớ (MP) bắt đầu trên cạnh có nhãn n , chỉ về hướng bắc.

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

Về lý thuyết, có thể điều chỉnh chương trình này thành chiều dài 3, vì /không cần thiết cho tính toán, nên :có thể sử dụng lại để chấm dứt chương trình và một số '"=+*{có thể được sử dụng lại, mang lại số lượng yêu cầu các lệnh dưới 19 (mức tối đa cho chiều dài phụ 3). Tôi nghi ngờ rằng có thể tìm thấy một giải pháp như vậy bằng tay, nếu một trong tất cả.


2

> <> , 15 13 11 byte

Đã lưu 2 byte nhờ Không phải là một cây

0:n:l1-:*+!

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

Xuất ra chuỗi vô thời hạn.


1
14 byte (12 + 2 cho -vcờ): ::1+:}+**6,n( Dùng thử trực tuyến! )
Không phải là cây

1
Hoặc 11 byte (in mãi mãi, bắt đầu từ N=1): Hãy thử trực tuyến!
Không phải là một cái cây

@Notatree: Ý tưởng rất hay sử dụng l. Kiểm tra với OP nếu bắt đầu lúc 1.
Emigna

@Notatree: Thật không may, chúng tôi không được phép bắt đầu từ 1, nhưng nó vẫn tiết kiệm được 2 byte. Cảm ơn!
Emigna

1
(Tôi nên đề cập rằng tôi đã có lý tưởng từ câu trả lời Mê cung của Martin Ender .)
Không phải là một cái cây

2

Pyth , 7 5 byte nhờ Steven H

s^R2h

Giải trình:

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

Giải pháp đầu tiên của tôi

sm*ddUh

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

Giải trình:

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

Không có quảng trường được xây dựng trong Pyth?
caird coinheringaahing

Không xa như tôi biết ...
Dave

Không có không có hình vuông được xây dựng trong Pyth. Ngoài ra 6 byte
Ông Xcoder


Có thể sửa với 1 byte cho mỗi câu trả lời, tôi sẽ chỉnh sửa khi tôi rời khỏi điện thoại di động.
Dave




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.