Pomóż PPCG Mikołajowi dostarczyć prezenty!

15

Pomóż PPCG Mikołajowi dostarczyć prezenty

Przegląd

PPCG Claus spóźnia się z dostarczaniem prezentów, ponieważ w dzisiejszych czasach mamy tak wiele dziwnych dzieciaków. To sprawia, że ​​PPCG Claus znacznie trudniej jest dostać wszystkie prezenty we właściwe miejsce. Twoim zadaniem jest pomóc mu poprawnie dostarczyć prezenty.

Kompleksowość

Biorąc pod uwagę listę wielkich nazwisk reprezentujących dzieci, które ma dostarczyć, oraz listę prezentów reprezentowanych przez liczby, musisz dowiedzieć się, jak rozdzielić prezenty między te dzieci. Oczywiście jest pewien haczyk ....

W dzisiejszych czasach dzieci stają się wybredne, jeśli dzieciak jest dziwnym facetem (pierwszy inicjał to kod ASCII), chce dziwnego prezentu! Jeśli jest parzysty (pierwszy inicjał to nawet kod ASCII), to oczywiście musi otrzymać parzystą! Każde dziecko podzielne przez 3 jest jednak niegrzecznym, niegrzecznym chłopcem, więc PPCG Claus musi je całkowicie zignorować, aby zachowały się w przyszłym roku. Aby uznać swoją drogę za sukces, musi dostarczyć wszystkie prezenty wszystkim dzieciom, które na nie zasługują, i nie może dawać jednemu dziecku zbyt wielu prezentów. Jeśli jakieś dziecko dostanie ponad 3 prezenty więcej niż jego rówieśnicy, ryzykuje, że w przyszłym roku stanie się niegrzecznym dzieckiem, i to po prostu nie tak! Ponadto, jeśli jakieś dobre dziecko otrzyma prezent, gdy inne dobre dziecko tego nie zrobi, to również obróci to dziecko w zło.

Przykład

Dzieci są następujące:

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

  • Betty jest zmorą ludzkości, wyraźnie w liczbie 3.
  • Amy i Clyde byli dziwakami od urodzenia i nie chcieliby otrzymywać nawet prezentów.
  • Dave i Francine to normalne dzieciaki; powinni otrzymywać tylko prezenty!

Prezenty są następujące:

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

Jednym z możliwych wyników byłoby:

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

Scenariusze wyjątków

Jednak fakt, że PPCG Claus jest gotowy i chętny, nie oznacza, że ​​PPCG Claus może. Oto lista scenariuszy wyjątków, w których musisz przekazać złe wieści PPCG Claus z komunikatem:

PPCGmas is cancelled!

Następujące scenariusze spowodują anulowanie Świąt Bożego Narodzenia:

  • Nie ma dzieci.
    • [],[1,2,3] - Wellp, dali.
  • Nie ma dobrych dzieci.
    • ["Betty"],[1,2,3] - Poważnie, pieprzyć Betty.
  • Nie ma prezentów lub mniej prezentów niż dobre dzieci.
    • ["Amy","Charles"],[] - Jeden lub więcej nie otrzyma żadnych prezentów.
    • ["Amy","Charles"],[1] - Jeden lub więcej nie otrzyma żadnych prezentów.
  • Nie ma żadnych dziwnych / parzystych prezentów, które zadowolą wszystkie dobre dzieci.
    • ["Amy","Dave"],[2,4,6] - Amy jest zepsuta.

Oto lista scenariuszy, które nie powinny mieć wpływu na PPCGmas:

  • Resztki prezentów (wszystkie dzieci powinny otrzymać maksymalną liczbę prezentów).
    • ["Amy","Dave"],[2,4,6,8,10,12,14,7,9] = [["Amy",[7,9]],["Dave",[2,4,6,8]]]

Główne zasady powtórzone

  1. Dobre dzieci są parzyste lub nieparzyste, na podstawie ich pierwszego inicjału.
  2. Złe dzieci mają pierwszą początkową całkowicie podzielną przez 3.
  3. Wszystkie dobre dzieci muszą otrzymać co najmniej jeden prezent.
  4. Żadne dobre dziecko nie może otrzymać więcej niż 2 prezentów więcej niż jakiekolwiek inne dobre dziecko.
  5. Jeśli mają pozostać prezenty, musisz je maksymalnie rozprowadzić, nie naruszając 4.
  6. Złe dzieci nie mogą w ogóle otrzymywać prezentów.
  7. Jeśli DOWOLNY z nich zostanie naruszony, musisz dokładnie wydrukować PPCGmas is cancelled!.

Wymagania dotyczące formatu we / wy

  • Pierwsze wejście musi być ciągiem pełnych nazw rozdzielonych tablicą / listą / przecinkiem, a nie tylko pierwszym inicjałem.
  • Drugie wejście musi być ciągiem dodatnich liczb całkowitych rozdzielonych tablicą / listą / przecinkami.
  • Wynikiem może być dowolne oznaczenie sposobu dystrybucji prezentów, które ma sens; lub PPCGmas is Cancelled!.

Zwycięskie kryterium:

TL; DR: Betty to palant, nie rywalizuj.

Urna Magicznej Ośmiornicy
źródło
W tym przykładzie nie rozumiem, dlaczego Betty nie dostaje 3? EDYCJA : Jeśli ktoś powinien „pieprzyć Betty”, dlaczego w ogóle jest w wyzwaniu?
NoOneIsHere
@SeeOneRhino B = 66, 66% 3 = 0, 66 można podzielić przez 0, Betty jest niegrzeczna.
Magic Octopus Urn

Odpowiedzi:

4

APL, 171 bajtów

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

Traktuje to prezenty jako lewy argument, a dzieci jako prawy argument i zwraca macierz, w której pierwsza kolumna zawiera nazwy dzieci, a druga kolumna zawiera prezenty, które otrzymują.

Przypadki testowe:

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

Wersja bez golfa tutaj.

marinus
źródło
O czym są te „święta”, o których mówisz w wersji bez golfa: P?
Magic Octopus Urn,
4

JavaScript (ES6), 525 492 454 453 bajtów

-71 bajtów dzięki @Guedes -1 bit dzięki @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;}

Wypróbuj online!

Wersja bez golfa

Myślę, że może być bardziej golfa. Właśnie zrobiłem dosłowne tłumaczenie wersji bez golfa.

Jest to teraz mniej niż suma CharCode składającego się na „santa” (115 + 97 + 110 + 116 + 97 = 535). Tak

ColdK
źródło
C[0]zamiast C.charCodeAt(0)oszczędza 11 bajtów. Ponadto, gdy właściwość powtarza się wiele razy, możesz zapisać jej nazwę jak L='length'i użyć i[L]zamiast i.length.
Washington Guedes,
2
Przy okazji, witamy w PPCG !!
Washington Guedes,
Dziękuję za porady! :RE. Wypróbowałem C [0] zamiast C.charCodeAt (0) (nowoczesna przeglądarka firefox na repl.it) i przy pierwszej weryfikacji zwraca „PPCGmas jest anulowane”. Co do drugiego, działa dobrze, dzięki za Bajty :)
ColdK
1
Ma ten sam błąd, co moja pierwotna odpowiedź, w przypadku gdy dobre dzieci są parzyste lub nieparzyste, wypróbuj ten test:P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
Jake Cobb
To prawda ! To dlatego, że użyłem „&&” zamiast „+” w jednej z ostatnich weryfikacji. Dzięki tobie ten problem został już rozwiązany i zyskałem jeden bajt.
ColdK,
4

Python 2, 334 355 354 bajty

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

Utracono 21 bajtów, aby obsłużyć przypadki dzieci parzystych lub nieparzystych.

Zapisano 1 bajt dzięki @TuukkaX.

Jake Cobb
źródło
Nie działa, ord('A')%3==0jest, Falseale 1-ord('A')%3jest -1.
Jake Cobb,
Och tak, masz rację. Przepraszam. %3<1powinno działać.
Yytsi
2

JavaScript (ES6), 218 216 bajtów

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

Dane wyjściowe (jeśli nie jest to ciąg błędu) to obiekt, którego kluczami są imiona dzieci; wartość to tablica prezentów otrzymywanych przez dziecko.

Zaoszczędziłem dwa bajty, gdy zdałem sobie sprawę, że mam parę zbędnych nawiasów.

Wersja bez golfa:

(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
źródło
Cześć, witamy w PPCG! Cieszę się, że rozumiesz, jak formatuje się posty. Wesołego golfa!
ATaco,
@ATaco Thanks! Czyham
Ian