La sequenza di Sylvester


32

La sequenza di Sylvester, OEIS A000058 , è una sequenza intera definita come segue:

Ogni membro è il prodotto di tutti i membri precedenti più uno. Il primo membro della sequenza è 2.

Compito

Crea il programma più piccolo possibile che richiede an e calcola l'ennesimo termine della sequenza di Sylvester. Si applicano input, output e scappatoie standard. Dal momento che il risultato cresce molto rapidamente, non ci si aspetta che il risultato causi un overflow nella lingua scelta.

Casi test

È possibile utilizzare zero o una indicizzazione. (Qui utilizzo l'indicizzazione zero)

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

Quali input dovrebbero essere gestiti? L'output cresce abbastanza rapidamente.
Geobits il

1
@Geobits dovresti gestire il più possibile la tua lingua
Wheat Wizard il

È accettato un array che, se indicizzato con, nrestituisce il nthnumero della sequenza?
user6245072,

@ user6245072 No devi indicizzare i tuoi array
Wheat Wizard il

Risposte:


26

Brain-Flak , 76 68 58 52 46 byte

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

Provalo online!

Utilizza invece questa relazione:

formula

che deriva da questa relazione modificata da quella fornita nella sequenza:

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

Spiegazione

Per una documentazione di ciò che fa ciascun comando, visitare la pagina GitHub .

Ci sono due pile in Brain-Flak, che chiamerò rispettivamente Stack 1 e Stack 2.

L'ingresso è memorizzato nello Stack 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.

Per l'algoritmo di generazione:

({({}[()])({})}{}())      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).

Versione alternativa a 46 byte

Questo utilizza solo uno stack.

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

Provalo online!


1
Solo 10 byte in più per mostrare che gli sviluppatori di java dovrebbero andare in crisi cerebrale
Rohan Jhunjhunwala,

1
@RohanJhunjhunwala Temo che sia impossibile ...
Leaky Nun,

@LeakyNun è ancora interessante pensare. Brain Flak ha un po 'di potere ed è sorprendentemente conciso
Rohan Jhunjhunwala,

5
La versione a uno stack è anche stack clean. Che tende ad essere un punto importante per la modularità del codice nel cervello-flak.
Mago del grano

Wow. Questa è una risposta estremamente impressionante.
DJMcMayhem

12

Gelatina , 5 byte

Ḷ߀P‘

Questo utilizza l'indicizzazione basata su 0 e la definizione dalle specifiche della sfida.

Provalo online! o verifica tutti i casi di test .

Come funziona

Ḷ߀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, ho dimenticato che il prodotto vuoto è 1.
Leaky Nun,

12

Esagonia , 27 byte

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

non piegato:

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

Provalo online!

Spiegazione

Consideriamo la sequenza b(a) = a(n) - 1e facciamo un po 'di riorganizzazione:

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)

Questa sequenza è molto simile ma possiamo rimandare l'incremento fino alla fine, cosa che succede per salvare un byte in questo programma.

Quindi ecco il codice sorgente annotato:

enter image description here
Creato con HexagonyColorer di Timwi .

Ed ecco un diagramma di memoria (il triangolo rosso mostra la posizione iniziale e l'orientamento del puntatore di memoria):

enter image description here
Creato con EsotericIDE di Timwi .

Il codice inizia sul percorso grigio che avvolge l'angolo sinistro, quindi il bit lineare iniziale è il seguente:

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

Quindi il codice colpisce <quale è un ramo e indica l'inizio (e la fine) del ciclo principale. Finché il bordo N ha un valore positivo, verrà eseguito il percorso verde. Quel percorso avvolge la griglia alcune volte, ma in realtà è del tutto lineare:

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

Non ci .sono operazioni, quindi il codice effettivo è:

""~&}=*}=+={(
""             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.

Una volta che questo decremento riduce Na 0, viene eseguito il percorso rosso:

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

Puoi far funzionare il tuo bruteforcer su questo?
Calcolatrice

@CalculatorFeline Il forcer brutale può fare al massimo programmi a 7 byte (e anche solo con un mucchio di ipotesi) in un ragionevole lasso di tempo. Non vedo che ciò è possibile in remoto in 7 byte.
Martin Ender,

Così? Cosa c'è di sbagliato nel provare?
Calcolatrice

@CalculatorFeline Laziness. Il bruto forcer richiede sempre un po 'di modifica manuale che non posso preoccuparmi di fare per la probabilità praticamente 0 che troverà qualcosa. Alcune versioni dello script sono su GitHub, quindi chiunque altro è libero di provarlo.
Martin Ender,

E come posso farlo?
Calcolatrice

9

J, 18 14 12 byte

Questa versione grazie a randomra. Proverò a scrivere una spiegazione dettagliata più avanti.

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

J, 14 byte

Questa versione grazie alle miglia. Ho usato l'avverbio di potenza ^:invece di un programma come di seguito. Altre spiegazioni a venire.

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

J, 18 byte

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

0-indicizzati.

Esempi

   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

Spiegazione

Questa è un'agenda che assomiglia a questa:

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

(Generato utilizzando (9!:7)'┌┬┐├┼┤└┴┘│─'quindi 5!:4<'e')

decomposizione:

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

Utilizzando il ramo superiore come gerundio Ge il fondo come selettore F, questo è:

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

Questo utilizza la funzione costante 2:quando 0 = * n, cioè quando il segno è zero (quindi nè zero). Altrimenti, usiamo questo fork:

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

Quale è uno più le seguenti in cima alla serie:

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

Scomponendo ulteriormente, questo è product ( */) su self-reference ( $:) su range ( i.).


2
Puoi anche usare il power avverb per ottenere 2(]*:-<:)^:[~]14 byte usando la formula a(0) = 2e a(n+1) = a(n)^2 - (a(n) - 1). Per calcolare valori più grandi, 2all'inizio dovrà essere contrassegnato come un numero intero esteso.
miglia,

Entrambe le soluzioni sono molto carine. Penso di non essere a conoscenza del v`$:@.uformato ricorsivo. Ho sempre usato un ^:vformato spesso più complesso. @miles Non ho mai usato il (]v)trucco. Mi ci sono voluti ben 5 minuti per capirlo.
randomra,

1
Per completezza un terzo tipo di loop (14 byte usando il metodo miglia): 2(]*:-<:)~&0~](o 2:0&(]*:-<:)~]). E combinandoli 13 byte ]0&(]*:-<:)2: .
randomra,

12 byte: 0&(]*:-<:)2:. (Mi dispiace, non dovrei giocare a golf nei commenti.)
randomra,

@randomra Questo è un uso davvero pulito del legame. Ho dovuto leggere la pagina per scoprire esattamente cosa è successo poiché normalmente si potrebbe pensare che il verbo centrale ricevesse tre argomenti.
miglia,

9

Perl 6 , 24 byte

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

Spiegazione

# 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

Una porzione di array con $_? Che stregoneria è questa?
Zaid,


7

Java 7, 46 42 byte

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

Utilizza l'indicizzazione 0 con la solita formula. Ho scambiato n*n-nper n*(n-1)però, dal momento che Java non ha un pratico operatore di potenza e le f()chiamate stavano diventando lunghe.


3
f(n)*~-f(n)dovrebbe funzionare.
Dennis,

1
Come posso dimenticare quel trucco ogni volta ? Se quello non è nella pagina dei suggerimenti, è dannatamente sicuro di esserlo.
Geobits il

2
return--n<0salva un altro byte.
Dennis,



6

Haskell, 25 byte

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


5

Brain-Flak , 158 154 byte

Leaky Nun mi ha battuto qui

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

Provalo online!

Spiegazione

Inserisci un due sotto l'ingresso a (0)

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

Mentre l'ingresso è maggiore di zero sottrarre uno dall'ingresso e ...

{
({}[()]

In silenzio ...

<

Metti uno sull'altro stack per fungere da catalizzatore per la moltiplicazione <> (()) <>

Mentre lo stack è non vuoto

 ([])
 {
  {}

Sposta la parte superiore dell'elenco e copia

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

Moltiplica il catalizzatore per la copia

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

Aggiungi uno

 <>({}())

Riporta la sequenza nella pila corretta

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

Rimuovi tutto tranne l'elemento in basso (ovvero l'ultimo numero creato)

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



5

R, 44 42 41 byte

Risparmio di 2 byte grazie a JDL

Risparmio di 1 byte grazie a user5957401

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

1
Non è chiaro dall'affermazione del problema, ma purché nsia garantito che non sia negativo, la condizione può essere ridotta da n>0a giusta n.
JDL,

@JDL Nice! Grazie !
Mamie,

f(n-1)è di 6 byte. Penso che tu salvi un byte assegnandolo a qualcosa. vale a direifelse(n,(a=f(n-1))^2-a+1,2)
user5957401

5

Oasis , 4 byte (non concorrenti)

Probabilmente la mia ultima lingua dalla famiglia del golf! Non competitiva, poiché la lingua postdatizza la sfida.

Codice:

²->2

Soluzione alternativa grazie a Zwei :

<*>2

Versione estesa:

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

Spiegazione:

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

Utilizza la codifica CP-1252 . Provalo online!


L'ultima lingua del golf? Non ne farai più? D:
Conor O'Brien,

@ ConorO'Brien Probabilmente, non ho più idee ora :(
Adnan,

Prima di guardare questa sfida, ho b<*>2usatoa(n-1)*(a(n-1)+1)-1
Zwei il

@Zwei Molto pulito! Puoi effettivamente tralasciare il bdato che verrà compilato automaticamente (anziché l'input) :).
Adnan,

1
Sì, l'ho notato dopo aver pubblicato. Sono sorpreso di quanto funzioni bene questo linguaggio, anche se è progettato per le sequenze.
Zwei,

3

Python, 38 36 byte

2 byte grazie a Dennis.

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

Ideone esso!

Utilizza invece questa relazione modificata da quella fornita nella sequenza:

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

Spiegazione

0**n*2restituisce 2quando n=0e in caso 0contrario, poiché 0**0è definito 1in Python.


3

Cheddar , 26 byte

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

Provalo online!

Abbastanza idiomatico.

Spiegazione

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

Ora 4 volte (quasi)
Leaky Nun,

Perché hai rimosso il link TIO?
Leaky Nun,

@LeakyNun oh, quando stavo
lavorando


3

05AB1E , 7 byte

2sFD<*>

spiegato

Utilizza l'indicizzazione in base zero.

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

Provalo online!



3

SILOS 201 byte

readIO 
def : lbl
set 128 2
set 129 3
j = i
if j z
print 2
GOTO e
:z
j - 1
if j Z
print 3
GOTO e
:Z
i - 1
:a
a = 127
b = 1
c = 1
:b
b * c
a + 1
c = get a
if c b
b + 1
set a b
i - 1
if i a
printInt b
:e

Sentiti libero di provarlo online!


2
Che diavolo sta succedendo
TuxCrafting il

1
@ TùxCräftîñg witchcraft
Rohan Jhunjhunwala

2

Gelatina , 7 byte

²_’
2Ç¡

Provalo online!

Utilizza invece questa relazione fornita nella sequenza: a(n+1) = a(n)^2 - a(n) + 1

Spiegazione

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 byte

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

Ideone esso!

Utilizza pcome deposito temporaneo del prodotto.

Fondamentalmente, ho definito due sequenze p(n)e r(n), dove r(n)=p(n-1)+1e p(n)=p(n-1)*r(n).

r(n) è la sequenza richiesta.


1
Qualche motivo per cui non stai usando la stessa relazione dalla tua risposta Python qui? Dovrebbe essere molto più breve ...
Dennis il

@Dennis Questo è più interessante.
Leaky Nun,

@Dennis E questa risposta può essere portata
Leaky Nun,

2

R, 50 46 44 byte

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

Invece di tenere traccia dell'intera sequenza, teniamo semplicemente traccia del prodotto, che segue la data regola di aggiornamento quadratica fino a quando n> 1 n> 0. (Questa sequenza utilizza la convenzione "start at one zero")

L'uso della convenzione start at zero consente di risparmiare un paio di byte poiché possiamo usare if (n) anziché if (n> 1)


2

Meduse , 13 byte

p
\Ai
&(*
><2

Provalo online!

Spiegazione

Partiamo dal basso verso l'alto:

(*
<

Questo è un hook, che definisce una funzione f(x) = (x-1)*x.

&(*
><

Questo compone l'hook precedente con la funzione di incremento in modo che ci dia una funzione g(x) = (x-1)*x+1.

\Ai
&(*
><

Infine, questo genera una funzione hche è un'iterazione della funzione precedente g, tante volte quante sono state fornite dall'input intero.

\Ai
&(*
><2

E infine, applichiamo questa iterazione al valore iniziale 2. Il psimbolo in alto stampa il risultato.

Alternativa (anche 13 byte)

p
>
\Ai
(*
>1

Questo difende l'incremento fino alla fine.


2

C, 43 , 34 , 33 byte

1-indicizzati:

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

Test principale:

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 byte

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

O 21 byte:

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

La Arraysoluzione è magica Peccato, ##0non è una cosa. ;)
Martin Ender,


1

In realtà , 14 12 byte

Questo ha usato l'indicizzazione 0. Suggerimenti di golf benvenuti. Provalo 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

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.