Bana bir meta sekans yap


25

Arka fon

Bu zorluk için, bir 'meta-sekans' sadece sayıların kendisinin artmayacağı, aynı zamanda artışın ve artışın artan bir değer, vb. Artacağı bir sayı dizisi olarak tanımlanacaktır.

Örneğin, seviye 3 meta sırası şöyle başlar:

1 2 4 8 15 26 42 64 93 130 176

Çünkü:

    1 2 3  4  5  6  7  8   9       >-|
      ↓+↑ = 7                        | Increases by the amount above each time
  1 2 4 7  11 16 22 29 37  46  >-| <-|
                                 | Increases by the amount above each time
1 2 4 8 15 26 42 64 93 130 176 <-|

Meydan okuma

Olumlu bir tamsayı verildiğinde, o katmanın meta sırasının ilk yirmi maddesini çıkar.

Test durumları

Giriş: 3Çıkış:[ 1, 2, 4, 8, 15, 26, 42, 64, 93, 130, 176, 232, 299, 378, 470, 576, 697, 834, 988, 1160 ]

Giriş: 1Çıkış:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]

Giriş: 5Çıkış:[ 1, 2, 4, 8, 16, 32, 63, 120, 219, 382, 638, 1024, 1586, 2380, 3473, 4944, 6885, 9402, 12616, 16664 ]

Giriş: 13Çıkış:[ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16383, 32752, 65399, 130238, 258096, 507624 ]

Fark gibi, ilk kademe her dizinin öğeleri ilk olarak 2'nin katlarında ...t+1tt+1

kurallar

  • Standart boşluklar uygulanır
  • Bu , bayt cinsinden çok kısa cevap

2
Sanırım 20 terim demek, rakam değil?
Quintec

4
Bu arada, katmanlı üç Meta sıra OEIS olan A000125
Cehalet Düzenleme

6
Çözümlerin girdi 20 veya üstü için çalışması gerekip gerekmediğini netleştirmek isteyebilirsiniz.
FryAmTheEggman

4
0-indexini seçebilir miyiz (giriş için 1. 0seviye, giriş için 2. seviye 1, vb.)?
Lynn,

1
@ MilkyWay90, ne demek istediğinizi açık değil: 219 (5. seviyeden) yalnızca Pascal üçgeninde ve . ( 219)(2191)(219218)
Peter Taylor

Yanıtlar:


8

Jöle , 8 7 bayt

20ḶcþŻS

Çevrimiçi deneyin!

   cþ       Table of binom(x,y) where:
20Ḷ           x = [0..19]
     Ż        y = [0..n]    e.g.  n=3 → [[1, 1, 1, 1, 1, 1,  …]
                                         [0, 1, 2, 3, 4, 5,  …]
                                         [0, 0, 1, 3, 6, 10, …]
                                         [0, 0, 0, 1, 4, 10, …]]

      S     Columnwise sum.           →  [1, 2, 4, 8, 15, 26, …]

Bu, @ alephalpha'nın array

meta-sequencen(i)=k=0n(ik).


Bu vahşice özlü. Sadece müthiş.
don

22

Wolfram Dili (Mathematica) , 34 bayt

0~Range~19~Binomial~i~Sum~{i,0,#}&

Çevrimiçi deneyin!

Aşama n meta sırası, Pascal üçgenin her satırının ilk n+1 elemanlarının toplamıdır .


1
Neredeyse bunun için bir yerleşik var , ancak ne yazık ki daha uzun.
Peter Taylor

1
İçinde yararlı bir şey yapacak kadar WL bilmiyorum, ama bana öyle geliyor ki
T(n,k)={1if k=02T(n,k1)(k1n)aksi takdirde
Peter Taylor

17

Haskell , 34 bayt

(iterate(init.scanl(+)1)[1..20]!!)

0 indeksli girişleri kullanır ( f 4seviye 5 döndürür)

Haskell , 36 bayt

f 1=[1..20]
f n=init$scanl(+)1$f$n-1

Çevrimiçi deneyin! 1 indeksli girişleri kullanır ( f 5seviye 5 döndürür)

açıklama

scanl (+) 1bir listenin kısmi toplamlarını alan ve başlayarak (ve hazırlayan) bir fonksiyondur 1.

Örneğin: scanl (+) 1 [20,300,4000]eşittir [1,21,321,4321].

Kademe n sadece [ 1 , 2 , 3 , ] listesine uygulanan bu fonksiyonun (n1) defa uygulandığı ortaya çıktı .[1,2,3,]

(Veya eşdeğerde: n hepsinin bir listesine)

Biz birini kullanın initveya [1..20-n]daha uzun almak listesi için hesaba 1 her uygulama.


1
[1..20-n] için çalışmayacakn>20
Peter Taylor

take 20.(iterate(scanl(+)1)[1..]!!)düzeltmek için sadece bir bayta mal olur
H.PWiz

1
Kişisel pointfree cevabı diğer cevabı kullanan 34 bayt geri olabilir: (iterate(init.scanl(+)1)[1..20]!!).
xnor

7

Brain-Flak , 84 82 bayt

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

Çevrimiçi deneyin!

Açıklamalı

<>               Switch to the off stack
((()()()()()){}) Push 10
{({}[((()))])}{} Make twice that many 1s
<>               Switch back
{                While ...
({}[(())]<       Subtract one from the input and push 1
<>               Switch
{                For every x on the stack
({}<>({}))<>     Remove x and add it to a copy of the other TOS
}                End loop
<>{}             Remove 1 element to keep it 20
{({}<>)<>}       Copy everything back to the other stack
>)}<>            End scopes and loops

Çevrimiçi deneyin!


3
Bunun ne kadar kısa olduğunu komik buluyorsun
don


5

Python 2 , 69 58 55 bayt

Ovs ve Jo King sayesinde kurtarılan bayt ; Ayrıca, şimdi Python 3'te de çalışır.

m=lambda t:[1+sum(m(t-1)[:n])for n in range(~t and 20)]

Çevrimiçi deneyin!

Matematik

Let a(t,n) olması nth terimi katmanlı sekansın (0 endeksli) t . Küçük bir analiz, aşağıdaki yineleme formülüne götürür:

a(t,n)=1+i=0n1a(t1,i)

Geriye doğru çalışarak, tanımlayan a(0,n)=1 ve a(1,n)=0 , tüm için n . Bu tanımlar temel durumumuzu kolaylaştıracaktır.

Kod

m(t)Dizinin ilk 20 elemanını kademeli olarak döndüren bir işlev tanımlarız t. Eğer tnegatif olmayan olduğu için, tekrarlamalı bir formül üzerinde kullanmak; öyleyse t, -1boş bir liste döndürürüz. Boş liste temel bir durum olarak çalışır, çünkü her özyinelemeli çağrının sonucu dilimlenmiş ( [:n]) ve sonra toplanır. Boş bir listeyi dilimlemek, boş bir liste verir ve boş bir listeyi toplar 0. Tam olarak istediğimiz sonuç budur, çünkü seviye 1 , 0 'ın sabit bir dizisi gibi davranmalıdır .

m=lambda t:                     # Define a function m(t):
 [          ]                   # List comprehension
     for n in range(         )  # for each n from 0 up to but not including...
                    ~n and 20   # 0 if n is -1, else 20:
  1+sum(          )             # a(t,n) = 1 + sum of
              [:n]              # the first n elements of
        m(t-1)                  # the previous tier (calculated recursively)

Özyinelemeli lambda işlevi olarak 61 bayt (önemli derecede daha verimsiz).
ovs

@ovs Teşekkürler! Ben de farklı bir durum kullanarak birkaç tane daha bayt buldum.
DLosc


1
(t>=0)*range(20)büyük olasılıkla henüz daha kısa bir ifade olsa da, bayttan tasarruf sağlar.
xnor

1
if~t@xnor üzerinde iki tane daha tasarruf etti
Jo King,

4

dzaima / APL REPL, 14 bayt

(+\1,19↑)⍣⎕⍳20

Çevrimiçi deneyin!

(+\1,19↑)⍣⎕⍳20
(       )⍣⎕     repeat the function below input times:
 +\               cumulative sum of
   1,             1 prepended to
     19          the first 19 items of the previous iteration
           20  starting with the first 20 integers

-1 bayt dzaima / APL kullanılarak: 1∘,1,
ADAM

@ Adám oh duh .. sağ
dzaima


REPL'i kullanarak 14 bayt ( -sbayrağı ekleyin ).
Outgolfer Erik

Bayrağı kullanırsanız, dil -sbtw olur ( -srepl bayrağı yoksa ?)
ASCII


3

Perl 6 , 34 32 bayt

Jo King sayesinde -2 bayt

{(@,{[\+] 1,|.[^19]}...*)[$_+1]}

Çevrimiçi deneyin!

açıklama

{                              }  # Anonymous block
   ,                ...*  # Construct infinite sequence of sequences
  @  # Start with empty array
    {              }  # Compute next element as
     [\+]     # cumulative sum of
          1,  # one followed by
            |.[^19]  # first 19 elements of previous sequence
 (                      )[$_+1]  # Take (n+1)th element

29 bayt ( $^ayerine $_) gerekli
Jo King

1
@JoKing Nice, ancak bu $_fonksiyon çağrıldığında tanımsız olduğunu varsayar . Global değişkenlerin durumuna bağlı olmayan çözümleri tercih ederim.
nwellnhof

3

Python 3.8 (yayın öncesi) , 62 bayt

f=lambda n:[t:=1]+[t:=t+n for n in(n and f(n-1)[:-1]or[0]*19)]

Çevrimiçi deneyin!


açıklama

f=lambda n:     # funtion takes a single argument
     [t:=1]     # This evaluates to [1] and assigns 1 to t
                # assignment expressions are a new feature of Python 3.8
       +        # concatenated to
     [  ....  ] # list comprehension

# The list comprehesion works together with the
# assignment expression as a scan function:
[t := t+n for n in it]
# This calculates all partial sums of it 
# (plus the initial value of t, which is 1 here)

# The list comprehension iterates
# over the first 19 entries of f(n-1)
# or over a list of zeros for n=0
 for n in (n and f(n-1)[:-1] or [0]*19)

3

R ( 63 47 bayt)

function(n,k=0:19)2^k*pbeta(.5,pmax(k-n,0),n+1)

Çevrimiçi demo . Bu , bir binomun kümülatif dağılım fonksiyonunu veren düzenli tamamlanmamış beta fonksiyonunu kullanır ve bu nedenle, Pascal üçgeninin kısmi toplamlarını vermek için sadece biraz ölçeklendirmeye ihtiyaç duyar.

Oktav ( 66 46 bayt)

@(n,k=0:19)2.^k.*betainc(.5,max(k-n,1E-9),n+1)

Çevrimiçi demo . Aynen aynı, fakat biraz çirkin, çünkü R'lerin betaincaksine pbeta, ikinci ve üçüncü argümanların sıfırdan büyük olmasını gerektiriyor.

Giuseppe , bunları tasarruf etmeme yardımcı olacak çok önemli tasarruf ile teşekkür etti .


2

Ruby, 74 bayt

a=->b{c=[1];d=0;b==1?c=(1..20).to_a: 19.times{c<<c[d]+(a[b-1])[d];d+=1};c}

Ungolfed versiyonu:

def seq num
    ary = [1]
    index = 0
    if num == 1
        ary = (1..20).to_a
    else
        19.times{ary << ary[index]+seq(num-1)[index]; index+=1}
    end
    return ary
end

Oldukça kaynak yoğun - çevrimiçi sürüm, 13. meta sırası hesaplayamıyor.

Çevrimiçi deneyin



2

JavaScript (Node.js) , 58 bayt

t=>Array(20).fill(t).map(g=(t,i)=>i--*t?g(t,i)+g(t-1,i):1)

Çevrimiçi deneyin!

Bu soru, açıklamasına göre özyinelemeli aşağıdaki formül yazmak için önemsiz

g(t,ben)={g(t,ben-1)+g(t-1,ben-1)Eğerbent>01Eğerbent=0
Ve sadece ile 20 elemanlı bir Dizi oluşturmanız gerekir.[g(t,0)...g(t,19)]


2

05AB1E , 11 9 bayt

20LIF.¥>¨

0 endeksli

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

20L        # Create a list in the range [1,20]
   IF      # Loop the input amount of times:
         #  Get the cumulative sum of the current list with 0 prepended automatically
       >   #  Increase each value in this list by 1
        ¨  #  Remove the trailing 21th item from the list
           # (after the loop, output the result-list implicitly)

1
Güzel kullanımı !
Emigna

2

R , 59 49 bayt

f=function(n)`if`(n,Reduce(`+`,f(n-1),1,,T),1:20)

Çevrimiçi deneyin!

Yinelemeli Reduceile +, init=1veaccumulation=TRUE kaçınmak alt kümesine sahip. Özyinelemeli yaklaşımı önerdiği için Criminally Vulgar'a teşekkürler !


tio bu sadece 39 bayttır (binom yaklaşımını kullanarak)
Nick Kennedy

Ben kendiniz gönderme öneriyoruz böylece, ayrı bir yaklaşım @NickKennedy ve 's golfier kullanmak outerdaha sapplyiçin 36 byte
Giuseppe

1
Bu yaklaşımı özyinelemeli bir işleve dönüştürmek 53 bayt verir (özyinelemelerde atamayı dahil etmemiz gerekir mi? 51 değilse) TIO
CriminallyVulgar

1
@CriminallyVulgar 49 byte :-) alabiliyoruz :-)
Giuseppe

@Giuseppe Haha Bunun golf oynamak olduğunu biliyordum, göremedim! cumsumDenemek ve çalışmasını sağlamak için bir süre uğraştım , ama bu Reduceçok kaygan. Dizini de 1'e düşürebilmek güzel, yorumlarda bunu görmedi.
CriminallyVulgar

1

JavaScript (ES6),  68  67 bayt

f=(n,a=[...f+f])=>n--?f(n,[s=1,...a.map(x=>s-=~--x)]):a.slice(0,20)

Çevrimiçi deneyin!


JavaScript (ES6), 63 bayt

n20

f=(n,a=[...Array(20-n)])=>n--?f(n,[s=1,...a.map(x=>s+=x||1)]):a

Çevrimiçi deneyin!


1

J , 24 bayt

<:(1+/\@,])^:[(1+i.20)"_

Çevrimiçi deneyin!

NOT: Dzaima’nın APL cevabının çevirisidir, ancak bunu yazmadan önce fark etmedim.

açıklama

<: (1 +/\@, ])^:[ (1+i.20)"_
<:                           NB. input minus 1 (left input)
                  (1+i.20)"_ NB. 1..20 (right input)
   (         )^:[            NB. apply verb in parens 
                             NB. "left input" times
   (1     , ])               NB. prepend 1 to right input
   (  +/\@   )               NB. and take scan sum

1

Ruby, 49 bayt

f=->n{n<1?[1]*20:[o=1]+f[n-1][0,19].map{|x|o+=x}}

Özyinelemeli tanım: Kademe 0 1,1,1,1...ve sonraki her kademe 1, ardından ilk farkları önceki kademe olan bir sıra izlenir. Can sıkıcı bir şekilde, ilk 20'yi açıkça dilimlemezsem bu bana 21 değer verecek; Bundan kaçınarak bunu kısaltmanın bir yolu olmalı gibi görünüyor.





1

Retina , 59 bayt

.+
19*$(_,

Girişi 19 1s ile değiştirin (unary). (20th değeri 0'dır, çünkü her zaman döngüden geçen ilk geçişte silinir.)

"$+"{`
)`

Döngü orijinal giriş sayısını kaç kez tekrarlayın.

(.+),_*
_,$1

Son öğeyi kaldırın ve a öneki 1.

_+(?<=((_)|,)+)
$#2*

Birikmeli toplamı hesaplayın.

_+
$.&

Ondalık dönüştür.

Çevrimiçi deneyin!



1

Pas , 135 bayt

fn t(m:u64)->Vec<u64>{let f=|y|(1..=y).fold(1,|a,n|a*n);(0..20).map(|i| (0..=u64::min(i,m)).fold(0,|a,x|a+f(i)/f(x)/f(i-x))).collect()}

@alephalpha fikrini kullandı, diğerleri gibi. yerleşik faktoring yoktur, böylece en az 36 bayt alır (artı negatiflerle başa çıkmak). yerleşik seçim yok, başka bir 16 bayt. yineleyici-> bildirilen vektör tipi, 20 bayt .. vb.

Play.rust-lang.org de Ungolfed


1
Binom katsayılarını aynı maliyetle hesaplamak için daha iyi bir yol var, ancak bunlar şu şekilde kaldırılıyor min: fn t(m:i64)->Vec<i64>{let b=|n,k|(1..=k).fold(1,|a,j|a*(n-j+1)/j);(0..20).map(|i|(0..=m).fold(0,|a,x|a+b(i,x))).collect()}(122 bayt)
Peter Taylor,

1
Aslında, binom inline edilebilir: fn t(m:i64)->Vec<i64>{(0..20).map(|i|(0..=m).fold(0,|a,x|a+(1..=x).fold(1,|a,j|a*(i-j+1)/j))).collect()}(104 bayt). Ne güzel olurdu, iki kıvrımı birleştirmek, ama ne kadar da özlü tuples olduğundan emin değilim.
Peter Taylor

1
Yeterince özlü: fn t(m:i64)->Vec<i64>{(0..20).map(|i|(0..=m).fold((0,1),|a,b|(a.0+a.1,a.1*(b-i)/!b)).0).collect()}(98 bytes)
Peter Taylor,

Bu şaşırtıcı ... nasıl çalıştığını anlamak için bile mücadele ediyorum, ama şaşırtıcı.
don

n!k!(n-k)!=n!(k-1)!(n-(k-1))!xn-k+1k

1

R ( 60 59 bayt)

function(n)Reduce(function(p,q)2*p-choose(q-1,n),1:19,1,,1)

Çevrimiçi demo

Gözlemin basit uygulaması

T (n, k) = 2 T (n-1, k) - binom (n-1, k). - MF Hasler, 30 Mayıs 2010

OEIS dan A008949 . Reduceİşlev argümanları (açıkçası), üzerinde haritalanacak dizi, başlangıç ​​değeri, sahte bir değer (sağdan ziyade soldan katlamak için) ve ara sonucu biriktirmek için bir truthy değeridir.






0

CJam (20 bayt)

1aK*{1\{1$+}/;]}q~*p

Çevrimiçi demo . Bu, stdin'den girdi alan ve stdout'a baskı yapan bir programdır; aynı puan için anonim bir blok (fonksiyon)

{1aK*{1\{1$+}/;]}@*}

teşrih

Bu, tanımı tam anlamıyla uygular:

1aK*      e# Start with an array of 20 1s
{         e# Loop:
  1\      e#   Push a 1 before the current list
  {1$+}/  e#   Form partial sums (including that bonus 1)
  ;]      e#   Ditch the last and gather in an array (of length 20)
}
q~*       e# Take input and repeat the loop that many times
p         e# Pretty print
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.