ช่วย PPCG Claus ส่งของขวัญให้เขา!


15

ช่วย PPCG Claus ส่งของขวัญของเขา

ภาพรวม

PPCG Claus กำลังทำงานเฮลล่าส่งของขวัญของเขาช้าเพราะทุกวันนี้เรามี kiddos เล็ก ๆ น้อย ๆ ที่แปลกออกไปมากมาย สิ่งนี้ทำให้ PPCG Claus ยากที่จะรับของขวัญทั้งหมดไปยังสถานที่ที่ถูกต้อง ความท้าทายของคุณคือการช่วยให้เขานำเสนอของเขาได้อย่างถูกต้อง

ความซับซ้อน

ด้วยรายชื่อแรกที่เป็นตัวพิมพ์ใหญ่ซึ่งเป็นตัวแทนของเด็ก ๆ ที่เขาควรส่งให้และรายการของขวัญที่แสดงเป็นตัวเลขคุณจะต้องหาวิธีการแจกของขวัญในหมู่เด็ก ๆ ที่กล่าวมา แน่นอนว่ามีการจับแม้ว่า ....

ทุกวันนี้เด็ก ๆ จะจู้จี้จุกจิกถ้า kiddo เป็นเพื่อนที่แปลก (ตอนแรกคือรหัส ASCII คี่) เขาต้องการของขวัญแปลก ๆ ! หากเขาเป็นเพื่อนกัน (เริ่มแรกคือรหัส ASCII แม้) เขาเห็นได้ชัดว่าจะต้องได้รับแม้แต่คนเดียว! อย่างไรก็ตามเด็กที่มีการหารด้วย 3 เป็นเด็กซนที่ซุกซนดังนั้น PPCG Claus จะต้องไม่สนใจพวกเขาอย่างสมบูรณ์เพื่อให้พวกเขาประพฤติตนในปีหน้า ในการพิจารณาเส้นทางของเขาให้ประสบความสำเร็จเขาจะต้องมอบของขวัญทั้งหมดให้กับเด็กทุกคนที่สมควรได้รับและจะต้องไม่มอบของขวัญให้เด็กจำนวนมากเกินไป หากเด็กคนใดได้รับของขวัญมากกว่า 3 ชิ้นมากกว่าเพื่อนของเขาเขาอาจเสี่ยงต่อการเป็นเด็กซนในปีหน้าและนั่นก็ไม่ถูกต้อง! นอกจากนี้หากเด็กดีๆ คนใดต้องรับของขวัญเมื่อเด็กดีอีกคนไม่ทำเช่นนั้นก็จะทำให้เด็กคนนั้นชั่ว

ตัวอย่าง

เด็ก ๆ มีดังนี้:

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

  • Betty เป็นความหายนะของมนุษยชาติอย่างชัดเจนด้วยจำนวน 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] - Wellp พวกเขาอุทิศ
  • ไม่มีลูกดี
    • ["Betty"],[1,2,3] - หมุนเกลียว Betty อย่างจริงจัง
  • ไม่มีของขวัญหรือมีของขวัญน้อยกว่าเด็กดี
    • ["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

  • อินพุตแรกจะต้องเป็นสตริง / รายการ / สตริงที่คั่นด้วยจุลภาคของชื่อเต็มไม่ใช่แค่ชื่อแรก
  • อินพุตที่ 2 ต้องเป็นสตริงอาร์เรย์ / รายการ / คั่นด้วยเครื่องหมายจุลภาคของจำนวนเต็มบวก
  • ผลลัพธ์อาจเป็นการแสดงถึงวิธีการแจกจ่ายของขวัญที่เหมาะสม PPCGmas is Cancelled!หรือ

เกณฑ์การชนะ:

TL; DR: เบ็ตตี้เป็นคนที่กระตุกไม่ต้องแข่งขัน


ฉันไม่เข้าใจในตัวอย่างที่ว่าทำไมไม่ได้รับเบ็ตตี้3? แก้ไข : ถ้าหนึ่งควร "ขัน Betty" ทำไมเธออยู่ในความท้าทายเลยหรือไม่
NoOneIsHere

@SeeOneRhino B = 66, 66% 3 = 0, 66 หารด้วย 0, Betty ซน
Magic Octopus Urn

คำตอบ:


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?
Magic Octopus Urn

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


C[0]แทนการC.charCodeAt(0)บันทึก 11 ไบต์ นอกจากนี้เมื่อทรัพย์สินซ้ำหลายครั้งคุณสามารถจัดเก็บชื่อของมันเหมือนL='length'และใช้แทนi[L] i.length
Washington Guedes

2
ยังไงก็ตามยินดีต้อนรับสู่ PPCG !!
Washington Guedes

ขอบคุณสำหรับคำแนะนำ! : D ดีฉันได้ลอง C [0] แทน C.charCodeAt (0) (เบราว์เซอร์ firefox ที่ทันสมัยบน repl.it) และส่งคืน "PPCGmas ถูกยกเลิก" ในการตรวจสอบครั้งแรก ส่วนที่สองมันใช้งานได้ดีต้องขอบคุณ Bytes :)
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
Jake Cobb

โอ้ใช่คุณพูดถูก ขอโทษด้วย. %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! ดีใจที่เห็นคุณดูเหมือนจะเข้าใจว่าโพสต์รูปแบบอย่างไร แฮปปี้โค้ดกอล์ฟ
ATaco

@ ATaco ขอบคุณ! ฉันแฝงตัว
เอียน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.