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.

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 .


1
To bardzo sprytne!
Skyler


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



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)

Ładnie wykonane! :) Wymyśliłem ({<(({}))>{({})({}[()])}{}<({}[()])>})dla 38
DJMcMayhem


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.


Wiedziałem, że musi być na to sposób, i miałem wrażenie, że to ty obliczysz matematykę.
Riley





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

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

R, 17 bajtów

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

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


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#

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.


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.

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





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.


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ść.


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

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


Można to naprawić za pomocą bajtu +1 do każdej odpowiedzi. Będę edytować, gdy zejdę z telefonu komórkowego.
Dave




Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.