Buat faktor itu! …sangat

15

Seorang anak penasaran menggunakan sebuah program yang dapat pd nomor atau ekspresi ke dalam bentuk berikut: p1^e1 * p2^e2 * ... * pn^en. Eksponen yang sama dengan 1dihilangkan misalnya360 = 2^3 * 3^2 * 5

Anak itu mengetik output ini ke dalam program sebagai input baru tetapi dia tidak mengerti ^tanda jadi kadang-kadang dia melewatkan satu atau lebih dari mereka yang menggabungkan basis-basis dan eksponen yang sesuai. Misalnya(360 =) 2^3 * 3^2 * 5 => 2^3 * 32 * 5 (= 1280)

Karena kesalahan ini dia mungkin mendapatkan faktorisasi yang berbeda yang dapat dia masukan lagi (dengan melewatkan 0 atau lebih ^). Dia mengulangi prosesnya sampai faktorisasi tidak berubah lagi (mungkin tidak ada lagi ^atau dia menyalin hasilnya dengan benar).

Anda harus menulis sebuah program atau fungsi yang memberikan integer n( n>1) menampilkan semua angka yang mungkin dalam urutan yang meningkat yang faktorisasinya bisa menjadi faktor yang diakibatkan oleh anak tersebut (termasuk n). Misalnya untuk input 16, kemungkinan faktorisasi terakhir adalah(16 =) 2^4, (24 =) 2^3 * 3, (23*3 =) 3 * 23

Detail input:

  • input adalah bilangan bulat tunggal yang lebih besar dari 1
  • tidak ada input yang diberikan yang menghasilkan jumlah output lebih besar dari 2^31-1
  • tidak ada input yang akan diberikan yang menghasilkan lebih dari 1000angka output

Rincian keluaran:

  • daftar bilangan bulat dalam bentuk yang nyaman untuk bahasa Anda

Contoh:

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

Ini adalah kode-golf sehingga program terpendek menang.

randomra
sumber
Bukankah kita sudah memiliki faktorisasi?
Pengoptimal
5
@ Opptizer Ini sangat berbeda.
randomra
1
Angka terakhir untuk 360 adalah 3 6 80: 2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange
@blutorange Terima kasih, diedit.
randomra

Jawaban:

5

CJam - 66

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

Cobalah di http://cjam.aditsu.net/

Penjelasan:

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

(*) Terima kasih Martin

aditsu
sumber
kode cjam dari cjam god
kaine
Jumlah berapa ^pun dapat dihapus dalam satu langkah. Jadi untuk 58564 = 2^2 * 11^4itu harus bisa menghasilkan 2508 = 22 * 114.
randomra
@randomra Anda harus menambahkan contoh untuk hal seperti ini
aditsu
@randomra seharusnya lebih baik sekarang
aditsu
Bagus! Menambahkan contoh. Maaf karena melewatkannya.
randomra
4

Ruby, 219

Untuk memulai ini:

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}

Membuat fungsi s mengembalikan Array angka.

https://ideone.com/iOMGny

Gunakan seperti ini:

#usage

#load from the standard library
require"prime"

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

Sangat menyenangkan menulis ini semua ini di ponsel ...

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

Baris baru ditambahkan untuk keterbacaan.

Untuk loop memfaktorkan angka berikutnya ( $x) ke dalam hash ( %f) dari bilangan prima dan kekuatan. Fungsi rekursif ( R) menggunakan hash ini untuk menghasilkan semua angka yang bisa diperoleh dengan menghilangkan ^tanda. Angka-angka ini ditambahkan ke antrian ( @q), dan proses ini diulangi oleh loop while luar. Setiap nomor dari antrian juga disimpan dalam array yang unik, diurutkan ( @r) untuk dicetak.

grc
sumber
3

Pyth, 46 45 44

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

Coba di sini.

Memperbaiki beberapa ^bug. Contohnya:

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

Perhatikan bahwa kode ini bergantung pada beberapa perbaikan bug ke kompiler resmi yang didorong setelah pertanyaan diajukan. Namun, itu tidak menggunakan fitur bahasa baru.

isaacg
sumber
Apa yang Anda dapatkan untuk 58564?
aditsu
[230, 456, 1311, 58564, 322102], yang salah.
isaacg
@aditsu Memperbaiki masalah.
isaacg
Karena Pyth tidak didokumentasikan secara ketat (berdasarkan temuan saya), sulit untuk membedakan antara perbaikan bug dan fitur baru jadi saya memutuskan untuk tidak memilih entri ini sebagai jawaban yang menang.
randomra
@randomra Saya mengerti keputusan Anda untuk tidak menerima jawaban ini. Namun, saya hanya ingin menyebutkan apa perbaikan bug itu: Menggunakan pengurangan ( u) di dalam pengurangan lain tidak mungkin. Saya mengubah 2 ke 3 di lokasi yang sesuai sehingga mengurangi akan mengambil 3 input, bukan 2. Itu saja.
isaacg