Fammi una metasequenza


25

sfondo

Per questa sfida, una "metasequenza" sarà definita come una sequenza di numeri in cui non solo i numeri aumenteranno, ma anche l'incremento e l'incremento aumenterà di un valore crescente, ecc.

Ad esempio, la metasequenza di livello 3 inizierebbe come:

1 2 4 8 15 26 42 64 93 130 176

perché:

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

Sfida

Dato un numero intero positivo, genera i primi venti elementi della metasequenza di quel livello.

Casi test

Ingresso: 3Uscita:[ 1, 2, 4, 8, 15, 26, 42, 64, 93, 130, 176, 232, 299, 378, 470, 576, 697, 834, 988, 1160 ]

Ingresso: 1Uscita:[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]

Ingresso: 5Uscita:[ 1, 2, 4, 8, 16, 32, 63, 120, 219, 382, 638, 1024, 1586, 2380, 3473, 4944, 6885, 9402, 12616, 16664 ]

Ingresso: 13Uscita:[ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16383, 32752, 65399, 130238, 258096, 507624 ]

Come puoi immaginare, i primi elementi di ciascuna sequenza di livello sono i primi poteri di 2 ...t+1tt+1

Regole

  • Si applicano scappatoie standard
  • Questo è , quindi vince la risposta più breve in byte

2
Suppongo che intendi 20 termini, non cifre?
Quintec,

4
A proposito, la metasequenza di terzo livello è OEIS A000125
Incarnazione dell'ignoranza

6
Potresti voler chiarire se le soluzioni devono funzionare per input 20 o superiore.
FryAmTheEggman

4
Possiamo scegliere di 0-index (quindi, output livello 1 per input 0, livello 2 per input 1, ecc.)?
Lynn

1
@ MilkyWay90, non è molto chiaro cosa intendi: 219 (dal livello 5) si verifica solo nel triangolo di Pascal come e . ( 219(2191)(219218)
Peter Taylor,

Risposte:


8

Gelatina , 8 7 byte

20ḶcþŻS

Provalo online!

   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, …]

Questo utilizza l'intuizione di @ alephalpha che

meta-sequenzan(io)=ΣK=0n(ioK).


Questo è brutalmente succint. Semplicemente fantastico.
indossa il

22

Wolfram Language (Mathematica) , 34 byte

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

Provalo online!

La metasequenza di livello è la somma dei primi elementi di ciascuna riga del triangolo pasquale.nn+1


1
C'è quasi un built-in per questo , ma purtroppo è più lungo.
Peter Taylor,

1
Non conosco abbastanza WL per fare qualcosa di utile in esso, ma mi sembra che potrebbe trarre vantaggio dall'identità
T(n,K)={1Se K=02T(n,K-1)-(K-1n)altrimenti
Peter Taylor,

17

Haskell , 34 byte

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

Utilizza input indicizzati 0 ( f 4restituisce il livello 5.)

Haskell , 36 byte

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

Provalo online! Utilizza input 1 indicizzati ( f 5restituisce il livello 5.)

Spiegazione

scanl (+) 1è una funzione che accetta somme parziali di un elenco, a partire da (e anteposto) 1.

Ad esempio: scanl (+) 1 [20,300,4000]uguale a [1,21,321,4321].

Si scopre che il livello è proprio questa funzione applicata volte all'elenco .n(n-1)[1,2,3,...]

(O equivalentemente: volte a un elenco di tutti.)n

Usiamo uno inito [1..20-n]per tenere conto dell'elenco che si allunga di ogni applicazione.1


1
[1..20-n]non funzionerà pern>20
Peter Taylor,

take 20.(iterate(scanl(+)1)[1..]!!)costerebbe solo un byte in più per risolverlo
H.Pwiz

1
La tua risposta pointfree può essere di nuovo a 34 byte utilizzando l'altra risposta: (iterate(init.scanl(+)1)[1..20]!!).
xnor

7

Brain-Flak , 84 82 byte

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

Provalo online!

commentata

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

Provalo online!


3
sai che è divertente come questo sia più corto di Rust
don


5

Python 2 , 69 58 55 byte

Byte salvati grazie a ovs e Jo King ; inoltre, funziona anche in Python 3.

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

Provalo online!

La matematica

Sia un'(t,n) il termine nth (indicizzato 0) della sequenza al livello t . Una piccola analisi porta alla seguente formula di ricorrenza:

un'(t,n)=1+Σio=0n-1un'(t-1,io)

Lavorando all'indietro, definiamo un'(0,n)=1 e un'(-1,n)=0 per tutto n . Queste definizioni semplificheranno il nostro caso di base.

Il codice

Definiamo una funzione m(t)che restituisce i primi 20 elementi della sequenza a livello t. Se tnon negativo, utilizziamo la formula ricorsiva sopra; in caso taffermativo -1, restituiamo un elenco vuoto. L'elenco vuoto funziona come caso base perché il risultato di ogni chiamata ricorsiva viene suddiviso ( [:n]) e quindi sommato. Affettare un elenco vuoto dà un elenco vuoto e sommare un elenco vuoto 0. Questo è esattamente il risultato che vogliamo, dal tier -1 dovrebbe comportarsi come una sequenza costante di tutti 0 s.

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)

61 byte come funzione lambda ricorsiva (significativamente più inefficiente).
lunedì

@ovs Grazie! Ho trovato un paio di byte in più usando anche un caso base diverso.
DLosc


1
(t>=0)*range(20)salva un byte, anche se probabilmente esiste un'espressione ancora più breve.
xnor

1
if~tne salva altri due su @xnor
Jo King

4

dzaima / APL REPL, 14 byte

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

Provalo online!

(+\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 byte usando dzaima / APL: 1∘,1,
Adám

@ Adám oh duh .. giusto
dzaima il

Programma completo alle 17:(≢↑(+\1∘,)⍣⎕)20⍴1
Adám

14 byte usando REPL (aggiungi il -sflag).
Erik the Outgolfer

Se usi la bandiera, la lingua diventa -sbtw (a meno che non -ssia sostituita la bandiera?)
ASCII il

3

Pari / GP , 39 byte

n->Vec(sum(i=1,n+1,(1/x-1)^-i)+O(x^21))

Provalo online!


Pari / GP , 40 byte

n->Vec((1-(1/x-1)^-n++)/(1-2*x)+O(x^20))

Provalo online!


n

Σio=0nXio(1-X)io+1=1-(X1-X)1+n1-2X


3

Perl 6 , 34 32 byte

-2 byte grazie a Jo King

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

Provalo online!

Spiegazione

{                              }  # 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 byte ( $^ainvece di $_è necessario)
Jo King

1
@JoKing Nice, ma ciò presuppone che $_non sia definito quando si chiama la funzione. Preferisco soluzioni che non dipendono dallo stato delle variabili globali.
nwellnhof

3

Python 3.8 (pre-release) , 62 byte

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

Provalo online!


Spiegazione

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 byte)

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

Demo online . Questo utilizza la funzione beta incompleta regolarizzata , che fornisce la funzione di distribuzione cumulativa di un binomio, e quindi ha solo bisogno di un po 'di ridimensionamento per dare somme parziali di righe del triangolo di Pascal.

Ottava ( 66 46 byte)

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

Demo online . Esattamente lo stesso concetto, ma leggermente più brutto perché betainc, a differenza di quelli di R pbeta, richiede che il secondo e il terzo argomento siano maggiori di zero.

Mille grazie a Giuseppe per avermi aiutato a vettorializzarli, con risparmi significativi.


2

Rubino, 74 byte

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}

Versione non golfata:

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

Abbastanza dispendioso in termini di risorse: la versione online non è in grado di calcolare la 13a metasequenza.

Provalo online



2

JavaScript (Node.js) , 58 byte

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

Provalo online!

g(t,io)={g(t,io-1)+g(t-1,io-1)Seiot>01Seiot=0
[g(t,0)...g(t,19)]


2

05AB1E , 11 9 byte

20LIF.¥>¨

0-indicizzato

Provalo online o verifica tutti i casi di test .

Spiegazione:

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
Bel uso di !
Emigna il

2

R , 59 49 byte

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

Provalo online!

Ricorsivamente Reducecon +, init=1e accumulation=TRUEper evitare di dover sottoinsieme. Grazie a Criminally Vulgar per aver suggerito l'approccio ricorsivo!


Tio questo è solo 39 byte (utilizzando l'approccio binomiale)
Nick Kennedy

@NickKennedy è un approccio separato, quindi ti consiglio di pubblicarlo da solo, ed è più golfoso da usare outerrispetto sapplya 36 byte
Giuseppe

1
La conversione di questo approccio in una funzione ricorsiva dà 53 byte (penso che nei ricorsivi dobbiamo includere il compito? In caso contrario, 51) TIO
CriminallyVulgar

1
@CriminallyVulgar possiamo arrivare a 49 byte :-)
Giuseppe

@Giuseppe Haha sapevo che era giocabile a golf, non riuscivo a vederlo! Ho sbagliato cumsumper un po 'a cercare di farlo funzionare, ma Reduceè così fluido. Bello essere in grado di rilasciare anche l'indice di 1, non l'ho visto nei commenti.
CriminalmenteVulgar

1

JavaScript (ES6),  68  67 byte

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

Provalo online!


JavaScript (ES6), 63 byte

n20

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

Provalo online!


1

J , 24 byte

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

Provalo online!

NOTA: Si scopre che questa è una traduzione della risposta APL di dzaima, anche se in realtà non me ne sono accorto prima di scrivere questo.

spiegazione

<: (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

Rubino, 49 byte

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

Definizione ricorsiva: il livello 0 è 1,1,1,1...e ogni livello successivo è 1 seguito da una sequenza le cui prime differenze sono il livello precedente. Questo mi darebbe fastidiosamente 21 valori se non tagliassi esplicitamente i primi 20; sembra che ci dovrebbe essere un modo per accorciarlo evitando quello.





1

Retina , 59 byte

.+
19*$(_,

Sostituire l'ingresso con 19 1s (in unario). (Il valore 20 è 0 perché viene sempre eliminato dal primo passaggio attraverso il ciclo.)

"$+"{`
)`

Ripeti il ​​ciclo il numero di input originale di volte.

(.+),_*
_,$1

Rimuovere l'ultimo elemento e il prefisso a 1.

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

Calcola la somma cumulativa.

_+
$.&

Converti in decimale.

Provalo online!



1

Ruggine , 135 byte

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()}

usato l'idea di @alephalpha, come molti altri. non esiste alcun fattoriale incorporato in modo che occupi almeno 36 byte (oltre a gestire i negativi). nessun builtin scegliere, altri 16 byte. iteratore-> tipo di vettore dichiarato, 20 byte, ecc. ecc.

Ungolfed su play.rust-lang.org


1
C'è un modo migliore per calcolare i coefficienti binomiali allo stesso costo, ma che consente di rimuovere 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 byte)
Peter Taylor,

1
In effetti, il binomio può essere integrato: 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 byte). Sarebbe bello combinare le due pieghe, ma non sono sicuro di quanto siano succinte le tuple.
Peter Taylor,

1
Abbastanza sintetico: 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 byte)
Peter Taylor,

è incredibile ... faccio fatica anche a capire come funziona ma è incredibile.
don luminoso

n!K!(n-K)!=n!(K-1)!(n-(K-1))!×n-K+1K

1

R ( 60 59 byte)

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

Demo online

Implementazione diretta dell'osservazione

T (n, k) = 2 T (n-1, k) - binomiale (n-1, k). - MF Hasler, 30 maggio 2010

da OEIS A008949 . Gli argomenti Reducesono la funzione (ovviamente), l'array su cui mappare, il valore iniziale, un valore falso (da piegare da sinistra anziché da destra) e un valore veritiero per accumulare i risultati intermedi in un array.






0

CJam (20 byte)

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

Demo online . Questo è un programma che prende input da stdin e stampa su stdout; per lo stesso punteggio è possibile ottenere un blocco (funzione) anonimo come

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

Dissezione

Questo applica letteralmente la definizione:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.