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]

  • ベティは人類の悩みの種であり、明らかに数字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 Clausができるというわけではありません。以下は、PPCG Clausへの悪いニュースを次のメッセージで伝える必要がある例外シナリオのリストです。

PPCGmas is cancelled!

次のシナリオでは、クリスマスがキャンセルされます。

  • 子供はいない。
    • [],[1,2,3] -まあ、彼らはデド。
  • 良い子はいない。
    • ["Betty"],[1,2,3] -真剣に、ベティをねじ込みます。
  • プレゼントがないか、良い子よりも少ないプレゼントがあります。
    • ["Amy","Charles"],[] -1つ以上がプレゼントを受け取りません。
    • ["Amy","Charles"],[1] -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. すべての善良な子供は、少なくとも1つのプレゼントを受け取らなければなりません。
  4. 善良な子供は、他の善良な子供よりも2つ以上のプレゼントを受け取ることはできません。
  5. 残りのプレゼントがある場合は、違反せずに最大限に配布する必要があります4。
  6. 悪い子供はプレゼントを一切受け取らないでください。
  7. これらのいずれかに違反した場合、を正確に出力する必要がありますPPCGmas is cancelled!

I / Oフォーマットの要件

  • 最初の入力は、最初のイニシャルだけでなく、配列/リスト/コンマ区切りのフルネームの文字列でなければなりません。
  • 2番目の入力は、正整数の配列/リスト/コンマ区切りの文字列でなければなりません。
  • 出力は、意味のあるプレゼントの配布方法を示すものです。またはPPCGmas is Cancelled!

受賞基準:

TL; DR:ベティはジャークです、競争しないでください。


例では、なぜBettyが取得できないのかわかりません3編集:「ベティをねじ込む」必要がある場合、なぜ彼女はまったく挑戦しているのですか?
NoOneIsHere

@SeeOneRhino B = 66、66%3 = 0、66は0で割り切れ、ベティはいたずらです。
魔法のタコUr

回答:


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

これは、左引数としてプレゼントを取り、右引数として子を取り、最初の列に子の名前が含まれ、2番目の列に取得したプレゼントが含まれるマトリックスを返します。

テストケース:

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

ここにゴルフバージョンはありません。


この「クリスマス」とは何ですか?
魔法のタコUr

4

JavaScript(ES6)、525 492 454 453バイト

@Guedesに感謝-71バイト@Jake Cobbに 感謝-1ビット

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
ワシントンGuedes

2
ところで、PPCGへようこそ!!
ワシントンGuedes

アドバイスありがとうございます!:D。さて、C.charCodeAt(0)(repl.itの最新のFirefoxブラウザ)ではなくC [0]を試しましたが、最初の検証で「PPCGmas is cancelled」を返します。第二としては、それは、うまくバイトに感謝:)作品
ColdK

1
これは良い子供たちはすべて偶数またはすべて奇数であれば、それが失敗した私のオリジナルの答えと同じバグがあり、このテストを試してください:P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
ジェイク・コブ

それは本当だ !これは、最後の検証の1つで「+」の代わりに「&&」を使用したためです。おかげで、この問題は修正され、1バイト増えました。
ColdK 16

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==0False1-ord('A')%3です-1
ジェイクコブ

そうそう、あなたは正しい。謝罪いたします。%3<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!"}

出力(エラー文字列でない場合)は、キーが子の名前であるオブジェクトです。値は、子が受け取るプレゼントの配列です。

一対の冗長な括弧があることに気付いたときに2バイトを節約しました。

ゴルフされていないバージョン:

(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へようこそ!投稿がどのようにフォーマットされるかを理解しているようです。ハッピーコードゴルフ!
アタコ16

@ATacoありがとう!私は潜む
イアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.