Помогите PPCG Клаусу доставить его подарки!


15

Помогите PPCG Клаусу доставить его подарки

обзор

PPCG Клаус бежит поздно, доставляя свои подарки, потому что в настоящее время у нас так много странных маленьких детишек. Из-за этого PPCG Клаусу намного сложнее доставить все подарки в нужное место. Ваша задача - помочь ему правильно доставить подарки.

Сложность

Учитывая список заглавных имен, представляющих детей, которых он должен доставить, и список подарков, представленных числами, вы должны выяснить, как распределить подарки среди указанных детей. Конечно, есть загвоздка, хотя ....

В настоящее время дети становятся разборчивыми, если ребенок странный человек (первая буква - нечетный ASCII-код), он хочет получить странный подарок! Если он четный парень (первая буква - даже ASCII-код), ему, очевидно, нужно дать четное число! Однако любой ребенок, делимый на 3, является непослушным, непослушным мальчиком, поэтому PPCG Клаус должен полностью игнорировать их, чтобы заставить их вести себя в следующем году. Чтобы считать свой путь успешным, он должен доставить все подарки всем детям, которые их заслуживают, и не должен давать ни одному ребенку слишком много подарков. Если любой ребенок получит на 3+ больше подарков, чем его сверстники, он рискует стать непослушным ребенком в следующем году, и это просто неправильно! Кроме того , если какой - нибудь хороший ребенок был получить подарок , когда другой хороший ребенок не, что также будет превратить этот ребенок зла.

пример

Дети следующие:

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

  • Бетти - проклятие человечества, явно в сговоре с номером 3.
  • Эми и Клайд были чудаковатыми с рождения и не хотели бы получать даже подарки.
  • Дейв и Франсин нормальные, даже дети; они должны получать только подарки!

Подарки следующие:

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

Одним из возможных выходных данных будет:

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

Сценарии исключений

Однако то, что PPCG Клаус готов и желает, не означает, что PPCG Клаус может. Вот список сценариев исключений, в которых вы должны сообщить о плохих новостях PPCG Claus с сообщением:

PPCGmas is cancelled!

Следующие сценарии приведут к отмене Рождества:

  • Там нет детей.
    • [],[1,2,3] - Wellp, они дед.
  • Там нет хороших детей.
    • ["Betty"],[1,2,3] - Серьезно, винт Бетти.
  • Нет подарков или меньше подарков, чем у хороших детей.
    • ["Amy","Charles"],[] - Один или несколько человек не получат подарков.
    • ["Amy","Charles"],[1] - Один или несколько человек не получат подарков.
  • Там нет нечетных / четных подарков, чтобы удовлетворить всех хороших детей.
    • ["Amy","Dave"],[2,4,6] - Эми облажалась.

Вот список сценариев, которые не должны влиять на PPCGmas:

  • Остаток подарков (все дети должны получить максимальное количество подарков).
    • ["Amy","Dave"],[2,4,6,8,10,12,14,7,9] = [["Amy",[7,9]],["Dave",[2,4,6,8]]]

Повторяемые основные правила

  1. Хорошие дети либо четные, либо нечетные, в зависимости от их первого инициала.
  2. У плохих детей первое начальное значение делится на 3.
  3. Все хорошие дети должны получить как минимум один подарок.
  4. Ни один хороший ребенок не может получить более 2 подарков больше, чем любой другой хороший ребенок.
  5. Если должны быть оставшиеся подарки, вы должны максимально распространять их, не нарушая 4.
  6. Плохие дети не должны получать подарки вообще.
  7. Если ЛЮБОЙ из них нарушен, вы должны вывести PPCGmas is cancelled!точно.

Требования к формату ввода / вывода

  • Первый вход должен быть строкой с полными именами в виде массива / списка / запятой, а не только первым инициалом.
  • 2-й вход должен представлять собой массив положительных целых чисел, разделенных запятыми.
  • Результатом может быть любое обозначение того, как вы раздавали подарки, что имеет смысл; или PPCGmas is Cancelled!.

Критерий победы:

TL; DR: Бетти - придурок, не соревнуйся.


Я не понимаю, в примере, почему Бетти не получает 3? РЕДАКТИРОВАТЬ : Если кто-то должен «ввернуть Бетти», почему она вообще в вызове?
NoOneIsHere

@SeeOneRhino B = 66, 66% 3 = 0, 66 делится на 0, Бетти непослушная.
Волшебная Урна Осьминога

Ответы:


4

APL, 171 байт

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

Он принимает подарки в качестве левого аргумента, потомки - в качестве правого аргумента и возвращает матрицу, в которой первый столбец содержит имена дочерних элементов, а второй столбец содержит подарки, которые они получают.

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

Безголовая версия здесь.


Что это за "рождество", о котором вы говорите в негольфированной версии: P?
Волшебная Урна Осьминога

4

JavaScript (ES6), 525 492 454 453 байта

-71 байт благодаря @Guedes -1 бит благодаря @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;}

Попробуйте онлайн!

Версия без гольфа

Я думаю, можно играть в гольф. Я только что сделал буквальный перевод версии без игры в гольф.

Теперь это меньше, чем сумма CharCode, составляющая "santa" (115 + 97 + 110 + 116 + 97 = 535). Йеай


C[0]вместо C.charCodeAt(0)сохранения 11 байтов. Кроме того, когда свойство повторяется много раз, вы можете сохранить его имя как L='length'и использовать i[L]вместо i.length.
Вашингтон Гуэдс

2
Кстати, добро пожаловать в PPCG!
Вашингтон Гуэдс

Спасибо за советы! : D. Ну, я попробовал C [0] вместо C.charCodeAt (0) (современный браузер Firefox на repl.it), и он возвращает «PPCGmas отменен» при первой проверке. Что касается второго, он работает хорошо, спасибо за байты :)
ColdK

1
Это та же ошибка, что и в моем первоначальном ответе, когда она не срабатывает, если все хорошие дети четные или все нечетные, попробуйте этот тест:P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
Джейк Кобб

Это правда ! Это потому, что я использовал «&&» вместо «+» в одной из последних проверок. Благодаря вам эта проблема теперь исправлена, и я получил один байт.
ColdK

4

Python 2, 334 355 354 байта

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 байт для обработки только четных или только нечетных детей.

Сохранено 1 байт благодаря @TuukkaX.


Не работает, ord('A')%3==0есть, Falseно 1-ord('A')%3есть -1.
Джейк Кобб

Ах да, ты прав. Мои извенения. %3<1должно сработать.
Yytsi

2

Javascript (ES6), 218 216 байт

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

Вывод (если это не строка ошибки) - это объект, ключами которого являются имена детей; значение - это массив подарков, которые получает ребенок.

Я сохранил два байта, когда понял, что у меня есть пара избыточных скобок.

Безголовая версия:

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

Привет, добро пожаловать в PPCG! Рад видеть, что вы, кажется, понимаете, как посты форматируются. Удачного Code-Golfing!
ATaco

@ATaco Спасибо! Я прячусь
Ян
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.