Kwadratowe liczby piramidalne

28

A000330 - OEIS

Zadanie

Twoje zadanie jest proste, generuje sekwencję, która, biorąc pod uwagę wskaźnik i, wartość na tej pozycji jest sumą kwadratów od 0września igdzie i >= 0.

Przykład:

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)

Specyfikacja:

  • Możesz nie przyjmować żadnych danych wejściowych i wyjściowych w nieskończoność;
  • Możesz przyjmować dane wejściowe Ni wyjściowe Nthelementu sekwencji;
  • Możesz wziąć dane wejściowe Ni wyjściowe pierwszych Nelementów sekwencji.
Felipe Nardi Batista
źródło
2
Zabawna obserwacja z OEIS: Ta sekwencja zawiera dokładnie dwa idealne kwadraty: f(1) == 1 * 1 (1)i f(24) == 70 * 70 (4900).
DJMcMayhem
Czy możemy rozpocząć sekwencję od f(1) = 1?
Emigna
@Emigna przepraszam, ale nie, musisz zacząć od f(0) = 0. wskazałem na kilka odpowiedzi, które nie spełniły tego wymogu
Felipe Nardi Batista
f(0) = 0Wymóg zniszczony kilka moich rozwiązań :(
Ataco

Odpowiedzi:

22

Python 2 , 22 bajty

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

Wypróbuj online!

Wykorzystuje to formułę zamkniętą n * (n + 1) * (2 * n + 1) / 6 . Kod wykonuje następujące operacje:

  • Mnoży n przez ( n*):

    • Bitowe uzupełnienie n ( ~n), które zasadniczo oznacza -1-n .
    • I przez bitowe uzupełnienie 2n ( *~(n*2)), co oznacza -1-2n .
  • Dzieli przez 6 ( /6).

Python 2 , 27 bajtów

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

Wypróbuj online!

Zaoszczędzono 1 bajt dzięki Rod i 1 dzięki GB .

Pan Xcoder
źródło
1
To bardzo sprytne!
Skyler
14

MATL , 3 bajty

:Us

... czy oni?

Wypróbuj online!

Wyjaśnienie

:    % Implicit input n. Push range [1 2 ... n]
U    % Square, element-wise
s    % Sum of array. Implicit display
Luis Mendo
źródło
14

JavaScript (ES6), 16 bajtów

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

Próbny

W jaki sposób?

Wyrażenie n+++njest analizowane jako n++ + n(1) . Nie to, że to naprawdę ma znaczenie, ponieważ n + ++ndziałałoby również w tym przypadku.

W związku z tym:

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

który ma wartość sumy (k = 0 ... n) (k²) .


(1) Można to zweryfikować, wykonując n='2';console.log(n+++n)co daje liczbę całkowitą 5, podczas gdy n + ++ndaje ciąg '23'.

Arnauld
źródło
6

Brain-Flak , 36 bajtów

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

Wypróbuj online!

# 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)
Riley
źródło
Ładnie wykonane! :) Wymyśliłem ({<(({}))>{({})({}[()])}{}<({}[()])>})dla 38
DJMcMayhem
34 bajty;)
Kreator pszenicy
6

Brain-Flak , 34 bajty

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

Wypróbuj online!

Jak to działa?

Początkowo miałem ten sam pomysł co Riley 1, ale źle było używać zerowania. Wtedy zdałem sobie z tego sprawę

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

Oblicza n 2 - n.

Czemu? Dobrze wiemy

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

Oblicza n 2 i pętle n razy. Oznacza to, że jeśli zmienimy kolejność dwóch wypychań, przechodzimy od zwiększania sumy za każdym razem o n + (n-1) do zwiększania sumy za każdym razem (n-1) + (n-1). Spowoduje to zmniejszenie wyniku o jeden na pętlę, co spowoduje, że nasz wynik n 2 - n. Na najwyższym poziomie to -n anuluje n generowane przez push, który zerowaliśmy, zmniejszając potrzebę zerowania i oszczędzając nam dwa bajty.

Brain-Flak , 36 bajtów

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

Wypróbuj online!

Oto inne rozwiązanie, nie jest tak golfowe, ale jest dość dziwne, więc pomyślałem, że zostawię to jako wyzwanie, aby dowiedzieć się, jak to działa.

Jeśli nie interesuje Cię Brain-Flak, ale nadal chcesz wyzwanie tutaj, jest to podsumowanie.

Picture


1: Wymyśliłem swoje rozwiązanie, zanim spojrzałem na odpowiedzi tutaj. Więc nie ma tu plagiatu.

Kreator pszenicy
źródło
Wiedziałem, że musi być na to sposób, i miałem wrażenie, że to ty obliczysz matematykę.
Riley
3

Japt , 3 bajty

ô²x

Wypróbuj tutaj.

-1 dzięki Shaggy .

Wyjaśnienie:

ò²x 
ô²  Map square on [0..input]
  x Sum
Erik the Outgolfer
źródło
3 bajty za pomocą skrótu do p2.
Shaggy
@FelipeNardiBatista naprawiono
Erik the Outgolfer
2

Brain-Flak , 46 bajtów

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

Wypróbuj online!

HyperNeutrino
źródło
@ Riley Ooh nice :)
HyperNeutrino
Zamiast wypychać kwadrat na alternatywny stos, można go sumować bezpośrednio, oceniając i nie wypychając go, a następnie popychając całą pętlę. To zmienia twoją drugą połowę na ({{({})({}[()])}{}}{})i oszczędza ci 10 bajtów. (Jeśli to nie ma sensu,
pinguj
2

CJam , 10 bajtów

ri),{_*+}*

Wypróbuj online!

ri            e# Input integer n
  )           e# Add 1
   ,          e# Range [0 1 ... n]
    {   }*    e# Fold (reduce)
     _        e# Duplicate
      *       e# Multiply
       +      e# Add
Luis Mendo
źródło
Co powiesz na ri),_.*:+lub ri),2f#:+?
Martin Ender
@Martin Dobry pomysł! Myślę, że powinieneś zamieścić to jako inną odpowiedź
Luis Mendo
2

Właściwie 3 bajty

R;*

Wypróbuj online!

Pobiera Njako dane wejściowe i wysyła Nelement th w sekwencji.

Wyjaśnienie:

R;*
R    range(1, N+1) ([1, 2, ..., N])
 ;*  dot product with self
Mego
źródło
2

APL (Dyalog) , 7 5 bajtów

2 bajty zapisane dzięki @Mego

+.×⍨⍳

Wypróbuj online!

W jaki sposób?

- zasięg

+.× - produkt kropkowy

- z samym sobą

Uriel
źródło
@Uriel mój zły, myślałem, że ¨⍳to konieczne
Felipe Nardi Batista
2

R, 17 bajtów

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

Dość proste, to korzysta z faktu, że ^(potęgowanie) jest wektorowy w R .

Frédéric
źródło
1
(x=0:scan())%*%xjest krótszy o bajt, ale uważam, że potrzebujesz catwyjścia.
Giuseppe
@Giuseppe Właśnie go wypróbowałem, a Twój kod działa bez catniego, wyświetla macierz 1x1.
Rui Barradas
@RuiBarradas Obecny meta konsensus jest catkonieczny, aby kwalifikować się jako pełny program. Jeśli chcesz to zmienić, odpowiedz na to pytanie i uzyskaj odrobinę trakcji wśród innych R. osób na stronie.
Giuseppe,
2

CJam , 9 bajtów

ri),_.*:+

Wypróbuj online!

Wyjaśnienie

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.

Alternatywnie:

ri),2f#:+

Kwadrat ten obejmuje każdy element poprzez mapowanie 2#zamiast używania produktów parowanych. I dla zabawy kolejna alternatywa, która staje się niedokładna dla dużych danych wejściowych, ponieważ wykorzystuje arytmetykę zmiennoprzecinkową:

ri),:mh2#
Martin Ender
źródło
2

Julia , 16 14 bajtów

2 bajty zapisane dzięki @MartinEnder

!n=(x=1:n)⋅x

Wypróbuj online!

W jaki sposób?

(x=1:n)tworzy szereg 1celu ni przypisać do x, dot product x.

Uriel
źródło
2

Labirynt , 11 bajtów

:!\
+ :
*:#

Wypróbuj online!

Drukuje sekwencję w nieskończoność.

Wyjaśnienie

Wskaźnik instrukcji cały czas krąży wokół kwadratu kodu:

:!\    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.
Martin Ender
źródło
2

Cubix , 15 bajtów

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

Wypróbuj online!

Mój kod jest trochę smutny ):

Oblicza 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

Giuseppe
źródło
2

Excel, 19 bajtów

=A1^3/3+A1^2/2+A1/6
Wernisch
źródło
2

Sześciokąt , 23 bajty

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

Wypróbuj online!

Wyjaśnienie

Rozłożony:

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

To jest naprawdę tylko liniowy program z /pewnym przekierowaniem. Kod liniowy to:

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

Który oblicza n (n + 1) (2n + 1) / 6 . Wykorzystuje następujące krawędzie pamięci:

enter image description here

Gdzie punkt pamięci (MP) zaczyna się na krawędzi oznaczonej n , wskazując na północ.

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

Teoretycznie może być możliwe dopasowanie tego programu do 3 długości boku, ponieważ /nie są one potrzebne do obliczeń, :mogą być ponownie użyte do zakończenia programu, a niektóre z nich '"=+*{mogą być również wielokrotnego użytku, zwiększając liczbę wymaganych polecenia poniżej 19 (maksimum dla długości boku 3). Wątpię, czy można znaleźć takie rozwiązanie ręcznie, jeśli w ogóle istnieje.

Martin Ender
źródło
2

> <> , 15 13 11 bajtów

Zaoszczędzono 2 bajty dzięki Not a tree

0:n:l1-:*+!

Wypróbuj online!

Wysyła sekwencję w nieskończoność.

Emigna
źródło
1
14 bajtów (12 + 2 dla -vflagi): ::1+:}+**6,n( Wypróbuj online! )
Nie drzewo,
1
Lub 11 bajtów (drukuje na zawsze, zaczynając od N=1): Wypróbuj online!
Nie drzewo,
@Notatree: Bardzo fajny pomysł przy użyciu l. Sprawdzanie za pomocą OP, czy można zacząć od 1.
Emigna
@Notatree: Niestety nie możemy zacząć od 1, ale nadal oszczędza 2 bajty. Dzięki!
Emigna
1
(Powinienem wspomnieć, że wpadłem na lpomysł z odpowiedzi Labiryntu Martina Endera .)
Nie drzewo,
2

Pyth , 7 5 bajtów dzięki Stevenowi H.

s^R2h

Wyjaśnienie:

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

Moje pierwsze rozwiązanie

sm*ddUh

Wypróbuj online!

Wyjaśnienie:

sm*ddUh    Full program - inputs from stdin and outputs to stdout
s          sum of
 m   Uh    each d in range(input)
  *dd      squared
Dave
źródło
Czy w Pyth nie ma wbudowanego kwadratu?
caird coinheringaahing
Nie, o ile wiem ...
Dave
Nie, nie ma kwadratowego wbudowanego Pytha. Również 6 bajtów
Mr. Xcoder
1
5 bajtów .
Steven H.
Można to naprawić za pomocą bajtu +1 do każdej odpowiedzi. Będę edytować, gdy zejdę z telefonu komórkowego.
Dave
1

Neim , 3 bajty

𝐈ᛦ𝐬

Może to być wyzwanie, aby pochwalić się wbudowanymi liczbami wielokątów Neima, ale najwyraźniej nie.

Wypróbuj online!

Okx
źródło