Kare piramidal sayılar


28

A000330 - OEIS

Görev

Görevin basittir, indeks verildiğinde i, o konumdaki değerin, oradan oraya 0kadar karelerin toplamı olduğu bir dizi oluşturmak .ii >= 0

Örnek:

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)

Şartname:

  • Hiçbir girdi alamaz ve diziyi süresiz olarak çıkarabilirsiniz;
  • Girdiyi alabilir Nve Nthdizinin elemanını çıkartabilirsiniz;
  • Dizinin Nilk Nöğelerini girebilir ve çıktısını alabilirsiniz .

2
OEIS'den eğlenceli gözlem: Bu sıra tam olarak iki mükemmel kare içeriyor:, f(1) == 1 * 1 (1)ve f(24) == 70 * 70 (4900).
DJMcMayhem

Sırada başlayabilir miyiz f(1) = 1?
Emigna

@Emigna üzgünüm ama hayır, başlaman gerek f(0) = 0. bu şartı yerine getirmeyen birkaç cevaba işaret ettim
Felipe Nardi Batista

f(0) = 0Gereklilik :( benim çözümlerin bir kaç harap
Ataco

Yanıtlar:



22

Python 2 , 22 bayt

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

Çevrimiçi deneyin!

Bu kapalı formülü n * (n + 1) * (2 * n + 1) / 6 formülü kullanır . Kod aşağıdaki işlemleri gerçekleştirir:

  • N ile çarpımlar ( n*):

    • Temelde -1-n anlamına gelen n ( ~n) bitsel tamamlayıcısı .
    • Ve 2n ( *~(n*2)) ' nin bitsel tamamlayıcısıyla, -1-2n anlamına gelir .
  • 6'ya bölünür ( /6).

Python 2,27 bayt

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

Çevrimiçi deneyin!

1 bayt sayesinde Kaydedilen Rod ve 1 sayesinde GB .


1
Bu çok zekice!
Skyler


14

JavaScript (ES6), 16 bayt

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

gösteri

Nasıl?

İfade (1)n+++n olarak ayrıştırılır . Bu gerçekten önemli değil çünkü bu durumda da işe yarayacaktı.n++ + nn + ++n

Bu nedenle:

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

bu da toplamı değerlendirir (k = 0 ... n) (k²) .


(1) Bu n='2';console.log(n+++n), tamsayıyı veren yapılarak doğrulanabilir 5, oysa n + ++ndize verilir '23'.




6

Brain-Flak , 34 bayt

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

Çevrimiçi deneyin!

O nasıl çalışır?

Başlangıçta Riley 1 ile aynı fikre sahiptim, ancak sıfır kullanmak yanlış hissettim. Sonra anladım ki

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

N 2 - n değerini hesaplar .

Niye ya? Peki biz biliyoruz

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

N 2'yi hesaplar ve n kere döngüler. Bunun anlamı, iki itme sırasını değiştirirsek, toplamı her seferinde n + (n-1) arttırmaktan, toplamı her seferinde (n-1) + (n-1) arttırmaktan geçiyoruz. Bu, sonucu döngü başına bir azaltacaktır, bu da sonucumuzu 2 - n yapacaktır . En üst seviyede, bu -n, sıfırlama ihtiyacını hafiflettiğimiz ve bizi iki bayttan tasarruf ettiğimizde, push tarafından oluşturulan n'yi iptal eder.

Brain-Flak , 36 bayt

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

Çevrimiçi deneyin!

İşte başka bir çözüm, golf gibi değil ama oldukça garip, bu yüzden nasıl çalıştığını anlamak için onu bir meydan okuma olarak bırakacağımı düşündüm.

Brain-Flak'a katılmıyorsanız, ancak yine de buradaki mücadeleyi istiyorsanız, bu bir özet.

Resim


1: Buradaki cevaplara bakmadan önce çözümümle geldim. Yani burada intihal yok.


Bunu yapmanın bir yolu olması gerektiğini biliyordum ve bunun için matematiği anlayan kişi olacağınıza dair bir his vardı.
Riley,







2

Aslında , 3 bayt

R;*

Çevrimiçi deneyin!

Alır Ngirdi olarak alır ve çıktı olarak Nsırayla elemanından.

Açıklama:

R;*
R    range(1, N+1) ([1, 2, ..., N])
 ;*  dot product with self


2

R, 17 bayt

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

Oldukça basit, ^(üstelleşmenin) R'de vektörleştirilmesinden faydalanıyor .


1
(x=0:scan())%*%xbayt tarafından daha kısa, ancak catçıktı almak için bir ihtiyacınız olduğuna inanıyorum .
Giuseppe

@Giuseppe Yeni denedim ve kodunuz olmadan çalışıyor cat, 1x1'lik bir matris çıkarıyor .
Rui Barradas

@RuiBarradas Mevcut meta fikir birliği, bunun cattam bir program olarak nitelendirilmesi için gereklidir. Bunu değiştirmek isterseniz, bu soruyu cevaplayın ve sitedeki diğer R insanları arasında bir miktar çekiş yapın.
Giuseppe

2

CJam , 9 bayt

ri),_.*:+

Çevrimiçi deneyin!

açıklama

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.

Alternatif:

ri),2f#:+

Bu, her bir elemanı 2#çift ​​ürünler kullanmak yerine eşleyerek kareler . Ve sadece eğlence için, kayan nokta aritmetiği kullandığından, büyük girdiler için yanlış olan başka bir alternatif:

ri),:mh2#

2

Julia , 16 14 bayt

@MartinEnder sayesinde 2 bayt kaydedildi

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

Çevrimiçi deneyin!

Nasıl?

(x=1:n)bir dizi oluşturur 1etmek nve atama için x, ürünü nokta x.


2

Labirent , 11 bayt

:!\
+ :
*:#

Çevrimiçi deneyin!

Diziyi süresiz olarak yazdırır.

açıklama

Talimat göstericisi, kod karesinde tekrar tekrar dolaşmaya devam eder:

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

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

Çevrimiçi deneyin!

Kodum biraz üzgün ):

hesaplar 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

Altıgen , 23 bayt

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

Çevrimiçi deneyin!

açıklama

Kırımsız:

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

Bu gerçekten sadece /bazı yönlendirme için kullanılan doğrusal bir programdır . Doğrusal kod:

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

Hangi n (n + 1) (2n + 1) / 6 hesaplar ? Aşağıdaki bellek kenarlarını kullanır:

görüntü tanımını buraya girin

Bellek noktasının (MP) n işaretli kenarda başladığı, kuzeye işaret ettiği yerde.

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

Teoride, bu programın 3 uzunluğuna sığması mümkün olabilir, çünkü /hesaplama için gerekmediği için :, programı sonlandırmak için yeniden kullanılabilir ve bazılarının '"=+*{yeniden kullanımı mümkün olabilir ve bu da gerekli sayıyı getirir. 19'un altındaki komutlar (yan uzunluk 3 için maksimum). Bu tür bir çözümü, eğer varsa, elle elde etmenin mümkün olduğundan şüpheliyim.


2

> <> , 15 13 11 bayt

Ağaç Değil sayesinde 2 bayt kaydedildi

0:n:l1-:*+!

Çevrimiçi deneyin!

Diziyi süresiz olarak verir.


1
14 bayt ( -vbayrak için 12 + 2 ): ::1+:}+**6,n( Çevrimiçi deneyin! )
Ağaç değil

1
Veya 11 bayt (sonsuza dek yazdırır N=1): Çevrimiçi deneyin!
Bir ağaç değil

@ Not: Çok güzel bir fikir kullanmak l. OP ile kontrol etmek 1'den başlamak için uygun mu
Emigna

@ Not: Maalesef 1'den başlamamıza izin verilmez, ancak yine de 2 bayt kaydeder. Teşekkürler!
Emigna

1
( lMartin Ender'in Labirentinin cevabından fikir aldığımdan bahsetmeliyim .)
Bir ağaç değil,

2

Pyth , Steven H sayesinde 7 5 bayt

s^R2h

Açıklama:

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

İlk çözümüm

sm*ddUh

Çevrimiçi deneyin!

Açıklama:

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

Pyth'te hiç kare yok mu?
caird coinheringaahing

Bildiğim kadarıyla değil ...
Dave

Hayır, yerleşik Pyth'te kare yoktur. Ayrıca 6 bayt
Bay Xcoder


Her cevaba +1 bayt ile düzeltilebilir, cep telefonundan çıktıktan sonra düzenleyeceğim.
Dave,

1

Neim , 3 bayt

𝐈ᛦ𝐬

Bu, Neim'in çokgen sayıdaki yerleşiklerini göstermek için zor olabilirdi, ama görünüşe göre değil.

Çevrimiçi deneyin!




Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.