Fattorizzalo! …male


15

Un ragazzo curioso utilizza un programma che può fattorizzare un numero o un'espressione nella forma seguente: p1^e1 * p2^e2 * ... * pn^en. Gli esponenti uguali a 1sono omessi ad es360 = 2^3 * 3^2 * 5

La bambina digita questo output nel programma come nuovo input ma non capisce il ^segno, quindi a volte salta uno o più di quelli che concatenano la corrispondente base-base ed esponente. Per esempio(360 =) 2^3 * 3^2 * 5 => 2^3 * 32 * 5 (= 1280)

A causa di questi errori potrebbe avere una diversa fattorizzazione che può inserire nuovamente (saltando 0 o più ^). Ripete il processo fino a quando la fattorizzazione non cambia più (forse non ce ne sono più ^o ha copiato correttamente l'output).

Dovresti scrivere un programma o una funzione che fornisca un numero intero n( n>1) genera tutti i numeri possibili in ordine crescente la cui fattorizzazione potrebbe essere quella con cui il bambino ha finito (incluso n). Ad esempio per l'input sono 16possibili fattorizzazioni finali(16 =) 2^4, (24 =) 2^3 * 3, (23*3 =) 3 * 23

Dettagli di input:

  • l'input è un singolo intero più grande di 1
  • non verrà fornito alcun input che generi un numero di output maggiore di 2^31-1
  • non verrà fornito alcun input che generi più 1000numeri di output

Dettagli di uscita:

  • un elenco di numeri interi in una comoda forma per la tua lingua

Esempi:

Input => Output

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

Si tratta di code-golf, quindi vince il programma più breve.


Non abbiamo già Factorize It?
Ottimizzatore

5
@Optimizer Questo è abbastanza diverso.
randomra,

1
L'ultimo numero per 360 dovrebbe essere 3 6 80: 2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange

@blutorange Grazie, a cura.
randomra,

Risposte:


5

CJam - 66

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

Provalo su http://cjam.aditsu.net/

Spiegazione:

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

(*) Grazie Martin


codice cjam dal dio
cjam

Qualsiasi quantità di ^'s potrebbe essere rimossa in un solo passaggio. Quindi 58564 = 2^2 * 11^4, dovrebbe essere in grado di generare 2508 = 22 * 114.
randomra,

@randomra dovresti aggiungere un esempio per questo tipo di cose
aditsu,

@randomra dovrebbe essere migliore ora
aditsu,

Grande! Aggiunto l'esempio. Ci scusiamo per averlo saltato.
randomra,

4

Ruby, 219

Per iniziare:

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 funzione restituendo una matrice di numeri.

https://ideone.com/iOMGny

Usalo in questo modo:

#usage

#load from the standard library
require"prime"

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

È così divertente scrivere tutto questo su un telefono cellulare ...


3

Perl, 193 byte

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"

Le nuove righe vengono appena aggiunte per la leggibilità.

Il ciclo for fattorizza il numero successivo ( $x) in un hash ( %f) di numeri primi e poteri. La funzione ricorsiva ( R) usa questo hash per generare tutti i numeri che potrebbero essere raggiunti rimuovendo i ^segni. Questi numeri vengono aggiunti a una coda ( @q) e il processo viene ripetuto dal ciclo while esterno. Ogni numero della coda viene inoltre conservato in un array univoco, ordinato ( @r) per la stampa.


3

Pyth, 46 45 44

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

Provalo qui.

Risolto il ^bug multiplo . Per esempio:

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

Si noti che questo codice si basa su un paio di correzioni di bug del compilatore ufficiale che sono state inviate dopo che è stata posta la domanda. Tuttavia, non utilizza alcuna nuova funzionalità linguistica.


Cosa ottieni per 58564?
aditsu,

[230, 456, 1311, 58564, 322102], che è sbagliato.
isaacg,

@aditsu Risolto il problema.
Isacco

Poiché Pyth non è rigorosamente documentato (in base alle mie scoperte), è difficile distinguere tra correzioni di bug e nuove funzionalità, quindi ho deciso di non scegliere questa voce come risposta vincente.
randomra,

@randomra Capisco la tua decisione di non accettare questa risposta. Tuttavia, vorrei solo menzionare quale fosse il bugfix: usare un riduttore ( u) all'interno di un altro riduttore era impossibile. Ho cambiato un 2 in un 3 nella posizione appropriata in modo che la riduzione richiederebbe 3 input invece di 2. Questo è tutto.
isaacg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.