Sequência de Sylvester


32

A sequência de Sylvester, OEIS A000058 , é uma sequência inteira definida da seguinte maneira:

Cada membro é o produto de todos os membros anteriores mais um. O primeiro membro da sequência é 2.

Tarefa

Crie o menor programa possível que tome n e calcule o enésimo termo da Sequência de Sylvester. Entrada, saída e brechas padrão se aplicam. Como o resultado cresce muito rapidamente, não é esperado que você tome nenhum termo cujo resultado possa causar um estouro no idioma escolhido.

Casos de teste

Você pode usar zero ou uma indexação. (Aqui eu uso zero indexação)

>>0
2
>>1
3
>>2
7
>>3
43
>>4
1807

Quais insumos devem ser manipulados? A saída cresce muito rapidamente.
Geobits

11
@Geobits você é esperado para lidar com tanto quanto seu idioma pode
Assistente de trigo

É um array que, quando indexado, nretorna o nthnúmero da sequência aceito?
user6245072

@ user6245072 Não, você deve indexar suas próprias matrizes #
Wheat Wizard

Respostas:


26

Brain-Flak , 76 68 58 52 46 bytes

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

Experimente online!

Usa esse relacionamento:

Fórmula

que é derivado desse relacionamento modificado daquele fornecido na sequência:

a(n+1) = a(n) * (a(n) - 1) + 1.

Explicação

Para uma documentação do que cada comando faz, visite a página do GitHub .

Existem duas pilhas no Brain-Flak, que vou chamar de pilha 1 e pilha 2, respectivamente.

A entrada é armazenada na Pilha 1.

<>(()())<>             Store 2 in Stack 2.

{                      while(Stack_1 != 0){
  ({}[()])                 Stack_1 <- Stack_1 - 1;
  <>                       Switch stack.
  ({({}[()])({})}{}())     Generate the next number in Stack 2.
  <>                       Switch back to Stack 1.
}

<>                     Switch to Stack 2, implicitly print.

Para o algoritmo de geração:

({({}[()])({})}{}())      Top <- (Top + Top + (Top-1) + (Top-1) + ... + 0) + 1

(                  )      Push the sum of the numbers evaluated in the process:

 {            }               while(Top != 0){
  ({}[()])                        Pop Top, push Top-1    (added to sum)
          ({})                    Pop again, push again  (added to sum)
                              }

               {}             Top of stack is now zero, pop it.
                 ()           Evaluates to 1 (added to sum).

Versão alternativa de 46 bytes

Isso usa apenas uma pilha.

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

Experimente online!


11
Apenas 10 mais bytes para mostrar que develepors java deve ir para Flack cérebro
Rohan Jhunjhunwala

11
@RohanJhunjhunwala Temo que isso é impossível ...
Leaky Nun

@LeakyNun ainda é interessante pensar. Cérebro Flak tem algum poder, e é surpreendentemente concisa
Rohan Jhunjhunwala

5
A versão de uma pilha também é limpa de pilha. O que tende a ser um ponto importante para a modularidade do código no cérebro.
Assistente de trigo

Uau. Esta é uma resposta extremamente impressionante.
DJMcMayhem

12

Gelatina , 5 bytes

Ḷ߀P‘

Isso usa indexação baseada em 0 e a definição da especificação de desafio.

Experimente online! ou verifique todos os casos de teste .

Como funciona

Ḷ߀P‘  Main link. Argument: n

Ḷ      Unlength; yield [0, ..., n - 1].
 ߀    Recursively apply the main link to each integer in that range.
   P   Take the product. This yields 1 for an empty range.
    ‘  Increment.

Ah, eu esqueci que o produto vazio é 1. #
Leaky Nun

12

Hexagonia , 27 bytes

1{?)=}&~".>")!@(</=+={"/>}*

Desdobrado:

    1 { ? )
   = } & ~ "
  . > " ) ! @
 ( < / = + = {
  " / > } * .
   . . . . .
    . . . .

Experimente online!

Explicação

Vamos considerar a sequência b(a) = a(n) - 1e reorganizar um pouco:

b(a) = a(n) - 1
     = a(n-1)*(a(n-1)-1) + 1 - 1
     = (b(n-1) + 1)*(b(n-1) + 1 - 1)
     = (b(n-1) + 1)*b(n-1)
     = b(n-1)^2 + b(n-1)

Essa sequência é muito semelhante, mas podemos adiar o incremento até o fim, o que acontece para salvar um byte neste programa.

Então, aqui está o código fonte anotado:

insira a descrição da imagem aqui
Criado com o HexagonyColorer de Timwi .

E aqui está um diagrama de memória (o triângulo vermelho mostra a posição e orientação inicial do ponteiro de memória):

insira a descrição da imagem aqui
Criado com o EsotericIDE de Timwi .

O código começa no caminho cinza que envolve o canto esquerdo; portanto, o bit linear inicial é o seguinte:

1{?)(
1      Set edge b(1) to 1.
 {     Move MP to edge N.
  ?    Read input into edge N.
   )(  Increment, decrement (no-op).

Em seguida, o código atinge o <que é uma ramificação e indica o início (e o fim) do loop principal. Enquanto a borda N tiver um valor positivo, o caminho verde será executado. Esse caminho envolve a grade algumas vezes, mas na verdade é inteiramente linear:

""~&}=.*}=+={....(

O .são no-ops, então o código real é:

""~&}=*}=+={(
""             Move the MP to edge "copy".
  ~            Negate. This is to ensure that the value is negative so that &...
   &           ...copies the left-hand neighbour, i.e. b(i).
    }=         Move the MP to edge b(i)^2 and turn it around.
      *        Multiply the two copies of b(i) to compute b(i)^2.
       }=      Move the MP back to edge b(i) and turn it around.
         +     Add the values in edges "copy" and b(i)^2 to compute
               b(i) + b(i)^2 = b(i+1).
          ={   Turn the memory pointer around and move to edge N.
            (  Decrement.

Depois que esse decrementar se reduz Na 0, o caminho vermelho é executado:

")!@
"     Move MP back to edge b(i) (which now holds b(N)).
 )    Increment to get a(N).
  !   Print as integer.
   @  Terminate the program.

Você pode executar o seu bruteforcer sobre isso?
CalculatorFeline

@CalculatorFeline O Brute Forcer pode executar no máximo programas de 7 bytes (e mesmo isso apenas com várias suposições) em um período de tempo razoável. Não vejo isso remotamente possível em 7 bytes.
Martin Ender

Tão? O que há de errado em tentar?
CalculatorFeline

@CalculatorFeline Preguiça. O fortress bruto sempre exige um pouco de ajustes manuais que eu não posso me incomodar em fazer com praticamente 0 chance de encontrar algo. Algumas versões do script estão no GitHub, portanto, qualquer pessoa é livre para tentar.
Martin Ender

E como eu faço isso?
CalculatorFeline

9

J, 18 14 12 bytes

Esta versão graças ao randomra. Vou tentar escrever uma explicação detalhada mais tarde.

0&(]*:-<:)2:

J, 14 bytes

Esta versão graças a milhas. Utilizou o advérbio de poder em ^:vez de uma agenda como abaixo. Mais explicações por vir.

2(]*:-<:)^:[~]

J, 18 bytes

2:`(1+*/@$:@i.)@.*

Indexado a 0.

Exemplos

   e =: 2:`(1+*/@$:@i.)@.*
   e 1
3
   e 2
7
   e 3
43
   e 4
1807
   x: e i. 10
2 3 7 43 1807 3263443 10650056950807 113423713055421862298779648 12864938683278674737956996400574416174101565840293888 1655066473245199944217466828172807675196959605278049661438916426914992848    91480678309535880456026315554816
   |: ,: x: e i. 10
                                                                                                        2
                                                                                                        3
                                                                                                        7
                                                                                                       43
                                                                                                     1807
                                                                                                  3263443
                                                                                           10650056950807
                                                                              113423713055421862298779648
                                                    12864938683278674737956996400574416174101565840293888
165506647324519994421746682817280767519695960527804966143891642691499284891480678309535880456026315554816

Explicação

Esta é uma agenda que se parece com isso:

           ┌─ 2:
           │    ┌─ 1
       ┌───┤    ├─ +
       │   └────┤           ┌─ / ─── *
── @. ─┤        │     ┌─ @ ─┴─ $:
       │        └─ @ ─┴─ i.
       └─ *

(Gerado usando (9!:7)'┌┬┐├┼┤└┴┘│─'então 5!:4<'e')

Decomposição:

       ┌─ ...
       │
── @. ─┤
       │
       └─ *

Usando a ramificação superior como gerúndio Ge a parte inferior como seletor F, é o seguinte:

e n     <=>     ((F n) { G) n

Isso usa a função constante 2:quando 0 = * n, ou seja, quando o sinal é zero (portanto, né zero). Caso contrário, usamos este fork:

  ┌─ 1
  ├─ +
──┤           ┌─ / ─── *
  │     ┌─ @ ─┴─ $:
  └─ @ ─┴─ i.

Qual é mais uma das seguintes séries:

            ┌─ / ─── *
      ┌─ @ ─┴─ $:
── @ ─┴─ i.

Decompondo ainda mais, trata-se de produto ( */) acima da auto-referência ( $:) acima do intervalo ( i.).


2
Você também pode usar o advérbio de poder para obter 2(]*:-<:)^:[~]14 bytes usando a fórmula a(0) = 2e a(n+1) = a(n)^2 - (a(n) - 1). Para calcular valores maiores, o valor 2inicial deve ser marcado como um número inteiro estendido.
milhas

Ambas as soluções são muito legais. Eu acho que não tinha conhecimento do v`$:@.uformato recursivo. Eu sempre usei um ^:vformato que geralmente é mais complexo. @miles Eu também nunca usei o (]v)truque. Levei uns bons 5 minutos para entender.
randomra

11
Para completar, um terceiro tipo de loop (14 bytes usando o método de milhas): 2(]*:-<:)~&0~](ou 2:0&(]*:-<:)~]). E combinando-os 13 bytes ]0&(]*:-<:)2: .
Random # 26/16

12 bytes: 0&(]*:-<:)2:. (Desculpe, eu não deveria golfe nos comentários.)
randomra

@ randomra Esse é um uso muito legal de títulos. Eu tive que ler a página para descobrir exatamente o que aconteceu, pois normalmente alguém pensaria que o verbo do meio estava recebendo três argumentos.
miles

9

Perl 6 , 24 bytes

{(2,{1+[*] @_}...*)[$_]}
{(2,{1+.²-$_}...*)[$_]}

Explicação

# bare block with implicit parameter 「$_」
{
  (
    # You can replace 2 with 1 here
    # so that it uses 1 based indexing
    # rather than 0 based
    2,

    # bare block with implicit parameter 「@_」
    {
      1 +

      # reduce the input of this inner block with 「&infix:<*>」
      # ( the input is all of them generated when using a slurpy @ var )
      [*] @_

      # that is the same as:
      # 「@_.reduce: &infix:<*>」
    }

    # keep calling that to generate more values until:
    ...

    # forever
    *

  # get the value as indexed by the input
  )[ $_ ]
}

Uso:

my &code = {(2,{1+[*] @_}...*)[$_]}

say code 0; # 2
say code 1; # 3
say code 2; # 7
say code 3; # 43
say code 4; # 1807

# you can even give it a range
say code 4..7;
# (1807 3263443 10650056950807 113423713055421844361000443)

say code 8;
# 12864938683278671740537145998360961546653259485195807
say code 9;
# 165506647324519964198468195444439180017513152706377497841851388766535868639572406808911988131737645185443
say code 10;
# 27392450308603031423410234291674686281194364367580914627947367941608692026226993634332118404582438634929548737283992369758487974306317730580753883429460344956410077034761330476016739454649828385541500213920807

my $start = now;
# how many digits are there in the 20th value
say chars code 20;
# 213441

my $finish = now;
# how long did it take to generate the values up to 20
say $finish - $start, ' seconds';
# 49.7069076 seconds

Uma fatia de matriz com $_? Que bruxaria é essa?
Zaid

8

Haskell, 26 bytes

f n|n<1=2|m<-f$n-1=1+m*m-m

Exemplo de uso: f 4-> 1807.


7

Java 7, 46 bytes

int f(int n){return--n<0?2:f(n)*~-f(n)+1;}

Usa a indexação 0 com a fórmula usual. Eu troquei n*n-npor isso n*(n-1), já que o Java não tem um operador de energia útil, e as f()chamadas estavam ficando longas.


3
f(n)*~-f(n)Deveria trabalhar.
Dennis

11
Como eu esqueço esse truque toda vez ? Se isso não estiver na página de dicas, com certeza está.
Geobits 26/08/16

2
return--n<0salva mais um byte.
Dennis



6

Haskell, 25 bytes

(iterate(\m->m*m-m+1)2!!)


5

Brain-Flak , 158 154 bytes

Freira com vazamento me fez bater aqui

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

Experimente Online!

Explicação

Coloque dois na entrada a (0)

({}<(()())>) 

Enquanto a entrada for maior que zero, subtraia uma da entrada e ...

{
({}[()]

Silenciosamente ...

<

Coloque um na outra pilha para atuar como um catalisador da multiplicação <> (()) <>

Enquanto a pilha não estiver vazia

 ([])
 {
  {}

Mova o topo da lista e copie

  <>({}<<>(({}<>))><>)

Multiplique o catalisador pela cópia

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

Adicione um

 <>({}())

Mova a sequência de volta para a pilha apropriada

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

Remova tudo, exceto o item inferior (ou seja, o último número criado)

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

5

C, 32 bytes

f(n){return--n?f(n)*~-f(n)+1:2;}

Usa indexação baseada em 1. Teste em Ideone .



5

R, 44 42 41 bytes

Economize 2 bytes graças ao JDL

Economize 1 byte graças ao usuário5957401

f=function(n)ifelse(n,(a=f(n-1))^2-a+1,2)

11
Não está claro na declaração do problema, mas desde que nseja garantido que não seja negativo, a condição poderá ser reduzida de n>0para apenas n.
JDL

@JDL Nice! Obrigado !
Mamie

f(n-1)é de 6 bytes. Eu acho que você salva um byte atribuindo-o a algo. ieifelse(n,(a=f(n-1))^2-a+1,2)
user5957401

5

Oásis , 4 bytes (não competitivo)

Provavelmente minha última língua da família do golfe! Não concorrente, uma vez que o idioma adia o desafio.

Código:

²->2

Solução alternativa graças ao Zwei :

<*>2

Versão expandida:

a(n) = ²->
a(0) = 2

Explicação:

²    # Stack is empty, so calculate a(n - 1) ** 2.
 -   # Subtract, arity 2, so use a(n - 1).
  >  # Increment by 1.

Usa a codificação CP-1252 . Experimente online!


Última língua de golfe? Você não vai fazer mais nada? D:
Conor O'Brien

@ ConorO'Brien Provavelmente, estou sem ideias agora :(
Adnan

Antes de encarar esse desafio, eu comecei a b<*>2usar o #a(n-1)*(a(n-1)+1)-1
Zwei 23/09

@Zwei Muito arrumado! Na verdade, você pode deixar de fora o valor bque será automaticamente preenchido (em vez da entrada) :).
Adnan

11
Sim, notei isso depois de postar. Estou surpreso com o quão bem essa linguagem funciona para isso, apesar de ter sido projetada para seqüências.
Zwei 23/09

3

Python, 38 36 bytes

2 bytes graças a Dennis.

f=lambda n:0**n*2or~-f(n-1)*f(n-1)+1

Ideone it!

Usa esse relacionamento modificado em relação ao fornecido na sequência:

a(n+1) = a(n) * (a(n) - 1) + 1

Explicação

0**n*2retorna 2quando n=0e de 0outra forma, porque 0**0está definido para estar 1em Python.


3

Cheddar , 26 bytes

n g->n?g(n-=1)**2-g(n)+1:2

Experimente online!

Bastante idiomático.

Explicação

n g ->    // Input n, g is this function
  n ?     // if n is > 1
    g(n-=1)**2-g(n)+1   // Do equation specified in OEIS
  : 2     // if n == 0 return 2

Agora 4 vezes (quase) #
Leaky Nun

Por que você removeu o link do TIO?
Leaky Nun

@LeakyNun oh você deve de editar enquanto eu estava
Downgoat


3

05AB1E , 7 bytes

2sFD<*>

Explicado

Usa indexação baseada em zero.

2         # push 2 (initialization for n=0)
 sF       # input nr of times do
   D<*    # x(x-1)
      >   # add 1

Experimente online!




2

Geléia , 7 bytes

²_’
2Ç¡

Experimente online!

Usa esse relacionamento fornecido na sequência: a(n+1) = a(n)^2 - a(n) + 1

Explicação

2Ç¡   Main chain, argument in input

2     Start with 2
  ¡   Repeat as many times as the input:
 Ç        the helper link.


²_’   Helper link, argument: z
²     z²
  ’   z - 1
 _    subtraction, yielding z² - (z-1) = z² - z + 1

2

C, 46 bytes

s(n,p,r){for(p=r=2;n-->0;p*=r)r=p+1;return r;}

Ideone it!

Utiliza pcomo armazenamento temporário do produto.

Basicamente, eu defini duas seqüências p(n)e r(n), onde r(n)=p(n-1)+1e p(n)=p(n-1)*r(n).

r(n) é a sequência necessária.


11
Algum motivo para você não estar usando a mesma relação da sua resposta Python aqui? Isso deve ser muito mais curto ...
Dennis

@ Dennis Isso é mais interessante.
Leaky Nun

@ Dennis E esta resposta pode ser portado
Leaky Nun

2

R, 50 46 44 bytes

    n=scan();v=2;if(n)for(i in 1:n){v=v^2-v+1};v

Em vez de rastrear toda a sequência, mantemos o controle do produto, que segue a regra de atualização quadrática fornecida, desde que n> 1 n> 0. (Esta sequência usa a convenção "iniciar em um zero")

O uso da convenção start at zero economiza alguns bytes, pois podemos usar if (n) em vez de se (n> 1)


2

Água-viva , 13 bytes

p
\Ai
&(*
><2

Experimente online!

Explicação

Vamos começar de baixo para cima:

(*
<

Este é um gancho, que define uma função f(x) = (x-1)*x.

&(*
><

Isso compõe o gancho anterior com a função de incremento, portanto, fornece uma função g(x) = (x-1)*x+1.

\Ai
&(*
><

Finalmente, isso gera uma função hque é uma iteração da função anterior g, quantas vezes for fornecida pela entrada inteira.

\Ai
&(*
><2

E, finalmente, aplicamos essa iteração ao valor inicial 2. A pparte superior apenas imprime o resultado.

Alternativa (também 13 bytes)

p
>
\Ai
(*
>1

Isso adia o incremento até o final.


2

C, 43 , 34 , 33 bytes

1 indexado:

F(n){return--n?n=F(n),n*n-n+1:2;}

Teste principal:

int main() {
  printf("%d\n", F(1));
  printf("%d\n", F(2));
  printf("%d\n", F(3));
  printf("%d\n", F(4));
  printf("%d\n", F(5));
}


2

Mathematica, 19 bytes

Nest[#^2-#+1&,2,#]&

Ou 21 bytes:

Array[#0,#,0,1+1##&]&

A Arraysolução é mágica. Que pena, ##0não é uma coisa. ;)
Martin Ender


1

Na verdade , 14 12 bytes

Isso usou a indexação 0. Sugestões de golfe são bem-vindas. Experimente online!

2#,`;πu@o`nF

Ungolfing:

2#              Start with [2]
  ,`     `n     Take 0-indexed input and run function (input) times
    ;           Duplicate list
     πu         Take product of list and increment
       @o       Swap and append result to the beginning of the list
           F    Return the first item of the resulting list

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.