Допоможіть Клагенту PPCG доставити свої подарунки!


15

Допоможіть ДПКГ Клаусу доставити свої подарунки

Огляд

PPCG Клаус працює з привітанням пізно, доставляючи свої подарунки, адже зараз у нас так багато дивних маленьких дітей. Це робить КПКГ Клаусу набагато складніше дістати всі подарунки до потрібного місця. Ваше завдання полягає в тому, щоб допомогти йому правильно розділити подарунки.

Складність

Враховуючи список великих імен, що представляють дітей, яких він повинен доставити, та список подарунків, представлених цифрами, ви повинні з’ясувати, як розподілити подарунки серед згаданих дітей. Звичайно, тут є улов….

У наш час діти стають прискіпливими, якщо малюк - це непарний хлопець (перший початковий код ASCII - непарний), він хоче дивний подарунок! Якщо він рівний хлопець (першим початковим є ASCII-код навіть), він, очевидно, повинен отримати рівний! Однак будь-яка дитина, яка ділиться на 3, - це неслухняний, неслухняний хлопець, тому КПКГ Клаус повинен повністю ігнорувати їх, щоб змусити їх вести себе в наступному році. Щоб вважати свій маршрут успішним, він повинен вручити всі подарунки усім дітям, які їх заслуговують, і не повинен дарувати жодній дитині занадто багато подарунків. Якщо будь-яка дитина отримає на 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 Клаус готовий і готовий, не означає, що Claus PPCG може. Ось список сценаріїв винятків, коли ви повинні зламати погані новини для PPCG Claus із повідомленням:

PPCGmas is cancelled!

Наступні сценарії призведуть до скасування Різдва:

  • Нема дітей.
    • [],[1,2,3] - Ну, вони віддають.
  • Гарних дітей немає.
    • ["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!.

Вимоги до формату вводу / виводу

  • 1-й вхід повинен бути рядком / списком / розділеним комами повними іменами, а не лише першим початковим.
  • Другий вхід повинен бути рядком / списком / розділеним комами позитивними цілими числами.
  • Результатом може бути будь-яке позначення того, як ви розподіляли подарунки, що має сенс; або PPCGmas is Cancelled!.

Критерій виграшу:

TL; DR: Бетті - ривок, не змагайся.


На прикладі я не розумію, чому Бетті не потрапляє 3? EDIT : Якщо варто "накрутити Бетті", чому вона взагалі виклик?
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)↑⊂⍬}

Це сприймає подарунки як аргумент зліва, діти - як правий аргумент, і повертає матрицю, де перший стовпець містить імена дітей, а другий стовпець містить подарунки, які вони отримують.

Тести:

      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, що складає "Санта" (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

Пітон 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! Радий бачити, що ти, здається, розумієш, як формуються публікації. Happy Code-Golfing!
Атако

@ATaco Дякую! Я ховаюся
Ян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.