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


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.

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

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