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
Geza Kerecsenyi
fonte
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).

Lynn
fonte
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.

alefalpha
fonte
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.

Lynn
fonte
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!

Assistente de Trigo
fonte
3
você sabe que é engraçado como isso é mais curto que Rust
don bright
7

R , 36 bytes

rowSums(outer(0:19,0:scan(),choose))

Experimente online!

Obrigado a @ Giuseppe por sugerir outer.

Isso se baseia na abordagem descrita por @falphalpha

Nick Kennedy
fonte
você pode usar em Mapvez de externo?
JDL 7/03
@JDL Não vejo como isso funcionaria. Eu preciso de todas as combinações possíveis, não apenas de pares de combinações.
Nick Kennedy
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)
DLosc
fonte
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
dzaima
fonte
-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

Pari / GP , 39 bytes

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

Experimente online!


Pari / GP , 40 bytes

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

Experimente online!


n

i=0nxi(1x)i+1=1(x1x)1+n12x

alephalpha
fonte
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
nwellnhof
fonte
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)
ovs
fonte
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.

Peter Taylor
fonte
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

CG One Handed
fonte
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)]

tsh
fonte
2

05AB1E , 11 9 bytes

20LIF.¥>¨

Indexado a 0

Experimente online ou verifique todos os casos de teste .

Explicação:

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)
Kevin Cruijssen
fonte
1
Bom uso de !
Emigna 5/03
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!

Giuseppe
fonte
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!

Arnauld
fonte
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
Jonah
fonte
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.

histocrata
fonte
tio.run/#ruby pls
somente ASCII
também 49
somente ASCII
46
somente ASCII
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!

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

não brilhante
fonte
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.

Peter Taylor
fonte
1

K (oK) , 17 bytes

-1 byte graças ao ngn (alternando de indexado 0 para indexado 1)

{x(+\1,19#)/20#1}

Experimente online!

Indexado 1

K (oK) , 18 bytes

{x(+\1,19#)/1+!20}

Experimente online!

Indexado a 0

Galen Ivanov
fonte
1
torne-o indexado em 1 e salve um byte: 1+!20->20#1
ngn 06/03
@ngn Obrigado, como sempre, há algo que eu perdi :)
Galen Ivanov
0

Perl 5, 48 bytes

$x=1,@A=(1,map$x+=$_,@A[0..18])for 0..$_;$_="@A"

TIO

Nahuel Fouilleul
fonte
0

Japonês , 15 bytes

Indexado a 0; substituir hcom po 1-indexado.

ÈîXi1 å+}gNh20õ

Tente

Shaggy
fonte
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
Peter Taylor
fonte