Giúp ClausG Claus giao quà của mình!


15

Giúp ClausG Claus giao quà

Tổng quat

PPCG Claus đang chạy chậm giao quà vì ngày nay chúng ta có rất nhiều đứa trẻ kỳ quặc ngoài kia. Điều này khiến cho PPCG Claus gặp khó khăn hơn nhiều trong việc đưa tất cả các món quà đến đúng nơi. Thử thách của bạn là giúp anh ấy khoe những món quà của mình một cách chính xác.

Sự phức tạp

Đưa ra một danh sách các tên đầu tiên được viết hoa đại diện cho những đứa trẻ mà anh ta sẽ gửi đến và một danh sách các món quà được đại diện bởi các con số, bạn phải tìm ra cách phân phối các món quà cho những đứa trẻ nói trên. Tất nhiên là có một cái bẫy mặc dù ....

Ngày nay trẻ em rất kén chọn, nếu kiddo là một người kỳ quặc (chữ cái đầu tiên là mã lẻ ASCII) anh ấy muốn một món quà kỳ lạ! Nếu anh ta là một người đồng đều (chữ cái đầu tiên là mã ASCII) thì rõ ràng anh ta phải được cấp một số chẵn! Tuy nhiên, bất kỳ đứa trẻ nào chia hết cho 3 là một đứa trẻ nghịch ngợm, nghịch ngợm, vì vậy, PPCG Claus phải hoàn toàn phớt lờ chúng để khiến chúng cư xử vào năm tới. Để coi con đường của mình là một thành công, anh ta phải giao tất cả quà cho tất cả những đứa trẻ xứng đáng với chúng và không được tặng cho bất kỳ một đứa trẻ nào quá nhiều quà. Nếu bất kỳ đứa trẻ nào nhận được hơn 3 món quà so với các bạn cùng lứa, nó có nguy cơ trở thành một đứa trẻ nghịch ngợm vào năm tới, và điều đó không đúng! Ngoài ra, nếu có tốt con đã nhận được một món quà khi khác tốt đứa trẻ không, đó cũng sẽ biến con ác.

Thí dụ

Những đứa trẻ như sau:

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

  • Betty là nguyên nhân suy sụp của nhân loại, rõ ràng trong các cahoots với số 3.
  • Amy và Clyde đã trở thành những kẻ lập dị từ khi sinh ra và rất ghét nhận những món quà.
  • Dave và Francine là bình thường, thậm chí, trẻ em; họ chỉ nên nhận quà!

Các món quà như sau:

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

Một đầu ra có thể là:

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

Kịch bản ngoại lệ

Tuy nhiên, chỉ vì Claus PPCG đã sẵn sàng và sẵn sàng, điều đó không có nghĩa là Claus PPCG có thể. Dưới đây là danh sách các trường hợp ngoại lệ trong đó bạn phải gửi tin xấu cho PPCG Claus với thông báo:

PPCGmas is cancelled!

Các kịch bản sau đây sẽ dẫn đến Giáng sinh bị hủy bỏ:

  • Không có con.
    • [],[1,2,3] - Wellp, họ suy luận.
  • Không có con ngoan.
    • ["Betty"],[1,2,3] - Nghiêm túc, vít Betty.
  • Không có quà, hoặc ít quà hơn trẻ em tốt.
    • ["Amy","Charles"],[] - Một hoặc nhiều sẽ không nhận được quà.
    • ["Amy","Charles"],[1] - Một hoặc nhiều sẽ không nhận được quà.
  • Không có quà lẻ / thậm chí quà để làm hài lòng tất cả trẻ em tốt.
    • ["Amy","Dave"],[2,4,6] - Amy bị vặn vẹo.

Dưới đây là danh sách các kịch bản không nên ảnh hưởng đến PPCGmas:

  • Quà còn lại (Tất cả trẻ em sẽ nhận được số lượng quà tối đa).
    • ["Amy","Dave"],[2,4,6,8,10,12,14,7,9] = [["Amy",[7,9]],["Dave",[2,4,6,8]]]

Các quy tắc chính được nhắc lại

  1. Những đứa trẻ ngoan là chẵn hoặc lẻ, dựa trên chữ cái đầu tiên của chúng.
  2. Trẻ em xấu có số chia ban đầu hoàn toàn chia hết cho 3.
  3. Tất cả trẻ em tốt phải nhận được ít nhất một món quà.
  4. Không có đứa trẻ ngoan nào được nhận nhiều hơn 2 món quà nhiều hơn bất kỳ đứa trẻ ngoan nào khác.
  5. Nếu có những món quà còn sót lại, bạn phải phân phối tối đa chúng, mà không vi phạm 4.
  6. Trẻ em xấu không được nhận quà gì cả.
  7. Nếu BẤT K of điều này bị vi phạm, bạn phải xuất PPCGmas is cancelled!chính xác.

Yêu cầu định dạng I / O

  • Đầu vào thứ nhất phải là một chuỗi tên / danh sách / dấu phẩy được phân tách bằng dấu phẩy, không chỉ là chữ cái đầu tiên.
  • Đầu vào thứ 2 phải là một chuỗi / danh sách / chuỗi được phân tách bằng dấu phẩy của các số nguyên dương.
  • Đầu ra có thể là bất kỳ biểu thị nào về cách bạn phân phối các món quà có ý nghĩa; hoặc PPCGmas is Cancelled!.

Tiêu chí chiến thắng:

TL; DR: Betty là một thằng ngốc, đừng cạnh tranh.


Tôi không hiểu, trong ví dụ, tại sao Betty không nhận được 3? EDIT : Nếu một người nên "bắt vít Betty", tại sao cô ấy lại ở trong thử thách?
NoOneIsHere

@SeeOneRhino B = 66, 66% 3 = 0, 66 chia hết cho 0, Betty nghịch ngợm.
Bạch tuộc ma thuật Urn

Câu trả lời:


4

APL, 171 byte

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

Điều này lấy các món quà làm đối số bên trái, các con làm đối số bên phải và trả về một ma trận trong đó cột đầu tiên chứa tên của các con và cột thứ hai chứa các quà chúng nhận được.

Testcase:

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

Phiên bản Ungolfed ở đây.


"Giáng sinh" này mà bạn nói trong phiên bản không có gì: P?
Bạch tuộc ma thuật Urn

4

JavaScript (ES6), 525 492 454 453 byte

-71 byte nhờ @Guedes -1 bit nhờ @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;}

Hãy thử trực tuyến!

Phiên bản không chơi gôn

Tôi có thể chơi golf nhiều hơn. Tôi vừa thực hiện một bản dịch rác của phiên bản không chơi gôn.

Điều này bây giờ ngắn hơn tổng của CharCode sáng tác "santa" (115 + 97 + 110 + 116 + 97 = 535). Yeay


C[0]thay vì C.charCodeAt(0)tiết kiệm 11 byte. Ngoài ra, khi một tài sản lặp đi lặp lại nhiều lần, bạn có thể lưu trữ tên của nó như thế nào L='length'và sử dụng i[L]thay vì i.length.
Washington Guedes

2
Nhân tiện, chào mừng bạn đến với PPCG !!
Washington Guedes

Cảm ơn bạn cho lời khuyên! : D. Vâng, tôi đã thử C [0] thay vì C.charCodeAt (0) (trình duyệt firefox hiện đại trên repl.it) và nó trả về "PPCGmas bị hủy" trong lần xác minh đầu tiên. Về phần thứ hai, nó hoạt động tốt, cảm ơn các byte :)
ColdK

1
Điều này có cùng một lỗi với câu trả lời ban đầu của tôi khi nó không thành công nếu những đứa trẻ ngoan đều chẵn hoặc lẻ, hãy thử bài kiểm tra này:P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
Jake Cobb

Đúng ! Đó là vì tôi đã sử dụng "&&" thay vì "+" trong một trong những xác minh cuối cùng. Nhờ có bạn, vấn đề này đã được khắc phục và tôi đã đạt được một byte.
ColdK

4

Con trăn 2 334 355 354 byte

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

Mất 21 byte để xử lý trường hợp trẻ em chỉ chẵn hoặc chỉ lẻ.

Đã lưu 1 byte nhờ @TuukkaX.


Không làm việc, ord('A')%3==0Falsenhưng 1-ord('A')%3-1.
Jake Cobb

Ồ vâng, bạn đúng. Lời xin lỗi của tôi. %3<1nên làm việc.
Yytsi

2

Javascript (ES6), 218 216 byte

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

Đầu ra (nếu không phải là chuỗi lỗi) là một đối tượng có khóa là tên của trẻ em; giá trị là mảng quà mà trẻ nhận được.

Đã lưu hai byte khi tôi nhận ra mình có một cặp dấu ngoặc thừa.

Phiên bản bị đánh cắp:

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

Xin chào, Chào mừng đến với PPCG! Vui mừng khi thấy bạn dường như hiểu cách bài viết được định dạng. Chúc mừng Code-Golfing!
ATaco

@ATaco Cảm ơn! Tôi ẩn nấp
Ian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.