Квадратні пірамідальні числа


28

A000330 - OEIS

Завдання

Ваше завдання просте, сформуйте послідовність, що за даним індексом iзначення на цій позиції є сумою квадратів від 0upto iwhere i >= 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 вибачте, але ні, вам потрібно почати з цього 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 байт завдяки Роду та 1 завдяки ГБ .


1
Це дуже розумно!
Скайлер


14

JavaScript (ES6), 16 байт

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

Демо

Як?

Вираз n+++nпроаналізовано як n++ + n(1) . Не те, що насправді має значення, тому що 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

Мозок-Флак , 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

Мозок-Флак , 34 байти

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

Спробуйте в Інтернеті!

Як це працює?

Спочатку я мав таку ж ідею, що і Райлі 1, але мені було неправильно використовувати нуль. Потім я зрозумів це

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

Обчислює n 2 - n.

Чому? Добре ми знаємо

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

Обчислює n 2 і петлі n разів. Це означає, що якщо ми переключимо порядок двох натискань, ми переходимо від збільшення суми на n + (n-1) кожного разу до збільшення суми на (n-1) + (n-1) кожного разу. Це зменшить результат на один на цикл, зробивши таким чином наш результат n 2 - n. На найвищому рівні цей -n скасовується з n, що генерується натисканням, яке ми занулювали, зменшуючи необхідність нуля і економивши два байти.

Мозок-Флак , 36 байт

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

Спробуйте в Інтернеті!

Ось ще одне рішення, його не так гофро, але це досить дивно, тому я подумав, що залишу це як завдання, щоб зрозуміти, як воно працює.

Якщо ви не перебуваєте в "Brain-Flak", але ви все ще хочете, щоб виклик був тут, це як підсумок.

Картина


1: Я придумав своє рішення, перш ніж переглянув відповіді тут. Тож тут ніякого плагіату.


Я знав, що повинен бути спосіб це зробити, і я мав відчуття, що саме ти будеш розбирати математику для цього.
Райлі




2

Мозок-Флак , 46 байт

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

Спробуйте в Інтернеті!



@Riley Ooh приємно :)
HyperNeutrino

Замість того, щоб штовхати квадрат на альтернативний стек, ви можете підсумовувати його безпосередньо, оцінюючи та не натискаючи на нього, а потім натискаючи на нього всю петлю. Це змінює вашу другу половину на ({{({})({}[()])}{}}{})та заощадить 10 байт. (Якщо це не має сенсу, пінг мені в третій стек )
DJMcMayhem





2

R, 17 байт

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

Досить просто, він використовує той факт , що ^(зведення в ступінь) є векторизованних в R .


1
(x=0:scan())%*%xкоротше на байт, але я вважаю, що вам потрібен а, catщоб отримати вихід.
Джузеппе

@Giuseppe Я щойно спробував це, і ваш код працює без цього cat, він виводить матрицю 1x1.
Руй Баррадас

@RuiBarradas Поточний мета консенсус - це те, що catнеобхідно, щоб це було кваліфіковано як повноцінна програма. Якщо ви хочете змінити це, дайте відповідь на це запитання та знайдіть деяку привабливість серед інших людей на сайті.
Джузеппе

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

Шестикутник , 23 байти

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

Спробуйте в Інтернеті!

Пояснення

Розгорнуто:

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

Це дійсно просто лінійна програма, яка /використовується для певного перенаправлення. Лінійний код:

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

Який обчислює n (n + 1) (2n + 1) / 6 . Тут використовуються наступні краї пам'яті:

введіть тут опис зображення

Там, де точка пам’яті (МП) починається з краю, позначеного 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. Перевірка з ОП, чи нормально почати з 1.
Емінья

@Notatree: На жаль, нам заборонено починати з 1, але він все одно зберігає 2 байти. Спасибі!
Емінья

1
(Я мушу зазначити, що я отримав lідею з відповіді Мартіна Ендера на лабіринт .)
Не дерево

2

Pyth , 7 5 байт завдяки Стівену Н

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

Чи немає в Піті площі, збудованої?
caird coinheringaahing

Не наскільки я знаю ...
Дейв

Ні, немає квадратного вбудованого Pyth. Також 6 байт
містер Xcoder


Фіксується +1 байтом до кожної відповіді, я редагую, як тільки вийду з мобільного.
Дейв




Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.