Bantu PPCG Claus Memberikan Hadiahnya!

15

Bantu PPCG Claus Memberikan Hadiahnya

Gambaran

PPCG Claus terlambat mengantarkan hadiahnya karena saat ini kami memiliki begitu banyak anak kecil yang aneh di luar sana. Ini membuat PPCG Claus jauh lebih sulit untuk mendapatkan semua hadiah ke tempat yang benar. Tantangan Anda adalah membantunya mengembalikan hadiahnya dengan benar.

Kompleksitas

Diberi daftar nama depan berhuruf besar yang mewakili anak-anak yang seharusnya ia kirimi dan daftar hadiah yang diwakili oleh angka-angka, Anda harus mencari cara untuk mendistribusikan hadiah di antara anak-anak tersebut. Tentu saja ada tangkapan ....

Saat ini anak-anak semakin pilih-pilih, jika anak itu adalah orang yang aneh (inisial pertama adalah kode ASCII ganjil) ia menginginkan hadiah yang aneh! Jika dia orang yang genap (inisial pertama adalah kode ASCII genap) dia jelas harus diberi genap genap! Namun, setiap anak yang dapat dibagi 3, adalah anak yang nakal, nakal, sehingga PPCG Claus harus sepenuhnya mengabaikan mereka untuk membuat mereka berperilaku tahun depan. Untuk menganggap rutenya sukses, ia harus memberikan semua hadiah kepada semua anak yang pantas mendapatkannya dan tidak boleh memberi terlalu banyak hadiah kepada satu anak. Jika ada anak yang mendapat 3+ lebih banyak hadiah dari teman-temannya, ia berisiko menjadi anak yang nakal tahun depan, dan itu tidak benar! Juga, jika ada anak yang baik menerima hadiah ketika anak lain yang baik tidak, itu juga akan mengubah anak itu jahat.

Contoh

Anak-anak adalah sebagai berikut:

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

  • Betty adalah kutukan kemanusiaan, jelas bersekongkol dengan nomor 3.
  • Amy dan Clyde telah menjadi orang aneh sejak lahir dan tidak suka menerima hadiah.
  • Dave dan Francine normal, bahkan, anak-anak; mereka seharusnya hanya menerima hadiah!

Hadiahnya adalah sebagai berikut:

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

Satu kemungkinan keluaran adalah:

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

Skenario Pengecualian

Namun, hanya karena PPCG Claus siap dan mau, tidak berarti PPCG Claus bisa. Berikut daftar skenario pengecualian di mana Anda harus menyampaikan kabar buruk ke PPCG Claus dengan pesan:

PPCGmas is cancelled!

Skenario berikut akan mengakibatkan Natal dibatalkan:

  • Tidak ada anak.
    • [],[1,2,3] - Wellp, mereka ded.
  • Tidak ada anak yang baik.
    • ["Betty"],[1,2,3] - Serius, sekrup Betty.
  • Tidak ada hadiah, atau hadiah kurang dari anak-anak yang baik.
    • ["Amy","Charles"],[] - Satu atau lebih tidak akan menerima hadiah.
    • ["Amy","Charles"],[1] - Satu atau lebih tidak akan menerima hadiah.
  • Tidak ada hadiah aneh / genap untuk memuaskan semua anak yang baik.
    • ["Amy","Dave"],[2,4,6] - Amy kacau.

Berikut daftar skenario yang seharusnya tidak memengaruhi PPCGmas:

  • Hadiah Sisa (Semua anak harus menerima hadiah dalam jumlah maksimal).
    • ["Amy","Dave"],[2,4,6,8,10,12,14,7,9] = [["Amy",[7,9]],["Dave",[2,4,6,8]]]

Aturan Utama Diulang

  1. Anak yang baik bisa genap atau ganjil, berdasarkan inisial pertama mereka.
  2. Anak-anak yang buruk memiliki inisial pertama yang sepenuhnya dapat dibagi oleh 3.
  3. Semua anak yang baik harus menerima setidaknya satu hadiah.
  4. Tidak ada anak yang baik yang menerima lebih dari 2 hadiah lebih dari anak baik lainnya.
  5. Jika ada sisa hadiah Anda harus mendistribusikannya secara maksimal, tanpa melanggar 4.
  6. Anak-anak yang nakal tidak boleh menerima hadiah sama sekali.
  7. Jika ada dari ini yang dilanggar, Anda harus mengeluarkan PPCGmas is cancelled!, tepatnya.

Persyaratan Format I / O

  • Input pertama harus berupa array / list / string nama lengkap yang dibatasi koma, bukan hanya inisial pertama.
  • Input kedua harus berupa string array / daftar / dibatasi koma dari bilangan bulat positif.
  • Keluarannya bisa berupa denotasi bagaimana Anda mendistribusikan hadiah yang masuk akal; atau PPCGmas is Cancelled!.

Kriteria Kemenangan:

TL; DR: Betty brengsek, jangan bersaing.

Guci Gurita Ajaib
sumber
Saya tidak mengerti, dalam contoh, mengapa Betty tidak mengerti 3? EDIT : Jika seseorang harus "sekrup Betty", mengapa dia dalam tantangan sama sekali?
NoOneIsHere
@SeeOneRhino B = 66, 66% 3 = 0, 66 habis dibagi 0, Betty nakal.
Magic Gurita Guci

Jawaban:

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

Ini mengambil hadiah sebagai argumen kiri, anak-anak sebagai argumen kanan, dan mengembalikan matriks di mana kolom pertama berisi nama-nama anak-anak dan kolom kedua berisi hadiah yang mereka dapatkan.

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

Versi tidak dikolomasikan di sini.

marinus
sumber
Apa "natal" yang kamu bicarakan dalam versi yang tidak disunat: P?
Magic Gurita Guci
4

JavaScript (ES6), 525 492 454 453 byte

-71 byte terima kasih kepada @Guedes -1 bit berkat @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;}

Cobalah online!

Versi non-golf

Bisa jadi saya lebih golf. Saya baru saja melakukan terjemahan litteral dari versi non-golf.

Ini sekarang lebih pendek dari jumlah CharCode yang menyusun "santa" (115 + 97 + 110 + 116 + 97 = 535). Yeay

ColdK
sumber
C[0]bukannya C.charCodeAt(0)menghemat 11 byte. Juga, ketika sebuah properti berulang kali Anda dapat menyimpan namanya L='length', dan menggunakannya i[L]sebagai gantinya i.length.
Washington Guedes
2
Ngomong-ngomong, selamat datang di PPCG !!
Washington Guedes
Terima kasih atas sarannya! : D. Yah saya sudah mencoba C [0] bukannya C.charCodeAt (0) (browser firefox modern di repl.it) dan mengembalikan "PPCGmas dibatalkan" pada verifikasi pertama. Adapun yang kedua, ini bekerja dengan baik, terima kasih untuk Bytes :)
ColdK
1
Ini memiliki bug yang sama dengan jawaban awal saya di mana gagal jika anak-anak baik semuanya genap atau aneh, coba tes ini:P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
Jake Cobb
Itu benar ! Itu karena saya menggunakan "&&" daripada "+" di salah satu verifikasi terakhir. Terima kasih kepada Anda masalah ini sekarang sudah diperbaiki, dan saya memperoleh satu byte.
ColdK
4

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

Kehilangan 21 byte untuk menangani kasus anak-anak yang hanya-genap atau hanya-aneh.

Disimpan 1 byte berkat @TuukkaX.

Jake Cobb
sumber
Tidak bekerja, ord('A')%3==0adalah Falsetetapi 1-ord('A')%3adalah -1.
Jake Cobb
Oh ya, kamu benar. Permintaan maaf saya. %3<1harus bekerja.
Yytsi
2

Javascript (ES6), 218 216 Bytes

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

Output (jika bukan string kesalahan) adalah objek yang kuncinya adalah nama anak-anak; nilainya adalah susunan hadiah yang diterima anak.

Menyimpan dua byte ketika saya menyadari bahwa saya memiliki sepasang kurung yang berlebihan.

Versi tidak disatukan:

(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.
}
Ian
sumber
Hai, Selamat Datang di PPCG! Senang melihat Anda tampaknya mengerti bagaimana posting diformat. Golf Kode Selamat!
ATaco
@ ASaco Terima kasih! Saya mengintai
Ian