帮助PPCG克劳斯送礼物!


15

帮助PPCG克劳斯送礼物

总览

PPCG克劳斯迟迟没有送出礼物,因为如今我们有那么多奇怪的小孩。这使PPCG Claus很难将所有礼物送到正确的地方。您面临的挑战是帮助他正确地处理礼物。

复杂性

给定一个表示要送达的孩子的大写名字列表和一个用数字表示的礼物列表,您必须弄清楚如何在这些孩子之间分配礼物。当然有一个陷阱...

如今,孩子们变得挑剔,如果孩子是个奇怪的家伙(第一个名字的首字母是ASCII码是奇数),他就想要一个奇怪的礼物!如果他是个偶人(第一个名字的首字母是ASCII码),那么显然他必须被赋予偶数!但是,任何可被3整除的孩子都是顽皮的,顽皮的小伙子,因此PPCG克劳斯必须完全无视他们,才能在明年表现出来。为了使他的路线成功,他必须将所有礼物送给所有应得的孩子,并且不能给任何一个孩子太多礼物。如果有任何一个孩子比同龄人获得的礼物多3倍以上,他明年就有成为顽皮孩子的风险,那是不对的!此外,如果有好的孩子都收到礼物时,另一个很好的孩子没有,这也将反过来说孩子的罪恶。

孩子们如下:

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

  • 贝蒂(Betty)是人类的祸根,显然是数字3。
  • 艾米(Amy)和克莱德(Clyde)自出生以来就是怪胎,甚至不愿收到礼物。
  • 即使是孩子,戴夫(Dave)和弗朗辛(Francine)都很正常。他们应该只收到礼物!

礼物如下:

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] -威尔普,他们死了。
  • 没有好孩子。
    • ["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!

I / O格式要求

  • 第一个输入必须是全名的数组/列表/逗号分隔的字符串,而不仅仅是第一个首字母。
  • 第二个输入必须是一个由数组/列表/逗号分隔的正整数字符串。
  • 输出可能是有意义的礼物分配方式;或PPCGmas is Cancelled!

获奖标准:

TL; DR:贝蒂是个混蛋,不要竞争。


在示例中,我不明白为什么贝蒂不明白3编辑:如果一个人应该“拧贝蒂”,她为什么要面对挑战呢?
NoOneIsHere

@SeeOneRhino B = 66,66%3 = 0,66被0整除,Betty顽皮。
Magic Octopus Urn

Answers:


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)(repl.it上的现代Firefox浏览器),它在第一次验证时返回“ PPCGmas被取消”。至于第二个,它工作得很好,感谢字节:)
ColdK

1
这与我的原始答案具有相同的错误,如果好孩子全是偶数或全部是奇数,它将失败,请尝试以下测试:P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
Jake Cobb

确实如此 !这是因为我在上一次验证中使用了“ &&”而不是“ +”。多亏了您,这个问题现在已解决,我获得了一个字节。
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个字节以处理偶数或奇数子代的情况。

感谢@TuukkaX,节省了1个字节。


不工作,ord('A')%3==0False不过1-ord('A')%3-1
杰克·科布

哦,是的,你是对的。我很抱歉。%3<1应该管用。
Yytsi'1

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!很高兴看到您似乎了解帖子的格式。快乐打代码!
ATaco

@ATaco谢谢!我潜伏
伊恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.