Ajude o PPCG Claus a entregar seus presentes!


15

Ajude o PPCG Claus a entregar seus presentes

Visão geral

PPCG Claus está atrasado na entrega de presentes porque hoje em dia temos tantos pequenos meninos estranhos por aí. Isso torna muito mais difícil para o PPCG Claus levar todos os presentes para o local correto. Seu desafio é ajudá-lo a entregar os presentes corretamente.

A complexidade

Dada uma lista de nomes em maiúscula representando as crianças para as quais ele deveria entregar e uma lista de presentes representados por números, você deve descobrir como distribuir os presentes entre as crianças mencionadas. Claro que há um problema ...

Hoje em dia as crianças estão ficando exigentes, se o garoto é um sujeito estranho (a primeira inicial é estranha com código ASCII), ele quer um presente estranho! Se ele é um companheiro par (a primeira inicial é o código ASCII mesmo), obviamente ele deve receber um par! Qualquer criança divisível por 3, no entanto, é um rapaz travesso, travesso, então o PPCG Claus deve ignorá-los completamente para fazê-los se comportar no próximo ano. Para considerar seu caminho um sucesso, ele deve entregar todos os presentes a todas as crianças que os merecem e não deve dar muitos presentes a nenhuma criança. Se uma criança recebe mais de três presentes do que seus pares, ela corre o risco de se tornar uma criança travessa no próximo ano, e isso não está certo! Além disso, se qualquer criança boa recebesse um presente quando outra criança boa não, isso também tornaria a criança má.

Exemplo

As crianças são as seguintes:

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

  • Betty é a ruína da humanidade, claramente em desacordo com o número 3.
  • Amy e Clyde são esquisitos desde o nascimento e odeiam receber até presentes.
  • Dave e Francine são normais, até crianças; eles devem receber apenas presentes!

Os presentes são os seguintes:

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

Uma saída possível seria:

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

Cenários de exceção

No entanto, apenas porque o PPCG Claus está pronto e disposto, não significa que o PPCG Claus possa. Aqui está uma lista de cenários de exceção em que você deve apresentar as más notícias ao PPCG Claus com uma mensagem de:

PPCGmas is cancelled!

Os seguintes cenários resultarão no cancelamento do Natal:

  • Não há filhos.
    • [],[1,2,3] - Wellp, eles deduziram.
  • Não há bons filhos.
    • ["Betty"],[1,2,3] - Sério, foda-se Betty.
  • Não há presentes, ou menos presentes do que bons filhos.
    • ["Amy","Charles"],[] - Um ou mais não receberiam presentes.
    • ["Amy","Charles"],[1] - Um ou mais não receberiam presentes.
  • Não há presentes ímpares / pares para satisfazer todos os bons filhos.
    • ["Amy","Dave"],[2,4,6] - Amy está ferrada.

Aqui está uma lista de cenários que não devem afetar o PPCGmas:

  • Sobras de presentes (todas as crianças devem receber a quantidade máxima de presentes).
    • ["Amy","Dave"],[2,4,6,8,10,12,14,7,9] = [["Amy",[7,9]],["Dave",[2,4,6,8]]]

Regras Principais Reiteradas

  1. Os bons filhos são pares ou ímpares, com base em sua primeira inicial.
  2. Filhos maus têm uma primeira inicial totalmente divisível por 3.
  3. Todas as crianças boas devem receber pelo menos um presente.
  4. Nenhuma criança boa deve receber mais de 2 presentes a mais do que qualquer outra criança boa.
  5. Se houver restos de presentes, você deve distribuí-los ao máximo, sem violar 4.
  6. Filhos maus não devem receber presentes.
  7. Se ALGUM deles for violado, você deve enviar PPCGmas is cancelled!exatamente.

Requisitos de formato de E / S

  • A primeira entrada deve ser uma sequência de nomes completos, delimitada por vírgula / matriz / lista, e não apenas a primeira inicial.
  • A segunda entrada deve ser uma cadeia de caracteres de lista / lista / delimitada por vírgulas de números inteiros positivos.
  • A saída pode ser qualquer indicação de como você distribuiu os presentes que faz sentido; ou PPCGmas is Cancelled!.

Critério vencedor:

TL; DR: Betty é um idiota, não concorra.


Não entendo, no exemplo, por que Betty não entende 3? EDIT : Se alguém deveria "estragar a Betty", por que ela está no desafio?
NoOneIsHere

@SeeOneRhino B = 66, 66% 3 = 0, 66 é divisível por 0, Betty é travessa.
Magic Octopus Urn

Respostas:


4

APL, 171 bytes

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

Isso leva os presentes como argumento à esquerda, os filhos como argumento à direita e retorna uma matriz em que a primeira coluna contém os nomes dos filhos e a segunda coluna contém os presentes que recebem.

Casos de teste:

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

Versão não destruída aqui.


O que é esse "natal" do qual você fala na versão não destruída: P?
Magic Octopus Urn

4

JavaScript (ES6), 525 492 454 453 bytes

-71 bytes graças a @Guedes -1 bit graças a @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;}

Experimente online!

Versão sem golfe

Pode ser mais jogado, eu acho. Acabei de fazer uma tradução literária da versão não-golfe.

Agora é menor que a soma do CharCode que compõe "santa" (115 + 97 + 110 + 116 + 97 = 535). Sim


C[0]em vez de C.charCodeAt(0)salva 11 bytes. Além disso, quando uma propriedade se repete muitas vezes, você pode armazenar seu nome como L='length'e usar em i[L]vez de i.length.
Washington Guedes

2
A propósito, bem-vindo ao PPCG !!
Washington Guedes

Obrigado pelos conselhos! : D. Bem, eu tentei C [0] em vez de C.charCodeAt (0) (navegador Firefox moderno no repl.it) e ele retorna "PPCGmas is cancel" na primeira verificação. Quanto ao segundo, funciona bem, obrigado pelos bytes :)
ColdK

1
Isto tem o mesmo bug como a minha resposta original onde ele falhar se os bons filhos são todos mesmo ou toda impar, tente este teste:P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
Jake Cobb

Isso é verdade ! Foi porque eu usei "&&" em vez de "+" em uma das últimas verificações. Graças a você, esse problema foi corrigido e ganhei um byte.
ColdK

4

Python 2, 334 355 354 bytes

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

Perdeu 21 bytes para lidar com casos de filhos únicos ou pares.

Guardou 1 byte graças a @TuukkaX.


Não funciona, ord('A')%3==0é Falsemas 1-ord('A')%3é -1.
Jake Cobb

Oh sim, você está certo. Me desculpe. %3<1Deveria trabalhar.
Yytsi 10/01

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

A saída (se não for a string de erro) é um objeto cujas chaves são os nomes das crianças; o valor é a matriz de presentes que o filho recebe.

Salvei dois bytes quando percebi que tinha um par de parênteses redundantes.

Versão não destruída:

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

Olá, Bem-vindo ao PPCG! Fico feliz em ver que você parece entender como as postagens são formatadas. Código-Golfe feliz!
ATaco

@ ATaco Obrigado! Eu espreito
Ian
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.