Bentuk daftar menggunakan nomor prima

10

Anda telah diberi N tumpukan koin. Anda telah memutuskan untuk membagi masing-masing tumpukan B 1 , B 2 , ..., B N di antara kelompok-kelompok orang yang berbeda. Jumlah orang yang menerima koin haruslah bilangan prima dan jumlah uang yang diberikan kepada setiap orang harus berbeda di setiap tumpukan.

Input: N, B 1 , B 2 , ..., B N (Jumlah koin di setiap tumpukan individu).

Output: NP 1 , NP 2 , ..., NP N dengan NP menjadi jumlah orang (bilangan prima) yang menerima koin. Jika ini tidak mungkin kemudian menghasilkan beberapa hasil tidak bisa diraih (seperti 0, -1, None, [], atau "impossible") atau meningkatkan kesalahan.

Contoh:

3
7 8 9

Keluaran: 7 2 3

Karena 7 adalah satu-satunya bilangan prima yang dapat membagi 7 secara merata, sama untuk 8 dan 2 dan 9 dan 3. Juga, perhatikan bahwa (7/7 = 1) ≠ (8/2 = 4) ≠ (9/3 = 3 ).

McLinux
sumber
2
Nadalah input yang berlebihan, bisakah kita tidak mengambilnya?
Jonathan Allan
Bisakah kita menghasilkan beberapa hasil yang tidak dapat dicapai lainnya (misalnya 0, daftar kosong, string seperti "tidak mungkin", atau menimbulkan kesalahan) untuk kasus yang tidak mungkin? (Saya benar-benar akan merekomendasikan hanya input yang valid, atau mengizinkan perilaku yang tidak terdefinisi dalam kasus seperti itu, tetapi terserah Anda.)
Jonathan Allan
2
Anda dapat mengabaikan input N. Dan ya untuk pertanyaan kedua.
McLinux
Jadi, pembagi utama terendah dari setiap nomor?
totallyhuman
@tallyallyhuman tidak cukup - jika input dikatakan [7,8,8]itu tidak mungkin (karena menggunakan 2untuk kedua 8hasil dalam dua 4s.) Selanjutnya, jika input dikatakan [7,30,30]maka [7,2,2]akan tidak valid tetapi [7,2,3]dan di [7,3,2]antara yang lain akan bekerja.
Jonathan Allan

Jawaban:

5

05AB1E , 13 byte

Ò.»â€˜ʒ÷DÙQ}θ

Cobalah online!

Port jawaban Pyth saya.

  • Òmendapat kenyataan perdana Ò rs masing-masing.
  • melipat perintah diad, â(c â rtesi â n produk) antara masing-masing dua elemen dalam daftar dari kanan ke kiri dengan operan kanan / kiri yang berlawanan.
  • €˜ratakan ach.
  • ʒ...}filt ʒ rs mereka yang memenuhi kondisi berikut:
    • ÷ divisi integer berpasangan dengan input.
    • D D uplicate (mendorong dua salinan item ke tumpukan).
    • Ùmenghilangkan duplikat elemen, menjaga Ù Niq Ù e terjadinya setiap elemen.
    • Qmemeriksa e Q uality.
  • θ mendapat elemen terakhir.
Tuan Xcoder
sumber
4

Jelly ,  15  14 byte

³:ŒQẠ
ÆfŒpÇÐfṪ

Program lengkap yang menerima satu argumen, daftar angka, dan mencetak representasi dari daftar angka lainnya, atau 0jika tugasnya tidak mungkin.

Cobalah online!

Bagaimana?

³:ŒQẠ - Link 1, unique after division?: list of primes, Ps   e.g. [7,2,2]  or  [7,3,3]
³     - program's first input                                e.g. [7,8,8]  or  [7,9,30]
 :    - integer division by Ps                                    [1,4,4]      [1,3,10]
  ŒQ  - distinct sieve                                            [1,1,0]      [1,1,1]
    Ạ - all truthy?                                               0            1

ÆfŒpÇÐfṪ - Main link: list of coin stack sizes, Bs   e.g. [7,8,12]
Æf       - prime factorisation (vectorises)               [[7],[2,2,2],[2,2,3]]
  Œp     - Cartesian product                              [[7,2,2],[7,2,2],[7,2,3],[7,2,2],[7,2,2],[7,2,3],[7,2,2],[7,2,2],[7,2,3]]
     Ðf  - filter keep if:
    Ç    -   call last link (1) as a monad                 1       1       0       1       1       0       1       1       0
         -                                                [[7,2,2],[7,2,2],[7,2,2],[7,2,2],[7,2,2],[7,2,2]]
       Ṫ - tail (note: tailing an empty list yields 0)    [7,2,2]
         - implicit print
Jonathan Allan
sumber
+1 Haha, saya pikir µ⁼Qakan bekerja sebagai alternatif untuk ayakan berbeda mewah, tapi pekerjaan yang baik!
Tn. Xcoder
2

Pyth , 15 byte

ef{I/VQT.nM*FPM

Coba di sini!

Bagaimana?

ef {I / VQT.nM * FPM | Program lengkap, yang memalsukan ukurannya.
                |
             PM | Factorisasi utama setiap bilangan bulat.
           * F | Lipat Produk Cartesian dari daftar bilangan prima.
        .nM | Ratakan masing-masing.
 f | Saring.
  {I / VQT | Kondisi filter (menggunakan variabel T).
    / V | Divisi bilangan bulat vektor ...
      QT | Atas input dan item saat ini.
  {I | Apakah invarian lebih dari deduplikasi (menghapus duplikat)?
e | Ambil elemen terakhir.
                | Keluarkan hasilnya secara implisit.
Tuan Xcoder
sumber