Factorizarlo! …mal

15

Un niño curioso utiliza un programa que puede factorizar un número o una expresión en la forma siguiente: p1^e1 * p2^e2 * ... * pn^en. Los exponentes iguales a 1se omiten, por ejemplo360 = 2^3 * 3^2 * 5

El niño escribe esta salida en el programa como una nueva entrada, pero no entiende el ^signo, por lo que a veces omite uno o más de los que concatenan la base principal y el exponente correspondientes. P.ej(360 =) 2^3 * 3^2 * 5 => 2^3 * 32 * 5 (= 1280)

Debido a estos errores, puede obtener una factorización diferente que puede ingresar nuevamente (omitiendo 0 o más ^). Repite el proceso hasta que la factorización ya no cambie (tal vez no haya más ^o haya copiado la salida correctamente).

Debería escribir un programa o función que, dado un número entero n( n>1), muestre todos los números posibles en orden creciente cuya factorización podría ser aquella con la que terminó el niño (incluido n). Por ejemplo, para la entrada 16las posibles factorizaciones finales son(16 =) 2^4, (24 =) 2^3 * 3, (23*3 =) 3 * 23

Detalles de entrada:

  • la entrada es un número entero más grande que 1
  • no se dará ninguna entrada que genere un número de salida mayor que 2^31-1
  • no se dará ninguna entrada que genere más que 1000números de salida

Detalles de salida:

  • una lista de enteros en una forma conveniente para su idioma

Ejemplos:

Entrada => Salida

11    => 11
16    => 16 24 69
360   => 140 360 770 1035 1219 1280 2875 3680
605   => 560 605 840 2415
2048  => 211 2048
58564 => 230 456 1311 2508 9975 12768 13794 20748 58564 114114 322102

Este es el código de golf, por lo que gana el programa más corto.

randomra
fuente
¿No tenemos ya Factorizarlo?
Optimizador del
55
@Optimizer Esto es bastante diferente.
randomra
1
El último número para 360 debe ser 3 6 80: 2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange
@blutorange Gracias, editado.
randomra

Respuestas:

5

CJam - 66

ria{_{:XmF{1=1>},La\{a1$\f++}/La-{XI{~#}%:*/I{si}%:**}fI}%|}1e3*$p

Pruébalo en http://cjam.aditsu.net/

Explicación:

ria                       read token, convert to integer and wrap in array
{…}1e3*                   repeat 1000 times
    _                     duplicate array
    {…}%                  transform each array item (number) using the block
        :X                store the number in X
        mF                factorize with exponents
        {1=1>},           keep only the factors with exponent > 1
        La\{a1$\f++}/     get all the subsets (*)
        La-               remove the empty subset
        {…}fI             for I = each subset of prime factors with exponent > 1
            XI{~#}%:*/    divide X by all the factors in I
            I{si}%:**     multiply with the primes from I
                          concatenated with their exponents
    |                     add the new numbers to the array, removing duplicates
$                         sort
p                         print the final array

(*) Gracias Martin

aditsu
fuente
cjam código del dios cjam
kaine
Cualquier cantidad de ^'s podría eliminarse en un solo paso. Entonces, para 58564 = 2^2 * 11^4poder generar 2508 = 22 * 114.
randomra
@randomra deberías agregar un ejemplo para este tipo de cosas
aditsu
@randomra debería ser mejor ahora
aditsu
¡Excelente! Se agregó el ejemplo. Perdón por omitirlo.
randomra
4

Rubí, 219

Para comenzar esto:

s=->(x){A=[];def k(x)A<<x
y=Prime.prime_division x;n=0..y.size-1
n.each{|i|n.to_a.combination(i+1).each{|c|c.each{|z|v=y.dup
v[z][1]>1?v[z]=[v[z].join.to_i,1]:next
k v.inject(1){|s,b|s*b[0]**b[1]}}}}end;k x;A.uniq.sort}

Crea una función que devuelve una Matriz de números.

https://ideone.com/iOMGny

Úselo así:

#usage

#load from the standard library
require"prime"

#read from stdin and print to stdout
p s.call $<.read.to_i

Muy divertido escribir todo esto en un teléfono móvil ...

blutorange
fuente
3

Perl, 193 bytes

sub R{my($k,$v,@z)=@_;map{$k**$v*$_,$v>1?($k.$v)*$_:()}@z?R(@z):1}
@q=(0+<>);
while($x=pop@q){
my%f;@r=sort{$a<=>$b}@r,$x;
for(2..$x){$x/=$_,$f{$_}++while$x%$_<1}
$_~~@r||push@q,$_ for R%f
}
print"@r"

Se acaban de agregar nuevas líneas para facilitar la lectura.

El bucle for factoriza el siguiente número ( $x) en un hash ( %f) de primos y potencias. La función recursiva ( R) utiliza este hash para generar todos los números que se pueden obtener al eliminar los ^signos. Estos números se agregan a una cola (@q ), y el proceso se repite con el ciclo while externo. Cada número de la cola también se mantiene en una matriz única y ordenada ( @r) para imprimir.

grc
fuente
3

Pyth, 46 45 44

Su{smmu*/N^T/PdTv+`T`/PdTkdyft/PdT{PdGU^T3]Q

Pruébalo aquí.

Arreglado el múltiple ^ corrigió error . Por ejemplo:

Input:  58564
Output: [230, 456, 1311, 2508, 9975, 12768, 13794, 20748, 58564, 114114, 322102]

Tenga en cuenta que este código se basa en un par de correcciones de errores en el compilador oficial que se enviaron después de la pregunta. Sin embargo, no utiliza ninguna función de lenguaje nueva.

isaacg
fuente
¿Qué obtienes por 58564?
aditsu
[230, 456, 1311, 58564, 322102], lo cual está mal.
isaacg
@aditsu Se solucionó el problema.
isaacg
Como Pyth no está rigurosamente documentado (según mis hallazgos), es difícil distinguir entre las correcciones de errores y las nuevas características, así que decidí no elegir esta entrada como la respuesta ganadora.
randomra
@randomra Entiendo tu decisión de no aceptar esta respuesta. Sin embargo, me gustaría mencionar cuál fue la corrección de errores: uera imposible usar un reduce ( ) dentro de otro reducir. Cambié un 2 a un 3 en la ubicación adecuada para que reducir tomara 3 entradas en lugar de 2. Eso es todo.
isaacg