Faça de mim uma metaseqüência


25

fundo

Para esse desafio, uma 'metaseqüência' será definida como uma sequência de números em que não apenas os próprios números aumentarão, mas também o incremento, e o incremento aumentará por um valor crescente, etc.

Por exemplo, a metaseqüência de camada 3 começaria como:

1 2 4 8 15 26 42 64 93 130 176

Porque:

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

Desafio

Dado um número inteiro positivo, produza os primeiros vinte itens da metaseqüência dessa camada.

Casos de teste

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

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

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

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

Como você pode perceber, os primeiros itens de cada sequência da camada são os primeiros potências de 2 ...t+1tt+1

Regras

  • Aplicam-se brechas padrão
  • Isso é , então a resposta mais curta em bytes ganha

2
Eu suponho que você quer dizer 20 termos, não dígitos?
Quintec 04/03

4
A propósito, a metaseqüência de nível três é OEIS A000125
Modalidade de ignorância

6
Você pode esclarecer se as soluções precisam funcionar para a entrada 20 ou superior.
FryAmTheEggman 4/03

4
Podemos escolher o índice 0 (assim, a camada 1 de saída para entrada 0, a camada 2 para entrada 1etc.)?
Lynn

1
@ MilkyWay90, não está muito claro o que você quer dizer: 219 (do nível 5) ocorre apenas no triângulo de Pascal como e . (2191)(219218)
Peter Taylor

Respostas:


8

Geléia , 8 7 bytes

20ḶcþŻS

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

Isso usa o insight de @ alephalpha de que

meta-sequêncian(Eu)=k=0 0n(Euk).


Isso é brutalmente sucinto. Simplesmente fantástico.
don bright

22

Wolfram Language (Mathematica) , 34 bytes

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

Experimente online!

A metaseqüência de nível n é a soma dos primeiros n+1 elementos de cada linha do triângulo Pascal.


1
Há quase um built-in para isso , mas infelizmente é mais longo.
Peter Taylor

1
Eu não conheço WL suficiente para fazer algo útil nele, mas parece-me que ele pode se beneficiar da identidade
T(n,k)={1if k=02T(n,k1)(k1n)otherwise
Peter Taylor

17

Haskell , 34 bytes

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

Usa entradas indexadas em 0 ( f 4retorna a camada 5.)

Haskell , 36 bytes

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

Experimente online! Usa entradas indexadas em 1 ( f 5retorna a camada 5.)

Explicação

scanl (+) 1é uma função que recebe somas parciais de uma lista, iniciando em (e acrescentando) 1.

Por exemplo: scanl (+) 1 [20,300,4000]igual a [1,21,321,4321].

Acontece que o nível n é apenas essa função aplicada (n1) vezes à lista [1,2,3,] .

(Ou equivalente: n vezes a uma lista de todos.)

Usamos um initou [1..20-n]para contabilizar o aumento da lista em 1 cada aplicativo.


1
[1..20-n]não vai funcionar para n>20
Peter Taylor

take 20.(iterate(scanl(+)1)[1..]!!)custaria apenas um byte a mais para corrigir isso
H.PWiz

1
Sua resposta pointfree pode estar de volta a 34 bytes usando sua outra resposta: (iterate(init.scanl(+)1)[1..20]!!).
xnor 6/03

7

Brain-Flak , 84 82 bytes

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

Experimente online!

Anotado

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

Experimente online!


3
você sabe que é engraçado como isso é mais curto que Rust
don bright


5

Python 2 , 69 58 55 bytes

Bytes salvos graças a ovs e Jo King ; também funciona agora em Python 3.

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

Experimente online!

A matemática

Seja a(t,n) o termo nth (indexado 0) da sequência na camada t . Uma pequena análise leva à seguinte fórmula de recorrência:

a(t,n)=1+Eu=0 0n-1uma(t-1,Eu)

Trabalhando para trás, definimos uma(0 0,n)=1 e uma(-1,n)=0 0 para todos os n . Essas definições simplificarão nosso caso base.

O código

Definimos uma função m(t)que retorna os 20 primeiros elementos da sequência na camada t. Se tnão for negativo, usamos a fórmula recursiva acima; se tfor -1, retornamos uma lista vazia. A lista vazia funciona como um caso base, porque o resultado de cada chamada recursiva é fatiado ( [:n]) e depois somado. Fatiar uma lista vazia fornece uma lista vazia e somar uma lista vazia fornece 0. Isso é exatamente o resultado que queremos, desde níveis -1 deve se comportar como uma sequência constante de todos os 0 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 bytes como uma função lambda recursiva (significativamente mais ineficiente).
ovs 4/03

@ovs Obrigado! Encontrei mais alguns bytes usando um caso base diferente também.
DLosc 4/03


1
(t>=0)*range(20)salva um byte, embora provavelmente haja uma expressão ainda mais curta.
xnor 6/03

1
if~teconomiza mais dois @xnor
Jo King

4

dzaima / APL REPL, 14 bytes

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

Experimente 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 .. certo
dzaima 04/03

Programa completo às 17:(≢↑(+\1∘,)⍣⎕)20⍴1
Adám 04/03

14 bytes usando o REPL (adicione o -ssinalizador).
Erik the Outgolfer

Se você usar o sinalizador, o idioma se tornará -sbtw (a menos que -sseja sinalizador de repl?)
somente ASCII


3

Perl 6, 34 32 bytes

-2 bytes thanks to Jo King

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

Try it online!

Explanation

{                              }  # 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 bytes (o em $^avez de $_é necessário)
Jo King

1
@JoKing Nice, but this assumes that $_ is undefined when calling the function. I prefer solutions that don't depend on the state of global variables.
nwellnhof

3

Python 3.8 (pre-release), 62 bytes

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

Try it online!


Explanation

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

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

Demonstração online . Isso usa a função beta incompleta regularizada, which gives the cumulative distribution function of a binomial, and hence just needs a bit of scaling to give partial sums of rows of Pascal's triangle.

Oitava ( 66 46 bytes)

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

Demonstração online . Exatamente o mesmo conceito, mas um pouco mais feio porque betainc, ao contrário dos R'spbeta , exige que o segundo e o terceiro argumentos sejam maiores que zero.

Muito obrigado a Giuseppe por me ajudar a vetorizá-los, com economias significativas.


2

Ruby, 74 bytes

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}

Versão não destruída:

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

Bastante uso de recursos - a versão online não pode calcular a 13ª metaseqüência.

Experimente online



2

JavaScript (Node.js) , 58 bytes

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

Experimente online!

É trivial escrever seguindo a fórmula recursiva com base na descrição em questão

g(t,Eu)={g(t,Eu-1)+g(t-1,Eu-1)E seEut>0 01E seEut=0 0
E você só precisa gerar uma matriz de 20 elementos com [g(t,0 0)...g(t,19)]



2

R , 59 49 bytes

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

Experimente online!

Recursivamente Reducecom +, init=1e accumulation=TRUEpara evitar ter que subconjunto. Agradecemos a Criminally Vulgar por sugerir a abordagem recursiva!


tio this is only 39 bytes (using binomial approach)
Nick Kennedy

@NickKennedy, que é uma abordagem separada, então eu recomendo postá-la você mesmo, e é mais golfe usar do outerque sapplypara 36 bytes
Giuseppe

1
Converter esta abordagem em uma função recursiva fornece 53 bytes (acho que nas recursivas precisamos incluir a atribuição? Se não, 51) TIO
CriminallyVulgar

1
@CriminallyVulgar podemos chegar a 49 bytes :-)
Giuseppe

@ Giuseppe Haha Eu sabia que era jogável, simplesmente não conseguia vê-lo! Eu errei cumsumpor um tempo para tentar fazê-lo funcionar, mas isso Reduceé tão liso. É bom poder diminuir o índice por 1 também, não vi isso nos comentários.
CriminallyVulgar

1

JavaScript (ES6),  68  67 bytes

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

Experimente online!


JavaScript (ES6), 63 bytes

NB: esta versão funciona para n20.

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

Experimente online!


1

J , 24 bytes

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

Experimente online!

NOTA: Acontece que esta é uma tradução da resposta da APL do dzaima, embora eu não tenha percebido isso antes de escrever isso.

explicação

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

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

Definição recursiva: a camada 0 é 1,1,1,1...e cada camada subseqüente é 1, seguida por uma sequência cujas primeiras diferenças são a camada anterior. Irritantemente, isso me daria 21 valores se eu não explicitamente separar os 20 primeiros; Parece que deveria haver uma maneira de reduzir isso, evitando isso.





1

Retina , 59 bytes

.+
19*$(_,

Substitua a entrada por 19 1s (em unário). (O vigésimo valor é 0, porque ele sempre é excluído pela primeira passagem pelo loop.)

"$+"{`
)`

Repita o loop o número de entrada original várias vezes.

(.+),_*
_,$1

Remova o último elemento e prefixe a 1.

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

Calcular a soma acumulada.

_+
$.&

Converta para decimal.

Experimente online!



1

Ferrugem , 135 bytes

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

usou a idéia de @alephalpha, como várias outras. não há fatorial embutido, de modo que consuma pelo menos 36 bytes (além de lidar com negativos). nenhuma escolha interna, outros 16 bytes. iterador-> tipo de vetor declarado, 20 bytes .. etc etc.

Ungolfed em play.rust-lang.org


1
Existe uma maneira melhor de calcular coeficientes binomiais pelo mesmo custo, mas que permite remover 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 bytes)
Peter Taylor

1
De fato, o binomial pode ser incorporado: 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 bytes). O que seria bom é combinar as duas dobras, mas não tenho certeza de como as tuplas são sucintas.
Peter Taylor

1
Sucinta o suficiente: 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

isso é incrível ... eu luto para entender como funciona, mas é incrível.
don bright

Ele apenas usa um truque algébrico:
n!k!(n-k)!=n!(k-1)!(n-(k-1))!×n-k+1k
Peter Taylor

1

R ( 60 59 bytes)

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

Demonstração online

Implementação direta da observação

T (n, k) = 2 T (n-1, k) - binomial (n-1, k). - MF Hasler, 30 de maio de 2010

do OEIS A008949 . Os argumentos para Reducesão a função (obviamente), a matriz sobre a qual mapear, o valor inicial, um valor falso (dobrar da esquerda em vez da direita) e um valor verdadeiro para acumular os resultados intermediários em uma matriz.






0

CJam (20 bytes)

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

Demonstração online . Este é um programa que recebe a entrada do stdin e imprime no stdout; para a mesma pontuação, um bloco anônimo (função) pode ser obtido como

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

Dissecação

Isso aplica a definição literalmente:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.