Un juego de factorización

13

Entrada

Un solo entero .1x1015

Salida

El número máximo de enteros positivos distintos que tienen el producto .x

Ejemplos

Entrada: 1099511627776. Salida: 9. Una posible lista óptima de factores es: (1, 2, 4, 8, 16, 32, 64, 128, 4096).

Entrada: 127381. Salida 4. Una posible lista óptima de factores es: (1, 17, 59, 127).

Relacionado con esta vieja pregunta .

Anush
fuente
99
¿Podría agregar algunos casos de prueba más? (Preferiblemente de tamaño razonable.)
Arnauld
8
Teniendo en cuenta sus comentarios sobre la mayoría de las respuestas: si está buscando un código eficiente, esto definitivamente no debe etiquetarse como code-golf. Puede considerar cualquiera fastest-codeo fastest-algorithmpara un próximo desafío. Si realmente desea que todas las respuestas funcionen en un tiempo limitado dentro del rango especificado, debería haber sido mencionado explícitamente. (Y hubiera recomendado un rango más pequeño para que no entre en conflicto por code-golfcompleto).
Arnauld,
@Arnauld No, tengo cuidado de que sea code-golf y nadie es juzgado por eso. Sería genial si el código pudiera ejecutarse para los rangos de entrada especificados.
Anush
1
Porque x=1, 2, ...consigo f(x)=1, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 3, 3, 2, 4, 2, 3, 3, 3, 2, 4, 2, 3, 3, 3, 3, 4, 2, 3lo que no encuentro en OEIS. Está suficientemente claro que aparecerán registros para números factoriales x. Por ejemplo, el más pequeño xque f(x)=13será 13!. Supongo que fdepende solo de los exponentes de la factorización prima. Entonces para encontrar f(13^4*19^7*29^2)podríamos simplificar f(2^7*3^4*5^2).
Jeppe Stig Nielsen

Respuestas:

5

Wolfram Language (Mathematica) , 52 bytes

Max[Length/@Cases[Subsets@Divisors@#,{a__}/;1a==#]]&

Pruébalo en línea!

4 bytes guardados gracias a @attinat

Aquí también hay una versión de 153 bytes que calcula 1099511627776y10^15

Max[Length/@Table[s=RandomSample@Flatten[Table@@@FactorInteger[#]];Last@Select[Times@@@TakeList[s,#]&/@IntegerPartitions@Length@s,DuplicateFreeQ],5!]]+1&      

Pruébalo en línea!

El resultado para 10^15es 12

{1, 2, 4, 5, 10, 16, 25, 40, 50, 100, 125, 250}

J42161217
fuente
Se bloquea con 1099511627776
Anush
77
@ Anush No se bloquea. Solo necesita memoria. No dijiste nada sobre las limitaciones de memoria. Este es el código de golf
J42161217
Si, me doy cuenta. Sería bueno si realmente pudiera ejecutar el código de los rangos de entrada especificados en la pregunta.
Anush
66
@Anush Este es el código de golf. No son buenas respuestas. Por favor especifique sus criterios. Una respuesta es válida o no. Creo que el problema aquí es la pregunta ... Tal vez debería cambiarlo al "algoritmo más suficiente"
J42161217
3
@Anush Hice una edición en mi respuesta y agregué una versión más que es realmente rápida y eficiente en caso de que desee verificarla
J42161217
3

05AB1E , 9 bytes

Muy ineficiente Tiempo de espera en TIO para números con una gran cantidad de divisores.

ÑæʒPQ}€gZ

Pruébalo en línea!

Explicación

Ñ          # push a list of divisors of the input
 æ         # push the powerset of that list
  ʒPQ}     # filter, keep only the lists whose product is the input
      €g   # get the length of each
        Z  # take the maximum
Emigna
fuente
Su código TIO parece generar 3 en lugar de 9.
Anush
@Anush: es un número diferente al de su ejemplo (ya que se agota debido a muchos factores). Probablemente debería usar un ejemplo más distinto.
Emigna
€gZes un poco más eficiente que éθgpara el mismo bytecount.
Grimmy
@Grimy: Cierto. No hará mucha diferencia, ya que es el filtro que es el gran malo aquí, pero no está de más ser un poco más eficiente :)
Emigna
2

Perl 6 , 38 bytes

{$!=$_;+grep {$!%%$_&&($!/=$_)},1..$_}

Pruébalo en línea!

Toma el enfoque codicioso para seleccionar divisores.

Jo King
fuente
No termina con 1099511627776
Anush
66
@Anush Bueno, termina eventualmente . En general, la respuesta es válida si el algoritmo del programa funcionaría con cualquier entrada, si se le diera tanta memoria y tiempo como quisiera. Como se trata de código de golf , lo optimicé para la longitud del código, no para la complejidad algorítmica
Jo King,
2

Javascript (ES6), 39 bytes

f=(n,i=0)=>n%++i?n>i&&f(n,i):1+f(n/i,i)

Probablemente hay algunos bytes que se pueden guardar aquí y allá. Solo usa el algoritmo codicioso para los factores.

vrugtehagel
fuente
2

Jalea , 9 bytes

ŒPP=³ƊƇẈṀ

Pruébalo en línea!

-1 byte gracias a alguien

-2 bytes gracias a ErikTheOutgolfer

Hiperneutrino
fuente
Mientras preparaba una entrada para el superseeker OEIS, creé un programa Jelly probable con golfable de 11 bytes (que usa un enfoque diferente), y es poco probable que publique una respuesta Jelly, así que fingiré que obtuve un byte de su solución: ÆE×8‘½’:2S‘( funciona con el poder de la sección "fórmula" de OEIS para A003056). Descargo de responsabilidad: puede estar equivocado, pero funciona en los casos de prueba.
mi pronombre es monicareinstate
Parece que no termina con 1099511627776
Anush
@someone no funciona para 36 pero gracias
HyperNeutrino
@Anush sí, es realmente lento porque lo codifiqué, no optimizado para la eficiencia
HyperNeutrino
1
Puede eliminar ÆD, no es que haya más particiones que se crearán de esta manera, solo tomará mucho más tiempo (se agota el tiempo paraX21)
Erik the Outgolfer
2

Brachylog , 8 bytes

f;?⟨⊇×⟩l

Pruébalo en línea!

(El enfoque ingenuo {~×≠l}ᶠ⌉genera un número infinito de soluciones con 1s adicionales antes de eliminarlas y, por lo tanto, no termina realmente. Sin embargo, ¡no es un problema, ya que es para el mismo recuento de bytes!)

Toma la entrada a través de la variable de entrada y la salida a través de la variable de salida. El encabezado en TIO contiene una copia de la mayoría del código con el fin de mostrarle cuál es la lista de factores, pero esto funciona perfectamente sin él. Dado que primero se proporcionan sublistas más grandes, este predicado esencialmente hace lo mismo que la mayoría de las otras respuestas, pero sin generar y filtrar explícitamente el conjunto de potencia completo de los factores, gracias al retroceso.

            The output
       l    is the length of
    ⊇       a sublist (the largest satisfying these constraints)
f           of the factors of
            the input
 ; ⟨  ⟩     which
     ×      with its elements multiplied together
  ?         is the input.
Cadena no relacionada
fuente
1

Gaia , 10 9 bytes

Π=
dz↑⁇(l

Pruébalo en línea!

Sigue el mismo "algoritmo" que se ha visto en otra parte: filtre el conjunto de potencia del divisor durante más tiempo con un producto igual al número y devuelva su longitud.

	| helper function
Π=	| is prod(list)==n (implicit)?
	|
	| main function; implicitly takes n
dz	| divisor powerset (in decreasing order of size)
  ↑⁇	| filter by helper function
    (l	| take the first element and take the length (implicitly output)
Giuseppe
fuente
0

Almeja , 15 bytes

p}_`nq#:;qQ@s~Q

Enlace TIO próximamente (cuando dennis tire)

Básicamente un puerto de la solución 05AB1E de @ Emigna.

Explicación

                - Implicit Q = first input
p               - Print...
 }              - The last element of...
  _             - Sorted...
   `nq          - Lengths of... (map q => q.len)
           @s   - Items in powerset of
             ~Q - Proper divisors of Q
      #         - Where... (filter)
        ;q      - Product of subset
       :        - Equals...
          Q     - Q
Skidsdev
fuente
0

C # (compilador interactivo de Visual C #) , 54 bytes

int f(int n,int i=0)=>n%++i<1?1+f(n/i,i):n>i?f(n,i):0;

Utiliza el mismo enfoque que las respuestas de @ vrugtehagel y @ JoKing.

Pruébalo en línea!

Encarnación de la ignorancia
fuente
Suponiendo que implementé su lógica correctamente, una solución de 53 bytes (que no pude eliminar la palabra clave "return"): ¡ Pruébelo en línea!
mi pronombre es monicareinstate
1
@someone Gracias, pero según el meta, las funciones tienen que ser reutilizables . Además, no sé si es aceptable que las declaraciones fuera de la función omitan un punto y coma final, puede hacer una meta publicación en eso.
Encarnación de la ignorancia
0

Ruby , 34 bytes

Obviamente se agota el tiempo en ese número masivo, pero eventualmente se agota el tiempo si se le da suficiente tiempo en otra máquina.

->n{(1..n).count{|e|n%e<1?n/=e:p}}

Pruébalo en línea!

Tinta de valor
fuente