Former une liste en utilisant des nombres premiers

10

Vous avez reçu N piles de pièces. Vous avez décidé de diviser chacune de ces piles B 1 , B 2 , ..., B N en groupes distincts de personnes. Le nombre de personnes recevant des pièces doit être un nombre premier et le montant d'argent donné à chaque personne doit être différent dans chaque pile.

Entrée: N, B 1 , B 2 , ..., B N (Le nombre de pièces dans chaque pile individuelle).

Sortie: NP 1 , NP 2 , ..., NP N avec NP étant le nombre de personnes (nombre premier) recevant les pièces. Si cela est impossible alors obtenir un résultat inatteignable (comme 0, -1, None, []ou "impossible") ou déclencher une erreur.

Exemple:

3
7 8 9

Production: 7 2 3

Parce que 7 est le seul nombre premier qui peut diviser 7 également, de même pour 8 et 2 et 9 et 3. Notez également que (7/7 = 1) ≠ (8/2 = 4) ≠ (9/3 = 3 ).

McLinux
la source
2
Nest une entrée redondante, pouvons-nous renoncer à la prendre?
Jonathan Allan
Pouvons-nous produire un autre résultat non réalisable (par exemple 0, une liste vide, une chaîne comme "impossible", ou déclencher une erreur) pour les cas impossibles? (Je recommanderais en fait uniquement une entrée valide, ou autoriser un comportement indéfini dans de tels cas, mais c'est à vous de décider.)
Jonathan Allan
2
Vous pouvez renoncer à la saisie de N. Et oui à la deuxième question.
McLinux
Alors, le plus petit diviseur premier de chaque nombre?
2017 totalement humain
@totallyhuman pas tout à fait - si l'entrée était dit [7,8,8]qu'il serait impossible (puisque l' utilisation 2pour les 8résultats dans deux 4s.) De plus, si l'entrée était dit [7,30,30]alors [7,2,2]serait invalide , mais [7,2,3]et [7,3,2]entre autres travailleraient.
Jonathan Allan

Réponses:

5

05AB1E , 13 octets

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

Essayez-le en ligne!

Un portage de ma réponse Pyth.

  • Òobtient le fait premier Ò rs de chacun.
  • replie une commande dyadique, â(produit c â rtesi â n) entre chacun des deux éléments de la liste de droite à gauche avec des opérandes opposés droite / gauche.
  • €˜aplatit ach.
  • ʒ...}filt ʒ rs ceux qui remplissent la condition suivante:
    • ÷ division entière par paire avec l'entrée.
    • D D uplicate (pousse deux copies de l'article dans la pile).
    • Ùsupprime les doublons, en gardant un Ù niq Ù e occurrence de chaque élément.
    • Qvérifie e Q ualité.
  • θ obtient le dernier élément.
M. Xcoder
la source
4

Gelée ,  15  14 octets

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

Un programme complet qui accepte un argument, une liste de nombres et imprime une représentation d'une autre liste de nombres, ou 0si la tâche est impossible.

Essayez-le en ligne!

Comment?

³:Œ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
la source
+1 Haha, je pense que µ⁼Qcela fonctionnerait comme une alternative au tamis distinct de fantaisie, mais bon travail!
M. Xcoder,
2

Pyth , 15 octets

ef{I/VQT.nM*FPM

Essayez-le ici!

Comment?

ef {I / VQT.nM * FPM | Programme complet, qui renonce à la taille.
                |
             PM | Décomposition en facteurs premiers de chaque entier.
           * F | Pliez le produit cartésien sur la liste des nombres premiers.
        .nM | Aplatissez chacun.
 f | Filtre.
  {I / VQT | Condition de filtre (utilise une variable T).
    / V | Division entière vectorisée ...
      QT | Sur l'entrée et l'élément actuel.
  {I | La sur-déduplication est-elle invariante (suppression des doublons)?
e | Prenez le dernier élément.
                | Afficher le résultat implicitement.
M. Xcoder
la source