PPCG Claus Hediyelerini Sunmasına Yardım Edin!


15

PPCG Claus'ın Hediyelerini Sunmasına Yardım Edin

genel bakış

PPCG Claus armağanlarını teslim etmek için geç saatlere kadar hella koşuyor çünkü bugünlerde çok sayıda tuhaf küçük kiddos var. Bu, PPCG Claus'ın tüm hediyeleri doğru yere almasını çok daha zorlaştırıyor. Senin zorluğun ona hediyelerini doğru bir şekilde iyileştirmesine yardım etmek.

Karmaşıklık

Teslim etmesi gereken çocukları temsil eden büyük harfli adların bir listesi ve sayılarla temsil edilen hediyelerin bir listesi verildiğinde, hediyeleri söz konusu çocuklar arasında nasıl dağıtacağınızı anlamanız gerekir. Tabii ki bir yakalama var ....

Günümüzde çocuklar seçici oluyor, eğer kiddo garip bir arkadaşsa (ilk baştaki ASCII kodu gariptir) garip bir hediye istiyor! Eğer eşit bir arkadaşsa (ilk baştaki ASCII kodu bile), ona açıkça bir tane bile verilmelidir! Bununla birlikte, 3'e bölünebilen herhangi bir çocuk yaramaz, yaramaz bir delikanlıdır, bu nedenle PPCG Claus'ın gelecek yıl davranışlarını sağlamak için onları tamamen görmezden gelmesi gerekir. Güzergahını bir başarı olarak görmek için, tüm hediyeleri, onları hak eden tüm çocuklara teslim etmeli ve herhangi bir çocuğa çok fazla hediye vermemelidir. Herhangi bir çocuk akranlarından 3+ daha fazla hediye alırsa, gelecek yıl yaramaz bir çocuk olma riski vardır ve bu doğru değildir! Ayrıca, eğer iyi bir çocuk başka bir iyi çocuk almadığında hediye alacak olsaydı, bu da o çocuğu kötülüğe çevirirdi.

Misal

Çocuklar aşağıdaki gibidir:

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

  • Betty, açıkça 3 numaralı katotlarda insanlığın çilesi.
  • Amy ve Clyde doğumdan beri tuhaflar ve hatta hediye almaktan nefret ediyorlardı.
  • Dave ve Francine normal, hatta çocuklar; sadece hediye bile almalılar!

Hediyeler aşağıdaki gibidir:

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

Olası bir çıktı:

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

İstisna Senaryoları

Ancak, PPCG Claus'ın hazır ve istekli olması, PPCG Claus'ın yapabileceği anlamına gelmez. İşte PPCG Claus'a kötü haberi şu mesajla kırmanız gereken istisna senaryolarının bir listesi:

PPCGmas is cancelled!

Aşağıdaki senaryolar Noel'in iptal edilmesine neden olacaktır:

  • Çocuk yok.
    • [],[1,2,3] - Pekala, dediler.
  • İyi çocuk yok.
    • ["Betty"],[1,2,3] - Cidden, Betty'yi mahvet.
  • İyi çocuklardan daha az hediye veya daha az hediye yoktur.
    • ["Amy","Charles"],[] - Bir veya daha fazla hediye almaz.
    • ["Amy","Charles"],[1] - Bir veya daha fazla hediye almaz.
  • Tüm iyi çocukları tatmin edecek tek / çift hediyeler yoktur.
    • ["Amy","Dave"],[2,4,6] - Amy mahvoldu.

PPCGmas'ı etkilememesi gereken senaryoların listesi:

  • Artık Hediyeler (Tüm çocuklar azami miktarda hediye almalıdır).
    • ["Amy","Dave"],[2,4,6,8,10,12,14,7,9] = [["Amy",[7,9]],["Dave",[2,4,6,8]]]

Tekrarlanan Ana Kurallar

  1. İyi çocuklar ilk başlangıcına göre eşit veya gariptir.
  2. Kötü çocuklar ilk olarak tamamen 3'e bölünebilir.
  3. Tüm iyi çocuklara en az bir hediye verilmelidir.
  4. Hiçbir iyi çocuk, diğer iyi çocuklardan 2'den fazla hediye almaz.
  5. Artık hediyeler olacaksa, bunları ihlal etmeden maksimum olarak dağıtmalısınız 4.
  6. Kötü çocuklar hiç hediye almamalıdır.
  7. Bunlardan HERHANGİ BİRİ ihlal edilirse , tam olarak çıktı almalısınız PPCGmas is cancelled!.

G / Ç Biçimi Gereksinimleri

  • 1. giriş, yalnızca ilk baş harf değil, bir dizi / liste / virgülle ayrılmış tam ad dizesi olmalıdır.
  • 2. giriş, dizi / liste / virgülle ayrılmış bir pozitif tamsayı dizisi olmalıdır.
  • Çıktı, mantıklı olan hediyeleri nasıl dağıttığınıza dair herhangi bir açıklama olabilir; veya PPCGmas is Cancelled!.

Kazanan Ölçüt:

TL; DR: Betty bir pislik, rekabet etme.


Anlamadım, örnekte Betty neden anlamıyor 3? EDIT : Eğer biri "Betty" vida gerekir, neden hiç meydan okuma?
NoOneIsHere

@SeeOneRhino B = 66, 66% 3 = 0, 66 0'a bölünebilir, Betty yaramaz.
Sihirli Ahtapot Urn

Yanıtlar:


4

APL, 171 bayt

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

Bu, hediyeleri sol argüman, çocukları doğru argüman olarak alır ve ilk sütunun çocukların adlarını ve ikinci sütunun aldıkları hediyeleri içerdiği bir matris döndürür.

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

Burada unngolfed versiyonu.


Bu ungolfed sürümünde konuştuğun "noel" nedir: P?
Sihirli Ahtapot Urn

4

JavaScript (ES6), 525 492 454 453 bayt

@Guedes sayesinde -71 bayt @Jake Cobb sayesinde -1 bit

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;}

Çevrimiçi deneyin!

Golfsiz sürüm

Daha golf olabilir sanırım. Ben sadece golfçü olmayan versiyonun bir yazılı çevirisini yaptım.

Bu şimdi "santa" oluşturan CharCode'un toplamından daha kısadır (115 + 97 + 110 + 116 + 97 = 535). Yeay


C[0]yerine C.charCodeAt(0)11 bayt kaydeder. Ayrıca, bir özellik birçok kez tekrarlandığında adını şöyle saklayabilir L='length've i[L]yerine kullanabilirsiniz i.length.
Washington Guedes

2
Bu arada, PPCG'ye hoş geldiniz !!
Washington Guedes

Tavsiyeler için teşekkürler! : D. Ben C.charCodeAt (0) (repl.it modern firefox tarayıcısı) yerine C [0] denedim ve ilk doğrulamada "PPCGmas iptal edildi" döndürür. İkincisi ise, iyi çalışıyor, Bytes için teşekkürler :)
ColdK

1
Bu, orijinal çocuklar ile aynı hataya sahiptir, burada iyi çocuklar çift veya tekse başarısız olur, bu testi deneyin:P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
Jake Cobb

Bu doğru ! Çünkü son doğrulamanın birinde "+" yerine "&&" kullandım. Senin sayende bu sorun giderildi ve bir bayt kazandım.
ColdK

4

Python 2, 334 355 354 bayt

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

Sadece çift veya tek garip çocuklar için 21 bayt kaybetti.

@TuukkaX sayesinde 1 bayt kaydedildi.


Çalışmıyor ord('A')%3==0, Falseama 1-ord('A')%3öyle -1.
Jake Cobb

Oh evet, haklısın. Özür dilerim. %3<1çalışmalı.
Yytsi

2

Javascript (ES6), 218 216 Bayt

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

Çıktı (hata dizesi değilse), anahtarları çocuk adları olan bir nesnedir; değer, çocuğun aldığı hediye dizisidir.

Bir çift yedekli parantezim olduğunu fark ettiğimde iki bayt kurtardım.

Ungolfed sürümü:

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

Merhaba, PPCG'ye hoş geldiniz! Yayınların nasıl biçimlendirildiğini anladığınıza sevindim. Mutlu Kod Golf!
ATaco

@ATaco Teşekkürler! Ben pusuda
Ian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.