Fatorize-o! …seriamente

15

Um garoto curioso usa um programa que pode fatorar um número ou uma expressão na seguinte forma: p1^e1 * p2^e2 * ... * pn^en. Os expoentes iguais a 1são omitidos, por exemplo360 = 2^3 * 3^2 * 5

A criança digita essa saída no programa como uma nova entrada, mas ela não entende o ^sinal; por vezes, ignora um ou mais daqueles que concatenam a base principal e o expoente correspondentes. Por exemplo(360 =) 2^3 * 3^2 * 5 => 2^3 * 32 * 5 (= 1280)

Devido a esses erros, ela pode obter uma fatoração diferente, que pode inserir novamente (com o pulo de 0 ou mais ^). Ela repete o processo até que a fatoração não mude mais (talvez não exista mais ^ou ela copiou a saída corretamente).

Você deve escrever um programa ou função que, dado um número inteiro n( n>1), produza todos os números possíveis em ordem crescente, cuja fatoração pode ser aquela com a qual o garoto terminou (inclusive n). Por exemplo, para entrada, 16as possíveis fatorações finais são(16 =) 2^4, (24 =) 2^3 * 3, (23*3 =) 3 * 23

Detalhes da entrada:

  • entrada é um único inteiro maior que 1
  • nenhuma entrada será fornecida, o que gera um número de saída maior que 2^31-1
  • nenhuma entrada será fornecida, o que gera mais do que 1000números de saída

Detalhes da saída:

  • uma lista de números inteiros de forma conveniente para o seu idioma

Exemplos:

Entrada => Saída

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 é o código-golfe, e o programa mais curto vence.

randomra
fonte
Já não temos Factorize It?
Optimizer
5
@ Otimizador Isso é bem diferente.
Aleatório
1
O último número para 360 deve ser 3 6 80: 2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange
@blutorange Obrigado, editado.
randomra

Respostas:

5

CJam - 66

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

Experimente em http://cjam.aditsu.net/

Explicação:

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

(*) Obrigado Martin

aditsu
fonte
código cjam do deus cjam
kaine
Qualquer quantidade de ^'s pode ser removida em uma etapa. Então, para 58564 = 2^2 * 11^4isso deve ser capaz de gerar 2508 = 22 * 114.
randomra
@randomra você deve adicionar um exemplo para este tipo de coisa
aditsu
@randomra deveria ser melhor agora
aditsu
Ótimo! Adicionado o exemplo. Desculpe por ignorá-lo.
randomra
4

Ruby, 219

Para começar isso:

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}

Cria uma função s retornando uma matriz de números.

https://ideone.com/iOMGny

Use-o assim:

#usage

#load from the standard library
require"prime"

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

Tão divertido escrever isso tudo isso em um celular ...

blutorange
fonte
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"

Novas linhas são adicionadas apenas para facilitar a leitura.

O loop for fatoriza o próximo número ( $x) em um hash ( %f) de primos e potências. A função recursiva ( R) usa esse hash para gerar todos os números que poderiam ser obtidos com a remoção de ^sinais. Esses números são adicionados a uma fila ( @q) e o processo é repetido pelo loop while externo. Cada número da fila também é mantido em uma matriz classificada exclusiva ( @r) para impressão.

grc
fonte
3

Pyth, 46 45 44

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

Experimente aqui.

Corrigido o ^erro múltiplo . Por exemplo:

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

Observe que esse código depende de algumas correções no compilador oficial que foram enviadas após a pergunta. No entanto, ele não usa nenhum novo recurso de idioma.

isaacg
fonte
O que você ganha pelo 58564?
aditsu
[230, 456, 1311, 58564, 322102], o que está errado.
Isaacg
@aditsu Corrigido o problema.
Isaacg
Como Pyth não é rigorosamente documentado (com base nas minhas descobertas), é difícil distinguir entre correções de erros e novos recursos, por isso decidi não escolher essa entrada como a resposta vencedora.
randomra
@ randomra Entendo sua decisão de não aceitar esta resposta. No entanto, gostaria apenas de mencionar qual era o bugfix: Usar um reduzem ( u) dentro de outro reduz era impossível. Mudei um 2 para um 3 no local apropriado, de modo que a redução levaria 3 entradas em vez de 2. Isso é tudo.
Isaacg