Hilf PPCG Claus, seine Geschenke zu bringen!

15

Hilf PPCG Claus, seine Geschenke zu bringen

Überblick

PPCG Claus kommt hella spät und liefert seine Geschenke aus, weil wir heutzutage so viele seltsame kleine Kinder da draußen haben. Dies macht es für PPCG Claus sehr viel schwieriger, alle Geschenke an den richtigen Ort zu bringen. Ihre Herausforderung besteht darin, ihm zu helfen, seine Geschenke korrekt auszuliefern.

Die Komplexität

Ausgehend von einer Liste von Vornamen mit Großbuchstaben, die die Kinder darstellen, an die er liefern soll, und einer Liste von Geschenken, die durch Zahlen dargestellt werden, müssen Sie herausfinden, wie die Geschenke auf die Kinder verteilt werden. Natürlich gibt es einen Haken ...

Heutzutage werden Kinder wählerisch, wenn das Kind ein seltsamer Kerl ist (erste Initiale ist ASCII-Code ungerade), möchte es ein seltsames Geschenk! Wenn er ein gerader Kerl ist (erste Initiale ist sogar ASCII-Code), muss er offensichtlich einen geraden bekommen! Jedes Kind, das durch 3 teilbar ist, ist jedoch ein ungezogener, ungezogener Junge. Daher muss PPCG Claus sie vollständig ignorieren, damit sie sich nächstes Jahr verhalten. Um seine Route als erfolgreich zu betrachten, muss er allen Kindern, die sie verdienen, alle Geschenke aushändigen und darf keinem Kind zu viele Geschenke machen. Wenn ein Kind mehr als drei Geschenke bekommt, riskiert es, nächstes Jahr ein ungezogenes Kind zu werden, und das ist einfach nicht richtig! Auch wenn ein gutes Kind ein Geschenk erhalten würde, wenn ein anderes gutes Kind dies nicht tun würde, würde dies auch dieses Kind böse machen.

Beispiel

Die Kinder sind wie folgt:

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

  • Betty ist der Fluch der Menschheit, ganz klar mit der Nummer 3.
  • Amy und Clyde sind seit ihrer Geburt verrückt und würden es hassen, selbst Geschenke zu erhalten.
  • Dave und Francine sind normale Kinder. Sie sollten nur noch Geschenke erhalten!

Die Geschenke sind wie folgt:

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

Eine mögliche Ausgabe wäre:

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

Ausnahmeszenarien

Nur weil PPCG Claus bereit und willens ist, heißt das noch lange nicht, dass PPCG Claus es kann. Hier ist eine Liste von Ausnahmeszenarien, in denen Sie die schlechten Nachrichten an PPCG Claus mit einer Nachricht von:

PPCGmas is cancelled!

Die folgenden Szenarien führen dazu, dass Weihnachten abgesagt wird:

  • Es gibt keine Kinder.
    • [],[1,2,3] - Wellp, sie widmeten.
  • Es gibt keine guten Kinder.
    • ["Betty"],[1,2,3] - Im Ernst, scheiß auf Betty.
  • Es gibt keine Geschenke oder weniger Geschenke als gute Kinder.
    • ["Amy","Charles"],[] - Einer oder mehrere würden keine Geschenke erhalten.
    • ["Amy","Charles"],[1] - Einer oder mehrere würden keine Geschenke erhalten.
  • Es gibt keine ungeraden / geraden Geschenke, um alle guten Kinder zufrieden zu stellen.
    • ["Amy","Dave"],[2,4,6] - Amy ist fertig.

Hier ist eine Liste von Szenarien, die sich nicht auf PPCGmas auswirken sollten:

  • Übrig gebliebene Geschenke (Alle Kinder sollten die maximale Anzahl an Geschenken erhalten).
    • ["Amy","Dave"],[2,4,6,8,10,12,14,7,9] = [["Amy",[7,9]],["Dave",[2,4,6,8]]]

Hauptregeln wiederholt

  1. Gute Kinder sind entweder gerade oder ungerade, basierend auf ihrer ersten Initiale.
  2. Böse Kinder haben eine erste Initiale, die durch 3 vollständig teilbar ist.
  3. Alle guten Kinder müssen mindestens ein Geschenk erhalten.
  4. Kein gutes Kind darf mehr als 2 Geschenke erhalten als jedes andere gute Kind.
  5. Wenn Geschenke übrig bleiben sollen, müssen Sie diese maximal verteilen, ohne 4 zu verletzen.
  6. Böse Kinder dürfen überhaupt keine Geschenke erhalten.
  7. Wenn eine dieser Bedingungen verletzt wird, müssen Sie genau ausgeben PPCGmas is cancelled!.

Anforderungen an das E / A-Format

  • Die erste Eingabe muss ein Array / eine Liste / eine durch Kommas getrennte Zeichenfolge mit vollständigen Namen sein, nicht nur die erste Initiale.
  • Die 2. Eingabe muss ein Array / eine Liste / eine durch Kommas getrennte Zeichenfolge aus positiven Ganzzahlen sein.
  • Die Ausgabe kann eine sinnvolle Angabe darüber sein, wie Sie die Geschenke verteilt haben. oder PPCGmas is Cancelled!.

Gewinnkriterium:

TL; DR: Betty ist ein Idiot, nimm nicht an Wettbewerben teil.

Magische Kraken-Urne
quelle
Ich verstehe im Beispiel nicht, warum Betty nicht bekommt 3. EDIT : Wenn man Betty "verarschen" sollte, warum ist sie überhaupt in der Herausforderung?
NoOneIsHere
@SeeOneRhino B = 66, 66% 3 = 0, 66 ist teilbar durch 0, Betty ist frech.
Magic Octopus Urn

Antworten:

4

APL, 171 Bytes

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

Dies nimmt die Geschenke als linkes Argument, die Kinder als rechtes Argument und gibt eine Matrix zurück, in der die erste Spalte die Namen der Kinder und die zweite Spalte die Geschenke enthält, die sie erhalten.

Testfälle:

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

Ungolfed Version hier.

Marinus
quelle
Von was für "Weihnachten" sprichst du in der ungolfed Version: P?
Magic Octopus Urn
4

JavaScript (ES6), 525 492 454 453 Byte

-71 Bytes dank @Guedes -1 Bit dank @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;}

Probieren Sie es online!

Nicht Golf Version

Kann mehr Golf spielen, denke ich. Ich habe gerade eine Wurfübersetzung der nicht golfenen Version gemacht.

Dies ist jetzt kürzer als die Summe des CharCodes "santa" (115 + 97 + 110 + 116 + 97 = 535). Ja

ColdK
quelle
C[0]statt C.charCodeAt(0)spart 11 Bytes. Wenn sich eine Eigenschaft mehrmals wiederholt, können Sie auch ihren Namen wie folgt speichern L='length'und i[L]anstelle von verwenden i.length.
Washington Guedes
2
Übrigens, willkommen bei PPCG !!
Washington Guedes
Vielen Dank für die Ratschläge! : D. Nun, ich habe versucht, C [0] anstelle von C.charCodeAt (0) (moderner Firefox-Browser auf repl.it) und es gibt "PPCGmas ist abgebrochen" bei der ersten Überprüfung. Was die zweite
betrifft
1
Dies hat den gleichen Fehler wie meine ursprüngliche Antwort, bei der es fehlschlägt, wenn die guten Kinder alle gerade oder alle ungerade sind. Versuchen Sie diesen Test:P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
Jake Cobb
Das ist richtig ! Das lag daran, dass ich bei einer der letzten Überprüfungen "&&" anstelle von "+" verwendet habe. Dank Ihnen ist dieses Problem behoben und ich habe ein Byte gewonnen.
ColdK
4

Python 2, 334 355 354 Bytes

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

21 Bytes verloren, um den Fall von nur geraden oder nur ungeraden Kindern zu behandeln.

1 Byte dank @TuukkaX gespeichert.

Jake Cobb
quelle
Funktioniert nicht, ord('A')%3==0ist Falseaber 1-ord('A')%3ist -1.
Jake Cobb
Oh ja, du hast recht. Entschuldigen Sie. %3<1sollte arbeiten.
Yytsi
2

Javascript (ES6), 218 216 Bytes

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

Die Ausgabe (wenn es sich nicht um die Fehlerzeichenfolge handelt) ist ein Objekt, dessen Schlüssel die Namen der Kinder sind. Der Wert ist das Array der Geschenke, die das Kind erhält.

Zwei Bytes gespart, als mir klar wurde, dass ich zwei redundante Klammern hatte.

Ungolfed-Version:

(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
quelle
Hallo, Willkommen bei PPCG! Schön zu sehen, dass du scheinbar verstehst, wie Posts formatiert werden. Viel Spaß beim Code-Golfen!
ATaco
@ATaco Danke! Ich lauere
Ian