Maksimalisasi faktor co-prime


14

Definisi

  • Dua angka adalah co-prime jika satu-satunya pembagi positifnya adalah 1.
  • Daftar angka adalah saling co-prime jika setiap pasangan angka dalam daftar itu adalah co-prime satu sama lain.
  • Faktorisasi angka nadalah daftar angka yang produknya n.

Tugas

Diberikan angka positif n, hasilkan faktorisasi nbersama yang sama dengan panjang maksimum yang tidak termasuk 1.

Contoh

Sebab n=60, jawabannya adalah [3,4,5], karena 3*4*5=60dan tidak ada faktorisasi co-prime yang saling lain tanpa 1memiliki panjang lebih besar dari atau sama dengan 3, panjang faktorisasi.

Aturan dan kebebasan

  • Anda dapat menggunakan format input / output yang masuk akal.
  • Entri dalam daftar output tidak perlu disortir.

Testcases

n   output
1   []
2   [2]
3   [3]
4   [4]
5   [5]
6   [2, 3]
7   [7]
8   [8]
9   [9]
10  [2, 5]
11  [11]
12  [3, 4]
13  [13]
14  [2, 7]
15  [3, 5]
16  [16]
17  [17]
18  [2, 9]
19  [19]
20  [4, 5]
21  [3, 7]
22  [2, 11]
23  [23]
24  [3, 8]
25  [25]
26  [2, 13]
27  [27]
28  [4, 7]
29  [29]
30  [2, 3, 5]
31  [31]
32  [32]
33  [3, 11]
34  [2, 17]
35  [5, 7]
36  [4, 9]
37  [37]
38  [2, 19]
39  [3, 13]
40  [5, 8]
41  [41]
42  [2, 3, 7]
43  [43]
44  [4, 11]
45  [5, 9]
46  [2, 23]
47  [47]
48  [3, 16]
49  [49]
50  [2, 25]
51  [3, 17]
52  [4, 13]
53  [53]
54  [2, 27]
55  [5, 11]
56  [7, 8]
57  [3, 19]
58  [2, 29]
59  [59]
60  [3, 4, 5]
61  [61]
62  [2, 31]
63  [7, 9]
64  [64]
65  [5, 13]
66  [2, 3, 11]
67  [67]
68  [4, 17]
69  [3, 23]
70  [2, 5, 7]
71  [71]
72  [8, 9]
73  [73]
74  [2, 37]
75  [3, 25]
76  [4, 19]
77  [7, 11]
78  [2, 3, 13]
79  [79]
80  [5, 16]
81  [81]
82  [2, 41]
83  [83]
84  [3, 4, 7]
85  [5, 17]
86  [2, 43]
87  [3, 29]
88  [8, 11]
89  [89]
90  [2, 5, 9]
91  [7, 13]
92  [4, 23]
93  [3, 31]
94  [2, 47]
95  [5, 19]
96  [3, 32]
97  [97]
98  [2, 49]
99  [9, 11]

Mencetak gol

Ini adalah . Jawaban terpendek dalam byte menang.




Tantangan tindak lanjut yang lebih sulit: hanya pasangan yang berdekatan dalam daftar yang dihasilkan haruslah co-prime.
Martin Ender

4
Apakah ini hanya faktorisasi menjadi kekuatan utama?
Paŭlo Ebermann

1
@ PaŭloEbermann ya, benar.
Leaky Nun

Jawaban:


10

Matematika , 24 byte

#^#2&@@@FactorInteger@#&

Cobalah online!


5
#^#2&@@@FactorInteger@#&[1]kembali {1}dalam Mathematica. Tapi itu berhasil di Matematika.
alephalpha

@alephalpha Terima kasih, bahkan tidak terpikir oleh saya untuk melihat apakah Matematika mengimplementasikan secara FactorIntegerberbeda. :)
Martin Ender

9

Brachylog , 4 byte

ḋḅ×ᵐ

Cobalah online!

Penjelasan

       # output is the list of
  ×ᵐ   # products of each
 ḅ     # block of consecutive equal elements
ḋ      # of the prime factors
       # of the input

2
Selamat atas jawaban Brachylog pertama Anda! ... setidaknya saya pikir?
Fatalkan

1
@Fatalize: My 2nd I think. Saya punya yang ini dari sebelumnya. Pasti yang terpendek saya :)
Emigna

5

05AB1E , 3 5 byte

+2 byte untuk memperbaiki kasus tepi 1. Terima kasih kepada Riley untuk tambalannya (dan untuk test suite, 05ab1e saya tidak terlalu kuat!)

ÒγP1K

Test suite di Coba online!

Bagaimana?

Ò     - prime factorisation, with duplicates
 γ    - split into chunks of consecutive equal elements
  P   - product of each list
   1  - literal one
    K - removed instances of top from previous
      - implicitly display top of stack

@ Adnan apakah itu tautan terbaik untuk "byte" atau adakah halaman kode yang diformat di suatu tempat?
Jonathan Allan

Ya, ada halaman kode yang menampilkan semua byte.
Adnan

1
Oh, betapa aku merindukannya> _ <Terima kasih banyak :)
Jonathan Allan

Tidak bekerja untuk 1.
Leaky Nun

@LeakyNun diperbaiki dengan bantuan :)
Jonathan Allan


3

Haskell , 51 byte

(2#) adalah fungsi anonim mengambil bilangan bulat dan mengembalikan daftar.

Gunakan sebagai (2#) 99.

m#n|m>n=[]|x<-gcd(m^n)n=[x|x>1]++(m+1)#div n x
(2#)

Cobalah online!

Terinspirasi oleh trik daya yang digunakan beberapa orang dalam tantangan nomor bebas pulsa baru-baru ini .

  • m#nmenghasilkan faktor n, dimulai dengan m.
  • Jika m>n, kita berhenti, menyimpulkan bahwa kita sudah menemukan semua faktor.
  • x=gcd(m^n)nadalah faktor terbesar yang nmemiliki faktor utama m. Perhatikan bahwa karena yang lebih kecil mdiuji terlebih dahulu, ini akan menjadi 1kecuali mprima.
  • Kami memasukkan xdalam daftar hasil jika bukan 1, dan kemudian muncul kembali dengan yang berikutnya m, membaginya ndengan x. Perhatikan bahwa xdan div n xtidak dapat memiliki faktor umum.
  • (2#)mengambil nomor dan mulai mencari faktor dari 2.

3

MATL , 7 byte

&YF^1X-

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Pertimbangkan input 80 sebagai contoh.

&YF    % Implicit input. Push array of unique prime factors and array of exponents
       % STACK: [2 3 5], [4 0 1]
^      % Power, element-wise
       % STACK: [16 1 5]
1      % Push 1
       % STACK: [16 1 5], 1
X-     % Set difference, keeping order. Implicitly display
       % STACK: [16 5]

EDIT (9 Juni 2017): YFdengan dua output telah dimodifikasi dalam rilis 20.1.0 : bilangan prima non-faktor dan eksponen (nol) dilewati. Ini tidak memengaruhi kode di atas, yang berfungsi tanpa memerlukan perubahan apa pun (tetapi 1X-dapat dihapus).


Saya berasumsi bahwa perubahan berarti 1X-mubazir dalam rilis baru ... juga, yang tampak seperti perbedaan set daripada persimpangan untuk saya.
Ørjan Johansen

@ ØrjanJohansen Benar pada keduanya. Terima kasih!
Luis Mendo

2

Jelly , 5 byte

ÆF*/€

Test suite di Coba online!

Bagaimana?

ÆF*/€ - Main link: n
ÆF    - prime factors as [prime, exponent] pairs
   /€ - reduce €ach with:
  *   - exponentiation

Alternatif solusi 6-byte dalam upaya untuk menemukan metode lain yang akan mengikat dengan Anda (sayangnya gagal): ÆfŒgZP. Ia memiliki jumlah token yang sama tetapi terlalu banyak atom dua-byte;)
HyperNeutrino

... dan seperti entri 05ab1e saya yang terhapus, ia mengembalikan 1input 1yang tidak diizinkan (efek menjalankan produk kosong).
Jonathan Allan

:( Yah, wah, mengabaikan itu. Sial.: P
HyperNeutrino

2

Alice , 10 byte

Ifw.n$@EOK

Cobalah online!

Sayangnya, ini menggunakan poin kode sebagai integer I / O lagi . Kasing uji dalam tautan TIO adalah input 191808 yang terurai menjadi 64 , 81 dan 37 . Perhatikan bahwa solusi ini mencetak kekuatan prima secara berurutan dari yang terbesar ke yang terkecil, jadi kami mendapatkan hasilnya %Q@.

Untuk kenyamanan, berikut adalah solusi 16-byte dengan desimal I / O yang menggunakan algoritma inti yang sama:

/O/\K
\i>fw.n$@E

Cobalah online!

Penjelasan

Seperti jawaban lainnya, ini menguraikan input menjadi kekuatan utama.

I      Read a code point as input.
f      Compute its prime factorisation a prime/exponent pairs and push them
       to the stack in order from smallest to largest prime.
w      Remember the current IP position on the return address stack. This
       starts a loop.
  .      Duplicate the current exponent. This will be zero once all primes
         have been processed.
  n$@    Terminate the program if this was zero.
  E      Raise the prime to its corresponding power.
  O      Output the result as a character.
K      Return to the w to run the next loop iteration.

2

Mathematica 46 byte

#[[1]]^#[[2]]&/@If[#==1,#={},FactorInteger@#]&

Cobalah online!


Jawaban yang bagus, tetapi memberikan hasil yang sedikit salah untuk beberapa kasus uji. Saat ini kode Anda di-output {}; {2}; {3}; {2}; {5}; {2,3}; {7}; {2}; {3}; {2,5}; {11}; {2,3}; {13}; ... tetapi seharusnya di-output {}; {2}; {3}; {4}; {5}; {2,3}; {7}; {8}; {9}; {2,5}; {11}; {4,3}; {13}; ....
Kevin Cruijssen

Saya rasa saya memperbaikinya
J42161217

Tampaknya bekerja di TIO . +1 Oh, dan selamat datang di PPCG, saya melihat Anda cukup baru di sini. Anda mungkin sudah melihatnya, tetapi jika tidak, Tips untuk bermain golf di Mathematica mungkin menarik untuk dibaca. Selamat menikmati! :)
Kevin Cruijssen

1
Jika Anda menemukan diri Anda mengakses komponen #lebih dari #itu sendiri, Anda dapat menyimpan banyak byte dengan menggunakan Apply( @@@) alih-alih Map( /@):#^#2&@@@If...
Martin Ender

1

PHP, 62 Bytes

mencetak array asosiatif dengan prime sebagai kunci dan seberapa sering prime digunakan sebagai nilai dan tidak ada input 1

for($i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!++$r[$i];print_r($r);

Cobalah online!

Output untuk 60

Array
(
    [2] => 2
    [3] => 1
    [5] => 1
)

PHP, 82 Bytes

for($i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!($r[$i]=$r[$i]?$r[$i]*$i:$i);print_r($r);

Cobalah online!

tidak mencetak apa pun untuk input 1jika Anda menginginkan array kosong dan array yang diurutkan akan sedikit lebih lama

for($r=[],$i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!($r[$i]=$r[$i]?$r[$i]*$i:$i);sort($r);print_r($r);

1

Sebenarnya , 6 byte

w⌠iⁿ⌡M

Cobalah online!

Penjelasan:

w⌠iⁿ⌡M
w       factor into [prime, exponent] pairs
 ⌠iⁿ⌡M  for each pair:
  i       flatten
   ⁿ      prime**exponent


0

miniML , 47 byte

Tantangan yang melibatkan faktorisasi utama sangat terwakili di sini, jadi kita semua sedih terpaksa memiliki faktorisasi di perpustakaan standar.

fun n->map(fun p->ipow(fst p)(snd p))(factor n)

Perhatikan bahwa 'mini' dalam miniml mengacu pada ukuran set fitur, bukan ukuran kode sumber yang tertulis di dalamnya.


0

Ruby, 61 byte

require 'prime'
->n{(2..n).select{|e|n/e.to_f%1==0&&e.prime?}}

Saya sangat kecewa setelah mencari solusi 6-7 byte -))


0

Mathematica, 24 byte

Power@@@FactorInteger@#&

Sayang sekali @@@*bukan hal. Juga, saya ingin /@*, @@*dan pada kenyataannya, perubahan @@@untuk /@@, //@untuk@@@ atau apa pun dan menambahkan keluarga tak terbatas //@, ///@...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.