1, 2, 4, 8, 16, ... 33?

24

Reto

Escriba una función / programa que genere el n'elemento th, o los primeros nelementos, en la secuencia numérica bien conocida:

         1, 2, 4, 8, 16 ...

Oh, espera ... olvidé los primeros números:

1, 1, 1, 1, 2, 4, 8, 16 ...

Heck, agregaré algunos más por si acaso:

1, 1, 1, 1, 2, 4, 8, 16, 33, 69, 146, 312, 673, 1463, 3202, 7050, 15605, 34705 ...

Los números son números catalanes generalizados dados por la fórmula (indexado a cero):

una(norte+1)=una(norte)+k=2norte-1una(k)una(norte-1-k)

dónde

una(0 0)=una(1)=una(2)=una(3)=1

Este es OEIS A004149 .

Puede elegir si desea tener la secuencia de índice cero o uno indexado. La secuencia, por supuesto, debe ser la misma, por lo que debe reescribir la fórmula si la tiene un índice.

Stewie Griffin
fuente
Corrígeme si me equivoco aquí, pero la modificación de una fórmula indexada es cambiar a(n-1-k)a a(n-k), ¿correcto?
Sumner18
99
Esto me recuerda a La fuerte ley de los números pequeños
Luis Mendo

Respuestas:

23

Python , 51 bytes

f=lambda n,k=2:n<3or k<n and f(k)*f(n-k-2)+f(n,k+1)

Pruébalo en línea!

Simplifica un poco la fórmula:

una(norte)=k=2norte-1una(k)una(norte-2-k)

una(-1)=una(0 0)=una(1)=una(2)=1

xnor
fuente
8
¡Felicidades por los 100k!
Stewie Griffin
Como también llegué a esta solución de forma independiente, debo decir que el camino hacia ella es un poco accidentado ...
Erik the Outgolfer
10

Perl 6 , 44 bytes

{1,1,1,1,{sum @_[2..*]Z*@_[@_-4...0,0]}...*}

Pruébalo en línea!

Bloque de código anónimo que devuelve una secuencia infinita de valores perezosa. Esto prácticamente implementa la secuencia como se describe, con el acceso directo que comprime multiplica todos los elementos hasta ahora después del segundo elemento con el reverso de la lista comenzando desde el cuarto elemento y agregando un extra 1al final.

Explicación:

{                                          }  # Anonymous code block
                                       ...*   # Create an infinite sequence
 1,1,1,1,                                     # Starting with four 1s
         {                            }       # Where each new element is:
          sum                                   # The sum of
              @_[2..*]                          # The second element onwards
                      Z*                        # Zip multiplied with
                        @_[@_-4...0  ]          # The fourth last element backwards
                                   ,0           # And 1
Jo King
fuente
10

05AB1E , 14 13 11 bytes

$ƒˆ¯Âø¨¨¨PO

Pruébalo en línea!

Emite el enésimo elemento, indexado a 0.

$                # push 1 and the input
 ƒ               # repeat (input+1) times
  ˆ              #  add the top of the stack (initially 1) to the global array
   ¯             #  push the global array
    Â            #  and a reversed copy of it
     ø           #  zip the two together, giving a list of pairs
      ¨¨¨        #  drop the last 3 pairs
         P       #  take the product of each pair (or 1 if the list is empty)
          O      #  take the sum of those products
                 #  after the last iteration, this is implicitly output;
                 #  otherwise, it's added to the global array by the next iteration
Mugriento
fuente
7

JavaScript (ES6), 42 bytes

Un puerto de la solución de xnor .

0 indexado.

f=(n,k=2)=>n<3||k<n&&f(k)*f(n+~++k)+f(n,k)

Pruébalo en línea!


JavaScript (ES6),  83  75 bytes

Una solución más rápida, menos recursiva, pero significativamente más larga.

0 indexado.

f=(n,i,a=[p=1])=>a[n]||f(n,-~i,[...a,p+=(h=k=>k<i&&a[k]*a[i-++k]+h(k))(2)])

Pruébalo en línea!

Arnauld
fuente
7

Haskell, 49 43 39 bytes

a n=max(sum[a k*a(n-2-k)|k<-[2..n-1]])1              

Pruébalo en línea!

Para n<3el sumes 0, entonces lo max ... 1eleva a 1.

Editar: -6 bytes gracias a @Jo King.

nimi
fuente
6

05AB1E , 17 13 bytes

4Å1λ£₁λ¨Â¦¦s¦¦*O+

No más corto que la respuesta 05AB1E existente , pero quería probar la funcionalidad recursiva de la nueva versión 05AB1E como práctica para mí. Quizás podría jugarse unos pocos bytes. EDIT: Y de hecho puede, ver la versión recursiva de @Grimy respuesta 05AB1E 's de abajo, que es 13 bytes .

norte

norte£è
£

Explicación:


una(norte)=una(norte-1)+k=2norte-1(una(k)una(norte-1-k))

una(0 0)=una(1)=una(2)=una(3)=1

   λ               # Create a recursive environment,
    £              # to output the first (implicit) input amount of results after we're done
4Å1                # Start this recursive list with [1,1,1,1], thus a(0)=a(1)=a(2)=a(3)=1
                   # Within the recursive environment, do the following:
      λ            #  Push the list of values in the range [a(0),a(n)]
       ¨           #  Remove the last one to make the range [a(0),a(n-1)]
        Â          #  Bifurcate this list (short for Duplicate & Reverse copy)
         ¦¦        #  Remove the first two items of the reversed list,
                   #  so we'll have a list with the values in the range [a(n-3),a(0)]
           s       #  Swap to get the [a(0),a(n-1)] list again
            ¦¦     #  Remove the first two items of this list as well,
                   #  so we'll have a list with the values in the range [a(2),a(n-1)]
              *    #  Multiply the values at the same indices in both lists,
                   #  so we'll have a list with the values [a(n-3)*a(2),...,a(0)*a(n-1)]
               O   #  Take the sum of this list
               +  #  And add it to the a(n-1)'th value
                   # (afterwards the resulting list is output implicitly)

Versión de 13 bytes de @Grimy (¡asegúrate de votar su respuesta si aún no lo has hecho!):

1λ£λ1šÂ¨¨¨øPO

norte


1λèλ1šÂ¨¨¨øPO
λλ1šÂ¨¨¨øPOuna(0 0)=1

Explicación:


una(norte)=k=2norte-1(una(k)una(norte-2-k))

una(-1)=una(0 0)=una(1)=una(2)=1

 λ             # Create a recursive environment,
  £            # to output the first (implicit) input amount of results after we're done
1              # Start this recursive list with 1, thus a(0)=1
               # Within the recursive environment, do the following:
   λ           #  Push the list of values in the range [a(0),a(n)]
    1š         #  Prepend 1 in front of this list
      Â        #  Bifurcate the list (short for Duplicate & Reverse copy)
       ¨¨¨     #  Remove (up to) the last three value in this reversed list
          ø    #  Create pairs with the list we bifurcated earlier
               #  (which will automatically remove any trailing items of the longer list)
           P   #  Get the product of each pair (which will result in 1 for an empty list)
            O  #  And sum the entire list
               # (afterwards the resulting list is output implicitly)
Kevin Cruijssen
fuente
1
Es interesante que esto pueda resolver un (1200) en 40 segundos en tio, mientras que otros enfoques recursivos caducan para números n que 100 ...
Stewie Griffin
1
También hice (pero no publiqué) una versión recursiva. Sus 13 bytes para los primeros n términos , u 11 bytes para una lista infinita . La carcasa especial a (n-1) cuesta muchos bytes y no es necesaria (ver, por ejemplo, la fórmula de xnor ).
Grimmy
@ Grimy ¿Te importa si agrego tus soluciones recursivas a mi respuesta (por supuesto, acreditándote)? Dejaré mi respuesta original también. Pero es agradable ver las diferencias entre la fórmula original y la fórmula de ahorro de bytes de xnor. :)
Kevin Cruijssen
1
Claro, está bien!
Grimmy
@StewieGriffin Sí, también me impresionó la velocidad de estas funciones recursivas infinitas. Tal vez uno de los puntos fuertes de Elixir, y definitivamente debido a la carga perezosa incorporada. Se calcula n=100en 0,65 segundos , pero cuando desactivo perezoso de carga, que se apaga después de 60 segundos en lugar, incluso paran=25 .
Kevin Cruijssen
2

Japt , 19 17 16 bytes

Emite el ntérmino th, 1-indexado.

@Zí*Zz2)Ťx}g4Æ1

Intentalo

@Zí*Zz2)Ťx}g4Æ1     :Implicit input of integer U
@                    :Function taking an array as an argument via parameter Z
 Zí                  :  Interleave Z with
    Zz2              :  Z rotated clockwise by 180 degrees (simply reversing would be a bye shorter but would modify the original array)
   *                 :  Reduce each pair by multiplcation
       )             :  End interleave
        Å            :  Slice off the first element
         ¤           :  Slice off the first 2 elements
          x          :  Reduce by addition
           }         :End function
            g        :Pass the following as Z, push the result back to it and repeat until it has length U
             4Æ1     :Map the range [0,4) to 1s
                     :Implicit output of the last element
Lanudo
fuente
1

Haskell , 65 bytes

f a|a<4=1|z<-g[2..a]=sum$zipWith(*)z$reverse(1:g[0..a-4])
g=map f

Pruébalo en línea!

Puede usar fpara obtener un solo elemento de una secuencia, o pasar una lista de valores gy obtener todos los índices para esa lista.

Jo King
fuente
1

Adelante (gforth) , 99 81 bytes

: f recursive dup 4 > if 0 over 3 do over 1- i - f i f * + loop else 1 then nip ;

Pruébalo en línea!

La salida es el enésimo término y la entrada está indexada en 1

Editar: ahorró 17 bytes cambiando a la fórmula de xnor. Se guardó otro 1 byte usando 1 indexado

Explicación del Código

: f                     \ start a new word definition
  recursive             \ mark that this word will be recursive
  dup 4 >               \ duplicate the input and check if it is greater than 4
  if                    \ if it is:
    0 over              \ create an accumulator and copy n to top of stack
    3 do                \ start counted loop from 3 to n-1
      over 1- i - f     \ recursively calculate f(n-1-i)
      i f               \ recursively calculate f(i)
      * +               \ multiply results and add to accumulator
    loop                \ end the counted loop        
  else                  \ otherwise, if n < 5
    1                   \ put 1 on the stack
  then                  \ end the if block
  nip                   \ drop n from the stack
;                       \ end the word definition
reffu
fuente
1

Carbón , 26 bytes

F⁵⊞υ¹FN⊞υΣ✂E⮌υ×κ§υλ³→I§υ±⁴

Pruébalo en línea! El enlace es a la versión detallada del código. Imprime el enésimo número indexado en 0, aunque calcula utilizando la indexación 1 internamente. Explicación:

F⁵⊞υ¹

Comenzar con a[0] = a[1] = a[2] = a[3] = a[4] = 1. Sí, esto está indexado en 1, pero luego con un valor cero adicional. Eso es código golf para ti.

FN

Calcular unos ntérminos adicionales . Esto es excesivo, pero hace que encontrar el término deseado sea más fácil cuando n<5.

⊞υΣ✂E⮌υ×κ§υλ³

Para cada término, calcule el siguiente término como la suma de los términos hasta el momento multiplicados por el reverso de los términos hasta el momento, excluyendo tres términos.

Este es un no-op utilizado para engañar a Charcoal para que analice la forma de 2 argumentos Slice, de lo contrario tendría que usar una forma menos golfosa de eliminar tres términos.

I§υ±⁴

Salida del 4to último término.

Neil
fuente
1

Pyth , 30 bytes

J*4]1VQ=+J+eJsPP*M.t,PJ_PJ0;<J

Pruébalo en línea!

norte

J*4]1VQ=+J+eJsPP*M.t,PJ_PJ0;<JQ # Full program, last Q = input (implicitly added)
J*4]1                  # J = 4 * [1] (=[1,1,1,1])
VQ                     # for N in range(Q):
  =+J                  #  J +=
     +eJ               #   J[-1] + 
        s              #    sum(                           )
           *M          #     map(__operator_mul,          )
             .t      0 #      transpose(          , pad=0)
               ,       #       [       ,         ]
                PJ     #         J[:-1] 
                  _PJ  #                 J[1::-1]
<JQ                    # J[::Q]

<@norte

ar4093
fuente
1

Octava , 73 bytes

g=(1:4).^0;for(i=3:(n=input('')))g(i+2)=g(4:i+1)*g(i-(2:i-1))';end;g(end)

Pruébalo en línea!

-2 bytes gracias a Stewie Griffin. Una vez más, el enfoque imperativo gana al enfoque recursivo funcional. Ese se muestra a continuación.

Octava , 75 bytes

f(f=@(a)@(n){@()sum(arrayfun(@(k)a(a)(k)*a(a)(n-2-k),2:n-1)),1}{2-(n>3)}())

Pruébalo en línea!

Captcha quería verificar que era humano cuando publicaba esto. Para ser honesto, no estoy tan seguro .

Sanchises
fuente
No puedo ver ninguna forma obvia de acortar el enfoque del bucle ... ¡Parece bastante bien! Además, no es frecuente que vea indexación basada en cero en Octave :)
Stewie Griffin
@StewieGriffin Dado que la recursión tiene algunas compensaciones, realmente no importa si elige cero o una indexación. Creo que tal vez podría reducir algunos bytes si hiciera una indexación 2, pero eso parecía una trampa. De todos modos, su intuición era correcta: de alguna manera, esto fue más corto de forma anónima recursiva. Creo que la principal ventaja es que maneja la creación de los cuatro valores iniciales muy bien porque solo devuelve 1 para n<4.
Sanchises
1
@StewieGriffin Por supuesto, una buena multiplicación de matrices. ¡Bien hecho!
Sanchises
0

C / C ++ , 70 69 67 bytes

-1 bytes gracias a Jonathan.

int a(int n){int k=2,s=0;while(++k<n)s+=a(k)*a(n+~k);return s?s:1;}

Pruébalo en línea!

polfosol ఠ_ఠ
fuente
Puede a(n-1-k)ser a(n+~k)?
Jonathan Frech
a(++k)*a(n-k)Es probable que @JonathanFrech incluso funcione, y deja caer otros 2 bytes for. Pero huelo un comportamiento indefinido.
polfosol ఠ_ఠ
Eso parece ser un problema de secuencia; definitivamente UB.
Jonathan Frech