Faktoryzuj to! …źle

15

Ciekawy dziecko wykorzystuje program, który może na czynniki liczbę lub wyrażenie do następującej postaci: p1^e1 * p2^e2 * ... * pn^en. Wykładniki równe 1są pomijane np360 = 2^3 * 3^2 * 5

Dziecko wpisuje te dane wyjściowe do programu jako nowe dane wejściowe, ale nie rozumie ^znaku, więc czasami pomija jedną lub więcej z tych, które łączą odpowiednią bazę pierwszą i wykładnik. Na przykład(360 =) 2^3 * 3^2 * 5 => 2^3 * 32 * 5 (= 1280)

Z powodu tych błędów może otrzymać inną faktoryzację, którą może wprowadzić ponownie (pomijając 0 lub więcej ^). Powtarza ten proces, dopóki faktoryzacja już się nie zmieni (być może już go nie ma ^lub poprawnie skopiowała dane wyjściowe).

Powinieneś napisać program lub funkcję, która podając liczbę całkowitą n( n>1) wypisuje wszystkie możliwe liczby w kolejności rosnącej, których faktoryzacją może być ta, z którą skończyło się dziecko (w tym n). Np. Dla danych wejściowych 16możliwe są ostateczne faktoryzacje(16 =) 2^4, (24 =) 2^3 * 3, (23*3 =) 3 * 23

Dane wejściowe:

  • wejście jest jedną liczbą całkowitą większą niż 1
  • nie zostaną podane dane wejściowe, które wygenerują liczbę wyjściową większą niż 2^31-1
  • nie zostaną podane dane wejściowe, które generują więcej niż 1000liczby wyjściowe

Dane wyjściowe:

  • lista liczb całkowitych w wygodnej formie dla twojego języka

Przykłady:

Dane wejściowe => Dane wyjściowe

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

To jest golf golfowy, więc wygrywa najkrótszy program.

randomra
źródło
Czy nie mamy już faktoryzacji?
Optymalizator
5
@Optimizer To jest zupełnie inne.
randomra
1
Ostatnia liczba dla 360 powinna wynosić 3 6 80: 2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange
@blutorange Dzięki, edytowane.
randomra

Odpowiedzi:

5

CJam - 66

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

Wypróbuj na http://cjam.aditsu.net/

Wyjaśnienie:

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

(*) Dzięki Martin

aditsu zrezygnowało, ponieważ SE jest ZŁEM
źródło
kod cjam od boga
cjam
Każda ilość ^może być usunięta w jednym kroku. Dlatego 58564 = 2^2 * 11^4powinien móc generować 2508 = 22 * 114.
randomra
@randomra powinieneś dodać przykład tego rodzaju
aditsu przestało, ponieważ SE to ZŁO
@andandra powinna być teraz lepsza
aditsu zrezygnowało, ponieważ SE jest ZŁEM
Świetny! Dodano przykład. Przepraszamy za pominięcie tego.
randomra
4

Ruby, 219

Aby rozpocząć to:

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}

Tworzy funkcję zwracającą tablicę liczb.

https://ideone.com/iOMGny

Użyj tego w ten sposób:

#usage

#load from the standard library
require"prime"

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

Tyle radości, pisząc to wszystko na telefonie komórkowym ...

blutorange
źródło
3

Perl, 193 bajtów

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"

Nowe linie zostały właśnie dodane dla czytelności.

Pętla for rozkłada następną liczbę ( $x) na hasz ( %f) liczb pierwszych i potęg. Funkcja rekurencyjna ( R) używa tego skrótu do generowania wszystkich liczb, które można uzyskać poprzez usunięcie ^znaków. Liczby te są dodawane do kolejki ( @q), a proces jest powtarzany przez zewnętrzną pętlę while. Każda liczba z kolejki jest również przechowywana w unikalnej, posortowanej tablicy ( @r) do drukowania.

grc
źródło
3

Pyth, 46 45 44

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

Wypróbuj tutaj.

Naprawiono wielokrotny ^błąd. Na przykład:

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

Zauważ, że ten kod opiera się na kilku poprawkach błędów w oficjalnym kompilatorze, które zostały wypchnięte po zadaniu pytania. Jednak nie korzysta z żadnych nowych funkcji językowych.

isaacg
źródło
Co dostajesz za 58564?
Aditsu zostało zakończone, ponieważ SE to EVIL
[230, 456, 1311, 58564, 322102], co jest błędne.
isaacg
@aditsu Naprawiono problem.
isaacg
Ponieważ Pyth nie jest rygorystycznie udokumentowany (na podstawie moich ustaleń), trudno jest odróżnić poprawki błędów od nowych funkcji, dlatego postanowiłem nie wybierać tego wpisu jako zwycięskiej odpowiedzi.
randomra
@randomra Rozumiem twoją decyzję o nieprzyjęciu tej odpowiedzi. Chciałbym jednak tylko wspomnieć, co to była poprawka: użycie redukcji ( u) w innej redukcji nie było możliwe. Zmieniłem 2 na 3 w odpowiedniej lokalizacji, aby redukcja wymagała 3 danych wejściowych zamiast 2. To wszystko.
isaacg