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.


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


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 ...


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.


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.



[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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.