Aidez PPCG Claus à livrer ses cadeaux!

15

Aidez PPCG Claus à livrer ses cadeaux

Aperçu

PPCG Claus est en retard pour livrer ses cadeaux parce que de nos jours, nous avons tellement de petits gamins bizarres. Cela rend beaucoup plus difficile pour PPCG Claus d'obtenir tous les cadeaux au bon endroit. Votre défi est de l'aider à délier correctement ses cadeaux.

La complexité

Étant donné une liste de prénoms en majuscule représentant les enfants auxquels il est censé livrer et une liste de cadeaux représentés par des nombres, vous devez trouver un moyen de répartir les cadeaux entre les enfants. Bien sûr, il y a un hic ...

De nos jours, les enfants deviennent pointilleux, si le gamin est un gars étrange (la première initiale est un code ASCII impair), il veut un cadeau étrange! S'il est pair (même la première initiale est en code ASCII), il doit évidemment lui être donné un pair! Tout enfant divisible par 3, cependant, est un vilain, un vilain, donc PPCG Claus doit les ignorer complètement pour les faire se comporter l'année prochaine. Pour considérer son parcours comme un succès, il doit livrer tous les cadeaux à tous les enfants qui les méritent et ne doit pas donner à un enfant trop de cadeaux. Si un enfant reçoit 3+ cadeaux de plus que ses pairs, il risque de devenir un enfant méchant l'année prochaine, et ce n'est tout simplement pas bien! De plus, si un bon enfant devait recevoir un cadeau alors qu'un autre bon enfant ne le recevait pas, cela rendrait cet enfant mauvais.

Exemple

Les enfants sont les suivants:

Kids = ["Amy", "Betty", "Clyde", "Dave", "Francine"] = [A,B,C,D,F] = [65,66,67,68,70]

  • Betty est le fléau de l'humanité, clairement en pointe avec le chiffre 3.
  • Amy et Clyde sont bizarres depuis leur naissance et détesteraient même recevoir des cadeaux.
  • Dave et Francine sont des enfants normaux, même; ils ne devraient recevoir que des cadeaux!

Les cadeaux sont les suivants:

Presents = [1,2,3,4,5,6,7,8,9,10,11,12,13,14]

Une sortie possible serait:

[
    ['Amy',[1,3,5]],
    ['Betty',[]],
    ['Clyde',[7,9,11,13]],
    ['Dave',[2,4,6,8]],
    ['Francine',[10,12,14]]
]

Scénarios d'exception

Cependant, ce n'est pas parce que PPCG Claus est prêt et disposé à le faire. Voici une liste de scénarios d'exception où vous devez annoncer la mauvaise nouvelle à PPCG Claus avec un message de:

PPCGmas is cancelled!

Les scénarios suivants entraîneront l'annulation de Noël:

  • Il n'y a pas d'enfants.
    • [],[1,2,3] - Wellp, ont-ils déduit.
  • Il n'y a pas de bons enfants.
    • ["Betty"],[1,2,3] - Sérieusement, vis Betty.
  • Il n'y a pas de cadeaux, ou moins de cadeaux que de bons enfants.
    • ["Amy","Charles"],[] - Un ou plusieurs ne recevraient aucun cadeau.
    • ["Amy","Charles"],[1] - Un ou plusieurs ne recevraient aucun cadeau.
  • Il n'y a pas de cadeaux impairs / pairs pour satisfaire tous les bons enfants.
    • ["Amy","Dave"],[2,4,6] - Amy est foutue.

Voici une liste de scénarios qui ne devraient pas affecter PPCGmas:

  • Cadeaux restants (Tous les enfants devraient recevoir le maximum de cadeaux).
    • ["Amy","Dave"],[2,4,6,8,10,12,14,7,9] = [["Amy",[7,9]],["Dave",[2,4,6,8]]]

Règles principales réitérées

  1. Les bons enfants sont pairs ou impairs, selon leur première initiale.
  2. Les mauvais enfants ont une première initiale entièrement divisible par 3.
  3. Tous les bons enfants doivent recevoir au moins un cadeau.
  4. Aucun bon enfant ne doit recevoir plus de 2 cadeaux de plus que tout autre bon enfant.
  5. S'il reste des cadeaux, vous devez les distribuer au maximum, sans violer 4.
  6. Les mauvais enfants ne doivent recevoir aucun cadeau.
  7. Si l'un de ces éléments est violé, vous devez produire PPCGmas is cancelled!exactement.

Exigences de format d'E / S

  • La 1ère entrée doit être une chaîne de noms complets de tableau / liste / délimitée par des virgules, pas seulement la première initiale.
  • La deuxième entrée doit être une chaîne / liste / chaîne séparée par des virgules d'entiers positifs.
  • Le résultat peut être n'importe quelle dénotation de la façon dont vous avez distribué les cadeaux qui a du sens; ou PPCGmas is Cancelled!.

Critère gagnant:

TL; DR: Betty est un imbécile, ne rivalisez pas.

Urne de poulpe magique
la source
Je ne comprends pas, dans l'exemple, pourquoi Betty ne comprend pas 3? EDIT : Si l'on doit "baiser Betty", pourquoi est-elle dans le défi?
NoOneIsHere
@SeeOneRhino B = 66, 66% 3 = 0, 66 est divisible par 0, Betty est méchante.
Urne de poulpe magique

Réponses:

4

APL, 171 octets

{D←{⍵=1:⊂⍺⋄0~⍨¨↓⍵↑⍉↑⍺⊂⍨1=⍵|⍳⍴⍺}⋄e←⍺~o←⍺/⍨2|⍺⋄(0=≢G)∨0∊≢¨P←P↑⍨¨(2+⌊/R)⌊R←≢¨P←(o D≢O),e D≢E←G~O←G/⍨2|⎕A⍳⊃¨G←⍵/⍨×3|⊃∘⎕UCS¨⍵:'PPCGmas is cancelled!'⋄(O,E,B),[⍟4]P,(≢B←⍵~G)↑⊂⍬}

Cela prend les cadeaux comme argument de gauche, les enfants comme argument de droite et retourne une matrice où la première colonne contient les noms des enfants et la deuxième colonne contient les cadeaux qu'ils reçoivent.

Testcases:

      P←{D←{⍵=1:⊂⍺⋄0~⍨¨↓⍵↑⍉↑⍺⊂⍨1=⍵|⍳⍴⍺}⋄e←⍺~o←⍺/⍨2|⍺⋄(0=≢G)∨0∊≢¨P←P↑⍨¨(2+⌊/R)⌊R←≢¨P←(o D≢O),e D≢E←G~O←G/⍨2|⎕A⍳⊃¨G←⍵/⍨×3|⊃∘⎕UCS¨⍵:'PPCGmas is cancelled!'⋄(O,E,B),[⍟4]P,(≢B←⍵~G)↑⊂⍬}
      (⍳14) P 'Amy' 'Betty' 'Clyde' 'Dave' 'Francine'
┌────────┬─────────┐
│Amy     │1 5 9 13 │
├────────┼─────────┤
│Clyde   │3 7 11   │
├────────┼─────────┤
│Dave    │2 6 10 14│
├────────┼─────────┤
│Francine│4 8 12   │
├────────┼─────────┤
│Betty   │         │
└────────┴─────────┘
      1 2 3 P ⍬
PPCGmas is cancelled!
      1 2 3 P ⊂'Betty'
PPCGmas is cancelled!
      ⍬ P 'Amy' 'Charles'
PPCGmas is cancelled!
      (,1) P 'Amy' 'Charles'
PPCGmas is cancelled!
      2 4 6 P 'Amy' 'Dave'
PPCGmas is cancelled!
      2 4 6 8 10 12 14 7 9 P 'Amy' 'Dave'
┌────┬───────┐
│Amy │7 9    │
├────┼───────┤
│Dave│2 4 6 8│
└────┴───────┘

Version non golfée ici.

marinus
la source
Quel est ce "Noël" dont vous parlez dans la version non golfée: P?
Urne de poulpe magique du
4

JavaScript (ES6), 525 492 454 453 octets

-71 octets grâce à @Guedes -1 bit grâce à @Jake Cobb

P=(K,p)=>{y='charCodeAt';n=(C)=>C[y](0)%3>0;N=(C)=>C[y](0)%3<1;E=(C)=>C[y](0)%2>0;O=(C)=>C[y](0)%2<1;f=(U)=>U%2<1;F=(U)=>U%2;M=(U,C)=>C%s==S;s=S=0;a=new Array();G='filter';e=p[G](f);o=p[G](F);J=K[G](n);r=J[G](O);L='length';i=J[G](E);s=r[L];for(S=0;S<r[L];S++){a.push([r[S],e[G](M)]);}s=i[L];for(S=0;S<i[L];S++){a.push([i[S],o[G](M)]);}K=K[G](N);for(S=0;S<K[L];S++){a.push(K[S],[]);}return(e[L]<r[L]||o[L]<i[L]||(r[L]+i[L])<1)?"PPCGmas is Cancelled!":a;}

Essayez-le en ligne!

Version non golfée

Peut être plus golfé je pense. Je viens de faire une traduction littérale de la version non-golfée.

C'est maintenant plus court que la somme du CharCode composant "santa" (115 + 97 + 110 + 116 + 97 = 535). Ouais

ColdK
la source
C[0]au lieu d' C.charCodeAt(0)enregistrer 11 octets. De plus, lorsqu'une propriété se répète plusieurs fois, vous pouvez stocker son nom comme L='length'et l'utiliser à la i[L]place de i.length.
Washington Guedes
2
Au fait, bienvenue chez PPCG !!
Washington Guedes
Merci pour les conseils! :RÉ. Eh bien, j'ai essayé C [0] au lieu de C.charCodeAt (0) (navigateur Firefox moderne sur repl.it) et il retourne "PPCGmas est annulé" lors de la première vérification. Quant au second, il fonctionne bien, merci pour les octets :)
ColdK
1
Cela a le même bug que ma réponse d'origine où il échoue si les bons enfants sont tous pairs ou tous impairs, essayez ce test:P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
Jake Cobb
C'est vrai ! C'est parce que j'ai utilisé "&&" au lieu de "+" dans l'une des dernières vérifications. Grâce à vous, ce problème est désormais résolu et j'ai gagné un octet.
ColdK
4

Python 2, 334 355 354 octets

k,p=input()
z=zip
l=len
e=[];o=[];g=[];b=[];q=[];r=[]
for x in k:[g,b][ord(x[0])%3<1]+=x,
for x in g:[e,o][ord(x[0])&1]+=x,
for x in p:[q,r][x&1]+=x,
v=l(e)
w=l(o)
t=v and l(q)/v
u=w and l(r)/w
if u:t=min(t,u+2)
if t:u=min(u,t+2)
if l(g)*(t or v<1)*(u or w<1)<1:exit('PPCGmas is cancelled!')
print z(e,z(*[iter(q)]*t))+z(o,z(*[iter(r)]*u))+z(b,[()]*l(b))

Perte de 21 octets pour gérer le cas des enfants uniquement pairs ou impairs.

1 octet enregistré grâce à @TuukkaX.

Jake Cobb
la source
Ne fonctionne pas, l' ord('A')%3==0est Falsemais l' 1-ord('A')%3est -1.
Jake Cobb
Oh oui, tu as raison. Mes excuses. %3<1devrait marcher.
Yytsi
2

Javascript (ES6), 218 216 octets

(a,b)=>{c={};a.forEach(d=>c[d]=[]);e=f=0;while(!e){e=g=1;a.forEach(h=>(j=h.charCodeAt())%3?(k=b.findIndex(l=>l%2==j%2))<0?g=0:c[h][f+1]?0:e=0&c[h].push(b.splice(k,1)[0]):0);f+=!e&g}return f?c:"PPCGmas is cancelled!"}

La sortie (si ce n'est pas la chaîne d'erreur) est un objet dont les clés sont les noms des enfants; la valeur est le tableau de cadeaux que l'enfant reçoit.

J'ai enregistré deux octets lorsque j'ai réalisé que j'avais une paire de parenthèses redondantes.

Version non golfée:

(names, gifts) => {

  // Initialize result. Set every child's gift array to empty
  var result = {};
  names.forEach(name =>
    result[name] = [];
  );

  // Initialize external loop values
  var done = false;
  var leastNumberOfPresentsAmongGoodChildren = 0;

  // Give the gifts
  while (!done) {

    // Initialize internal loop values
    done = true;
    var everyGoodChildGotGift = true;

    // Try to give at most one gift to every good child
    names.forEach(name => {
      var nameCode = name.charCodeAt(0);

      // Ignore bad children
      if ((nameCode % 3) != 0) {

        // Try to find an appropriate gift
        var giftIndex = gifts.findIndex(gift => (gift % 2) == (nameCode % 2));

        // If there is no gift, set the flag
        if (giftIndex < 0)
          everyGoodChildGotGift = false;

        // Make sure we don't give too many gifts
        else if (result[name].length < leastNumberOfPresentsAmongGoodChildren + 2) {

          // Remove the gift from the gifts array (we can't give it again)
          var giftToGive = gifts.splice(giftIndex, 1)[0];

          // Give the gift to the child
          result[name].push(giftToGive);

          // If at least one child got a gift, try to give more gifts
          done = false;
        }
      }
    }); // end forEach

    // If we're done, that means we couldn't give a gift to any good child
    if (done)
      everyGoodChildGotGift = false;

    // If every good child got a gift, then increase the count
    if (everyGoodChildGotGift)
      leastNumberOfPresentsAmongGoodChildren++;

  } // end while

  // If every good child gets at least one gift, return who gets what
  if (leastNumberOfPresentsAmongGoodChildren != 0)
    return result;
  else
    return "PPCGMas is cancelled!"; // IT'S ALL YOUR FAULT, BETTY. YOU'VE RUINED PPCGMAS.
}
Ian
la source
Bonjour, Bienvenue chez PPCG! Heureux de voir que vous semblez comprendre comment les messages sont formatés. Bon code-golf!
ATaco
@ATaco Merci! Je me cache
Ian