Aiuta PPCG Claus a consegnare i suoi regali!


15

Aiuta PPCG Claus a consegnare i suoi regali

Panoramica

PPCG Claus sta correndo tardi consegnando i suoi doni perché al giorno d'oggi abbiamo così tanti piccoli bambini strani. Questo rende molto più difficile per PPCG Claus portare tutti i regali nel posto giusto. La tua sfida è aiutarlo a scavare correttamente i suoi regali.

La complessità

Dato un elenco di nomi in maiuscolo che rappresentano i bambini che dovrebbe consegnare e un elenco di regali rappresentati da numeri, è necessario capire come distribuire i regali tra detti bambini. Ovviamente c'è un problema però ...

Oggi i bambini stanno diventando pignoli, se il bambino è un tipo strano (la prima iniziale è dispari in codice ASCII) vuole un regalo strano! Se è un tipo pari (la prima iniziale è pari al codice ASCII), ovviamente deve averne uno pari! Ogni bambino divisibile per 3, tuttavia, è un ragazzo cattivo e cattivo, quindi PPCG Claus deve ignorarli completamente per farli comportare l'anno prossimo. Per considerare il suo percorso un successo, deve consegnare tutti i regali a tutti i bambini che li meritano e non deve regalare a nessuno un bambino di troppo. Se un bambino riceve 3+ regali in più rispetto ai suoi coetanei, rischia di diventare un bambino cattivo l'anno prossimo, e non è giusto! Inoltre, se un bambino buono ricevesse un regalo quando un altro bambino buono non lo farebbe, anche quel bambino lo farebbe diventare malvagio.

Esempio

I bambini sono i seguenti:

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

  • Betty è la rovina dell'umanità, chiaramente in combutta con il numero 3.
  • Amy e Clyde sono stati strani sin dalla nascita e non sopporterebbero di ricevere regali.
  • Dave e Francine sono normali, persino, bambini; dovrebbero ricevere solo regali pari!

I regali sono i seguenti:

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

Un possibile output sarebbe:

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

Scenari di eccezione

Tuttavia, solo perché PPCG Claus è pronto e disponibile, non significa che PPCG Claus possa farlo. Ecco un elenco di scenari di eccezione in cui è necessario comunicare a PPCG Claus le cattive notizie con un messaggio di:

PPCGmas is cancelled!

I seguenti scenari comporteranno l'annullamento del Natale:

  • Non ci sono bambini
    • [],[1,2,3] - Bene, hanno dedotto.
  • Non ci sono bambini buoni.
    • ["Betty"],[1,2,3] - Seriamente, scopa Betty.
  • Non ci sono regali, o meno regali dei bravi bambini.
    • ["Amy","Charles"],[] - Uno o più non riceveranno regali.
    • ["Amy","Charles"],[1] - Uno o più non riceveranno regali.
  • Non ci sono regali pari / dispari per soddisfare tutti i bambini buoni.
    • ["Amy","Dave"],[2,4,6] - Amy è fregata.

Ecco un elenco di scenari che non dovrebbero influire su PPCGmas:

  • Regali rimanenti (tutti i bambini devono ricevere la quantità massima di regali).
    • ["Amy","Dave"],[2,4,6,8,10,12,14,7,9] = [["Amy",[7,9]],["Dave",[2,4,6,8]]]

Principali regole reiterate

  1. I bambini buoni sono pari o dispari, in base alla loro prima iniziale.
  2. I bambini cattivi hanno una prima iniziale completamente divisibile per 3.
  3. Tutti i bambini buoni devono ricevere almeno un regalo.
  4. Nessun bambino buono deve ricevere più di 2 regali in più di qualsiasi altro bambino buono.
  5. Se ci sono regali rimanenti, è necessario distribuirli al massimo, senza violare 4.
  6. I bambini cattivi non devono ricevere regali.
  7. Se QUALUNQUE di questi viene violato, è necessario eseguire l'output PPCGmas is cancelled!, esattamente.

Requisiti del formato I / O

  • Il primo input deve essere una stringa delimitata da array / list / virgola di nomi completi, non solo la prima iniziale.
  • Il 2o input deve essere una stringa delimitata da array / elenco / virgola di numeri interi positivi.
  • L'output può essere qualsiasi denotazione di come hai distribuito i regali che ha senso; o PPCGmas is Cancelled!.

Criterio vincente:

TL; DR: Betty è un coglione, non competere.


Non capisco, nell'esempio, perché Betty non capisce 3? EDIT : Se uno dovrebbe "fregare Betty", perché è nella sfida?
NoOneIsHere il

@SeeOneRhino B = 66, 66% 3 = 0, 66 è divisibile per 0, Betty è cattiva.
Magic Octopus Urn

Risposte:


4

APL, 171 byte

{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)↑⊂⍬}

Questo prende i regali come argomento di sinistra, i figli come argomento di destra e restituisce una matrice in cui la prima colonna contiene i nomi dei figli e la seconda colonna contiene i regali che ottengono.

Casi test:

      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│
└────┴───────┘

Versione non golfata qui.


Cos'è questo "natale" di cui parli nella versione non golfata: P?
Magic Octopus Urn

4

JavaScript (ES6), 525 492 454 453 byte

-71 byte grazie a @Guedes -1 bit grazie a @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;}

Provalo online!

Versione senza golf

Penso che possa essere più golfista. Ho appena fatto una traduzione letterale della versione non giocata a golf.

Questo è ora più breve della somma del CharCode che compone "santa" (115 + 97 + 110 + 116 + 97 = 535). yeay


C[0]invece di C.charCodeAt(0)salvare 11 byte. Inoltre, quando una proprietà si ripete più volte, è possibile memorizzarne il nome L='length'e utilizzarlo i[L]anziché i.length.
Washington Guedes,

2
A proposito, benvenuto in PPCG !!
Washington Guedes,

Grazie per i consigli! : D. Beh, ho provato C [0] invece di C.charCodeAt (0) (moderno browser Firefox su repl.it) e restituisce "PPCGmas viene cancellato" alla prima verifica. Per quanto riguarda il secondo, funziona bene, grazie per i byte :)
ColdK

1
Questo ha lo stesso bug della mia risposta originale in cui fallisce se i bravi bambini sono tutti pari o dispari, prova questo test:P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
Jake Cobb,

È vero ! È stato perché ho usato "&&" anziché "+" in una delle ultime verifiche. Grazie a te questo problema è stato risolto e ho guadagnato un byte.
ColdK,

4

Python 2, 334 355 354 byte

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

Persi 21 byte per gestire il caso di bambini pari o dispari.

Salvato 1 byte grazie a @TuukkaX.


Non funziona, ord('A')%3==0è Falsema 1-ord('A')%3è -1.
Jake Cobb,

Oh sì, hai ragione. Mie scuse. %3<1dovrebbe funzionare.
Yytsi,

2

Javascript (ES6), 218 216 byte

(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!"}

L'output (se non è la stringa di errore) è un oggetto le cui chiavi sono i nomi dei bambini; il valore è l'array di regali che il figlio riceve.

Ho salvato due byte quando ho realizzato di avere un paio di parentesi ridondanti.

Versione non golfata:

(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.
}

Ciao, benvenuto in PPCG! Sono contento di vederti sembrare in grado di capire come vengono formattati i post. Buon gioco di golf!
ATaco,

@ATaco Grazie! Sono in agguato
Ian il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.