El enésimo número de grifo

26

El otro día se me ocurrió una serie de números y decidí verificar cuál era el número OEIS. Para mi sorpresa, la secuencia no parecía estar en la base de datos de OEIS, así que decidí nombrar la secuencia después de mí (tenga en cuenta que alguien más que es mucho más inteligente que yo probablemente ya haya llegado a esto, y si alguien encuentra el nombre real de esta secuencia, comente y cambiaré el título de la pregunta). Como no pude encontrar la secuencia en ningún lado, decidí ponerle un nombre, de ahí "Números de grifos". EDITAR: Gracias a @Surb por llamar mi atención sobre el hecho de que esta secuencia es igual a la secuencia OEIS A053696 - 1.

Un número de grifo es un número de la forma , donde y son enteros mayores o iguales que dos, y la secuencia de grifo es el conjunto de todos los números de grifo en forma ascendente orden. Si hay varias formas de formar un número de grifo (el primer ejemplo es , que es y ), el número solo se cuenta una vez en la secuencia. Los primeros números de Gryphon son: .a+a2+...+axax302+22+23+245+526,12,14,20,30,39,42,56,62,72

Tu tarea:

Escribir un programa o función que recibe un número entero como entrada y salida a la ésimo número Gryphon. nn

Entrada:

Un entero entre 0 y 10000 (inclusive). Puede tratar la secuencia como indexada a 0 o indexada a 1, lo que prefiera. Indique qué sistema de indexación utiliza en su respuesta para evitar confusiones.

Salida:

El número de grifo correspondiente a la entrada.

Casos de prueba:

Tenga en cuenta que esto supone que la secuencia está indexada en 0. Si su programa asume una secuencia indexada en 1, no olvide incrementar todos los números de entrada.

Input:    Output:
0   --->  6
3   --->  20
4   --->  30
10  --->  84
99  --->  4692
9999 -->  87525380

Tanteo:

Este es el , por lo que gana la puntuación más baja en bytes.

Gryphon - Restablece a Monica
fuente
66
La secuencia de Gryphon es A053696 - 1. En otras palabras, A053696 es la secuencia creciente de números de la forma . a0+a1++ax
Surb
2
@Surb ah, por eso no pude encontrarlo. En ese caso, pondré esa información en una edición, pero mantendré el resto de la pregunta como está, ya que no parece haber un mejor nombre para la secuencia.
Gryphon - Restablece a Mónica el

Respuestas:

15

Jalea , 9 bytes

bṖ’ḅi-µ#Ṫ

Un programa completo que lee un número entero (1 indexado) de STDIN e imprime el resultado.

Pruébalo en línea!

¿Cómo?

Un número de Gryphon es un número que se puede expresar en una base menor que sí mismo, de modo que todos los dígitos son unos excepto el menos significativo, que es un cero. Por ejemplo:

30=1×24+1×23+1×22+1×21+0×20302=11110

84=1×43+1×42+1×41+0×40844=1110

Este programa toma n, luego comienza v=0y comprueba esta propiedad e incrementa vhasta encontrar nesos números, luego genera el último.

Para probar un bnúmero base , resta uno de cada dígito, convierte de base vy luego verifica si el resultado es . (Tenga en cuenta que es menor que )1bv

3020×304+0×303+0×302+0×301+(1)×300=1

8440×843+0×842+0×841+(1)×840=1

bṖ’ḅi-µ#Ṫ - Main Link: no arguments
       #  - set v=0 then count up collecting n=STDIN matches of:
      µ   -  the monadic link -- i.e. f(v):  e.g. v=6
 Ṗ        -    pop (implicit range of v)            [1,2,3,4,5]
b         -    to base (vectorises)                 [[1,1,1,1,1,1],[1,1,0],[2,0],[1,2],[1,1]]
  ’       -    decrement (vectorises)               [[0,0,0,0,0,0],[0,0,-1],[1,-1],[0,1],[0,0]]
   ḅ      -    from base (v) (vectorises)           [0,-1,5,1,0]
     -    -    literal -1                           -1
    i     -    first index of (zero if not found)   2
          - }  e.g. n=11 -> [6,12,14,20,30,39,42,56,62,72,84]
        Ṫ - tail         -> 84
          - implicit print
Jonathan Allan
fuente
11

MATL , 16 13 bytes

:Qtt!^Ys+uSG)

Basado en 1.

Pruébalo en línea!

Explicación

Considere la entrada n = 3como un ejemplo.

:    % Implicit input: n. Range
     % STACK: [1 2 3]
Q    % Add 1, element-wise
     % STACK: [2 3 4]
tt   % Duplicate twice, transpose
     % STACK: [2 3 4], [2 3 4], [2;
                                 3;
                                 4]
^    % Power, element-wise with broadcast
     % STACK: [2 3 4], [ 4   9  16;
                         8  27  64;
                        16  81 256]
Ys   % Cumulative sum of each column
     % STACK: [2 3 4], [ 4    9  16;
                         12  36  80;
                         28 117 336]
+    % Add, element-wise with broadcast (*)
     % STACK: [ 6  12  20;
               14  39  84
               30 120 340]
u    % Unique elements. Gives a column vector
     % STACK: [  6;
                14;
                30;
                12;
               ···
               340]
S    % Sort
     % STACK: [  6;
                12
                14;
                20;
               ···
               340]
G)   % Push input again, index. This gets the n-th element. Implicit display
     % STACK: 14

La matriz obtenida en el paso (*) contiene posiblemente números repetidos de Gryphon. En particular, contiene ndistintos números de Gryphon en su primera fila. Estos no son necesariamente los nnúmeros más pequeños de Gryphon. Sin embargo, la entrada inferior izquierda 2+2^+···+2^n excede la entrada superior derecha n+n^2y, por lo tanto, todos los números en la última fila exceden los de la primera fila. Esto implica que extender la matriz hacia la derecha o hacia abajo no contribuiría con ningún número de Gryphon menor que los nnúmeros más bajos de la matriz. Por lo tanto, se garantiza que la matriz contenga los nnúmeros de Gryphon más pequeños. En consecuencia, su nelemento único más bajo es la solución.

Luis Mendo
fuente
1
¡Qué demonios, esto es asombroso!
IQuick 143
8

Haskell , 53 bytes

([n|n<-[6..],or[a^y+n==n*a+a|a<-[2..n],y<-[3..n]]]!!)

Pruébalo en línea!

Un número es Gryphon si existen enteros y modo que .na2x2n=i=1xai

Generamos una lista infinita de todos modo que una búsqueda de fuerza bruta muestra que este es el caso.n6

La respuesta es una función de índice (indexado a cero) en esta lista, denotada en Haskell como (list!!).

¿Por qué es a^y+n==n*a+acorrecto?

De la fórmula para sumar una progresión geométrica :

i=1ναρi1=α(1ρν)1ρ

tenemos, dejando :(α,ρ,ν)=(a,a,x)

n=i=1xai=a(1ax)1a=aax+11a.

Al reorganizar la ecuación, obtenemos .n(1a)=aax+1

Reorganizando eso aún más, obtenemos .ax+1+n=na+a

Una sustitución en la búsqueda de fuerza bruta produce la expresión final .y=x+1a^y+n=n*a+a

¿Está buscando hasta que sea nsuficiente?

  • Si (en otras palabras, ), entonces que prueba . Por lo tanto, no tiene sentido verificar ninguno de los valores .a>nan+1

    ay+n>a2(n+1)a=na+a
    ay+nna+aa>n

  • Del mismo modo: si , entonces demostrando nuevamente .y>n

    ay+n>an=an1a2n1a>(n+1)a=na+a,
    ay+nna+a

    Podemos suponer porque sabemos , el número de Gryphon más pequeño.2n1>n+1n6

Lynn
fuente
7

Python 3.8 (versión preliminar) , 98 92 89 78 71 bytes

lambda n:sorted({a*~-a**x//~-a for a in(r:=range(2,n+3))for x in r})[n]

Pruébalo en línea!

0 indexado. La división de enteros se debe usar aquí porque f (10000) desborda los flotadores.

Genera todos los números Gryphon donde y , los ordena, y selecciona el -ésimo elemento.2an+22xn+2n

-6 bytes gracias a Jonathan Allan

-3 bytes gracias a ArBo. Casi hice lo que me sugirió, pero traté de usar {*(...)}lo que de todos modos no ahorró espacio

-11 bytes gracias a Mathmandan

-7 bytes gracias a ArBo

Prueba matemática de validez

Uso de la indexación 0 en aras de esta prueba, a pesar de que la convención matemática está indexada en 1.

  • Deje ser el º número GryphonGnn
  • Sea (El número de grifo de y )g(a,x)=a+a2+...+axax
  • Sea el conjunto de todos los números de Gryphon donde yAn2an+22xn+2
  • Sabemos queA0={g(2,2)}={6}={G0}
  • An+1={g(a,x),g(a+1,x),g(a,x+1),g(a+1,x+1)|g(a,x)An}
  • g(a+1,x)<g(a+1,x+1) para todos yax
  • g(a,x+1)<g(a+1,x+1) para todos yax
  • Por lo tanto, siGn+1g(a+1,x+1)Gn=g(a,x)
  • g(a+1,x)<g(a+2,x) para todos yax
  • g(a,x+1)<g(a,x+2) para todos yax
  • Por lo tanto, debe ser o si ya que no existen otras posibilidades.Gn+1g(a+1,x)g(a,x+1)Gn=g(a,x)
  • Podemos usar esta información para concluir que siGn+1An+1GnAn
  • Como sabemos que , podemos usar esta regla para inducir que para todos losG0A0GnAnn
  • Como esto se puede aplicar de a , debe estar en el índice de si se ordena de menor a mayorG0GnGnnAnAn
Carne de res
fuente
f=es innecesario y lambda n,r=range:ahorrará 4 más ( como así )
Jonathan Allan
Puede soltar el set()y sustituirla por una comprensión de conjunto para llegar a 89
Arbo
Además, puede eliminarlo del f=enlace TIO poniéndolo en el encabezado, como en el TIO de mi 89-byter
ArBo
86 bytes con Python 3.8 y expresiones de asignación
ovs
En la línea "Por lo tanto, Gn + 1 ≠ (a + 1, x + 1) si Gn = g (a, x)" es un error, debería ser Gn + 1 ≠ g (a + 1, x + 1) si ...
IQuick 143
5

J , 35 32 bytes

-3 bytes gracias a FrownyFrog

3 :'y{/:~~.,}.+/\(^~/>:)1+i.y+2'

Pruébalo en línea!

La explicación es la misma que la original. Simplemente usa la forma explícita para guardar los bytes al eliminar el múltiplo @.

respuesta original, tácita, con explicación: 35 bytes

{[:/:~@~.@,@}.[:+/\@(^~/>:)1+i.@+&2

Pruébalo en línea!

Similar al enfoque de Luis Mendo, creamos una "tabla de potencia" (como una tabla de tiempos) con la fila superior 2 3 ... ny la columna izquierda que 1 2 ... nresultan en:

 2   3    4     5     6      7
 4   9   16    25    36     49
 8  27   64   125   216    343
16  81  256   625  1296   2401
32 243 1024  3125  7776  16807
64 729 4096 15625 46656 117649

^~/ >:crea la tabla, y 1+i.@+&2crea las 1... nsecuencias, y agregamos 2 ( +&2) a la entrada para asegurarnos de que siempre tengamos suficientes elementos para crear una tabla, incluso para 0 o 1 entradas.

Después de tener la tabla de arriba, la solución es trivial. Simplemente escaneamos la suma de las filas +/\, y luego eliminamos la primera fila, aplanamos, tomamos únicos y ordenamos /:~@~.@,@}.. Finalmente {usa la entrada original para indexar ese resultado, produciendo la respuesta.

Jonás
fuente
notación explícita ahorra 3
FrownyFrog
gracias, buena captura
Jonás
3

R , 65 62 bytes

-1 byte gracias a Giuseppe.

n=scan();unique(sort(diffinv(t(outer(2:n,1:n,"^")))[3:n,]))[n]

Pruébalo en línea!

1 indexado.

aix=1

Tenga en cuenta que sort(unique(...))no funcionaría, ya uniqueque daría filas únicas de la matriz y no entradas únicas. Usar unique(sort(...))obras porque se sortconvierte en vector.

Robin Ryder
fuente
Se necesita un poco más de trabajo, pero usar ty diffinves de 64 bytes
Giuseppe
1
@Giuseppe Gracias! No sabía diffinv. Golfé otros 2 bytes reemplazando [-1:-2,]con [3:n,].
Robin Ryder
2

JavaScript (ES7), 76 bytes

1 indexado.

f=(n,a=[i=2])=>(n-=a.some(j=>a.some(k=>(s+=j**k)==i,s=j)))?f(n,[...a,++i]):i

Pruébalo en línea!


JavaScript (ES7), 89 bytes

1 indexado.

n=>eval('for(a=[i=1e4];--i>1;)for(s=1e8+i,x=1;a[s+=i**++x]=x<26;);Object.keys(a)[n]-1e8')

Pruébalo en línea!

Arnauld
fuente
1

Carbón , 36 bytes

NθFθFθ⊞υ÷⁻X⁺²ι⁺³κ⁺²ι⊕ιF⊖θ≔Φυ›κ⌊υυI⌊υ

Pruébalo en línea! El enlace es a la versión detallada del código. 1 indexado. Utiliza el algoritmo de Luis Mendo. Explicación:

Nθ

n

FθFθ⊞υ

nn

÷⁻X⁺²ι⁺³κ⁺²ι⊕ι

1xai=ax+1aa1

F⊖θ≔Φυ›κ⌊υυ

Elimina los más bajosn1

I⌊υ

Imprima el número de grifo restante más bajo.

Neil
fuente
1

Japt , 23 bytes

Querido Jebus! ¡O realmente he olvidado cómo jugar golf o el alcohol finalmente está pasando factura!

No es un puerto directo de la solución de Jonathan, pero está muy inspirado por su observación.

@ÈÇXìZ mÉ ìZÃeÄ}fXÄ}gNÅ

Intentalo

Lanudo
fuente
1

05AB1E , 12 bytes

L¦ãε`LmO}êIè

0 indexado

n

Explicación:

L             # Create a list in the range [1, (implicit) input-integer]
              #  i.e. 4 → [1,2,3,4]
 ¦            # Remove the first item to make the range [2, input-integer]
              #  i.e. [1,2,3,4] → [2,3,4]
  ã           # Create each possible pair of this list by using the cartesian product
              #  i.e. [2,3,4] → [[2,2],[2,3],[2,4],[3,2],[3,3],[3,4],[4,2],[4,3],[4,4]]
   ε          # Map each pair to:
    `         #  Push the values of the pair separately to the stack
              #   i.e. [4,3] → 4 and 3
     L        #  Take the list [1, value] for the second value of the two
              #   i.e. 3 → [1,2,3]
      m       #  And then take the first value to the power of each integer in this list
              #   i.e. 4 and [1,2,3] → [4,16,64]
       O      #  After which we sum the list
              #   i.e. [4,16,64] → 84
            # After the map: uniquify and sort the values
              #  i.e. [6,14,30,12,39,120,20,84,340] → [6,12,14,20,30,39,84,120,340]
          Iè  # And index the input-integer into it
              #  i.e. [6,12,14,20,30,39,84,120,340] and 4 → 30
              # (after which the result is output implicitly)
Kevin Cruijssen
fuente