Salida de la secuencia de Goodstein

18

(Esto puede ser bastante clásico, pero esta es mi primera publicación aquí, así que todavía no estoy listo para las cosas elegantes)

La secuencia de Goodstein se define para un número de entrada de la siguiente manera:

Elija un número inicial n , deje b = 2 y repita:

  • de escritura n en la base de heriditary b notación
  • sustituya todos los ( b ) sa ( b +1) s en ny reste 1
  • generar la nueva evaluación decimal de n
  • incremento b

La notación de base hereditaria es una descomposición de un número donde la base es el número más grande que aparece. Ejemplos:

  • 83 en HB3: 3^(3+1)+2
  • 226 en HB2: 2^(2^(2+1))+2^(2+1)+2

Las secuencias de Goodstein siempre terminan en 0 , pero primero tienden a crecer bastante rápido, por lo que no se le pide que muestre la secuencia completa.


Tarea:

Dado un número de entrada en cualquier formato razonable, su trabajo es generar la secuencia de Goodstein para este número al menos hasta que llegue a 10 ^ 25 o 0

Ejemplos:

Input: 3
Output: 3, 3, 3, 2, 1, 0
Input: 13
Output: 13, 108, 1279, 16092, 280711, 5765998, 134219479, 3486786855, 100000003325, 3138428381103, 106993205384715, 3937376385706415, 155568095557821073, 6568408355712901455, 295147905179352838943, 14063084452067725006646, 708235345355337676376131, 37589973457545958193377292
Input: 38
Output: 38, 22876792454990

Detalles:

  • El número de entrada puede ser una matriz, una cadena, un entero, siempre que esté en base decimal
  • La salida sigue la misma regla
  • La separación de los términos en la salida puede ser espacios, líneas nuevas o cualquier separación razonable
  • Tan pronto como la secuencia sea mayor de 10 ^ 25, su programa puede salir normalmente, generar un error / excepción o continuar (sin restricción)
  • Este es el , por lo que gana la respuesta más corta (en bytes)
  • Por supuesto, las lagunas estándar están prohibidas
  • Ejemplo de trabajo de Python sin golfista aquí
Ocupado
fuente
2
¿Podría agregar un caso de prueba paso a paso?
Rod
55
Bienvenido a PPCG! ¡Buen primer desafío!
FantaC
2
@ ØrjanJohansen Sí, el error es que int(q/base.b), q%base.bdebe ser q//base.b, q%base.b(o simplemente divmod(q, base.b)) para evitar errores de punto flotante.
Anders Kaseorg
2
¿Significa "al menos hasta que llegue a 10 ^ 25 o 0" significa que el programa puede continuar después de llegar a 0 (presumiblemente con −1, −2, −3, ...)?
Anders Kaseorg

Respuestas:

3

Pyth , 28 26 bytes

.V2JbL&bs.e*^hJykb_jbJ=ty

La nueva línea final es significativa.

Pruébalo en línea! (Este enlace incluye un extra que Qno necesita la versión actual de Pyth).

Cómo funciona

.V2JbL&bs.e*^hJykb_jbJ=ty
.V2                          for b in [2, 3, 4, ...]:
   Jb                          assign J = b
     L                         def y(b):
      &b                         b and
                   jbJ             convert b to base J
                  _                reverse
         .e                        enumerated map for values b and indices k:
             hJ                      J + 1
            ^  yk                    to the power y(k)
           *     b                   times b
(newline)                      print Q (autoinitialized to the input)
                        y      y(Q)
                       t       subtract 1
                      =        assign back to Q

Es importante que yse redefina en cada iteración de bucle para evitar la memorización de los cambios en la variable global J.

Anders Kaseorg
fuente
3

Haskell , 77 bytes

(&2)es una función anónima que toma Integery devuelve una lista (potencialmente muy larga) de Integers, use as (&2) 13.

(&2)
n&b|n<0=[]|let _?0=0;e?n=(e+1)?div n b+mod n b*(b+1)^0?e=n:(0?n-1)&(b+1)

Pruébalo en línea! (corta a 10^25)

Cómo funciona

  • (&2)comienza la secuencia con base 2.
  • n&bcalcula la subsecuencia comenzando con el número ny la base b.
    • Se detiene con una lista vacía si n<0, que generalmente sucede el paso siguiente n==0.
    • De lo contrario, antecede na la lista devuelta recursivamente por la expresión (0?n-1)&(b+1).
  • ?es un operador de función local. 0?nda el resultado de convertir na base hereditaria b, luego incrementa la base en todas partes.
    • La conversión se repite con la variable de eseguimiento del exponente actual. e?nConvierte el número n*b^e.
    • La recursión se detiene con 0cuandon==0 .
    • De lo contrario, se divide npor la base b.
      • (e+1)?div n b maneja la recursividad para el cociente y el siguiente exponente más alto.
      • mod n b*(b+1)^0?emaneja el resto (que es el dígito correspondiente al exponente actual e), el incremento de base y la conversión hereditaria del exponente actual con 0?e.
Ørjan Johansen
fuente