¡Ayuda a PPCG Claus a entregar sus regalos!

15

Ayuda a PPCG Claus a entregar sus regalos

Visión general

PPCG Claus está llegando tarde a entregar sus regalos porque hoy en día tenemos muchos niños pequeños extraños por ahí. Esto hace que sea mucho más difícil para PPCG Claus llevar todos los regalos al lugar correcto. Su desafío es ayudarlo a deleitar sus regalos correctamente.

La complejidad

Dada una lista de nombres en mayúscula que representan a los niños a los que se supone que debe entregar y una lista de regalos representados por números, debe descubrir cómo distribuir los regalos entre dichos niños. Por supuesto que hay una trampa ...

Hoy en día los niños se vuelven exigentes, si el niño es un tipo extraño (la primera inicial es un código ASCII extraño) ¡quiere un regalo extraño! Si es un compañero par (la primera inicial es un código ASCII par), ¡obviamente debe recibir uno par! Sin embargo, cualquier niño divisible por 3 es un chico travieso, travieso, por lo que PPCG Claus debe ignorarlos por completo para que se comporten el próximo año. Para considerar su ruta como un éxito, debe entregar todos los regalos a todos los niños que los merecen y no debe dar a ningún niño demasiados regalos. Si algún niño recibe más de 3 regalos más que sus compañeros, corre el riesgo de convertirse en un niño travieso el próximo año, ¡y eso no está bien! Además, si cualquier niño bueno recibiera un regalo cuando otro niño bueno no lo hizo, eso también convertiría a ese niño en malvado.

Ejemplo

Los niños son los siguientes:

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

  • Betty es la ruina de la humanidad, claramente confabulada con el número 3.
  • Amy y Clyde han sido raros desde su nacimiento y odiarían recibir incluso regalos.
  • Dave y Francine son normales, incluso, niños; ¡solo deberían recibir regalos!

Los regalos son los siguientes:

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

Una salida posible sería:

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

Escenarios de excepción

Sin embargo, solo porque PPCG Claus esté listo y dispuesto, no significa que PPCG Claus pueda. Aquí hay una lista de escenarios de excepción donde debe comunicar las malas noticias a PPCG Claus con un mensaje de:

PPCGmas is cancelled!

Los siguientes escenarios resultarán en la cancelación de la Navidad:

  • No hay niños
    • [],[1,2,3] - Wellp, ellos ded.
  • No hay buenos niños.
    • ["Betty"],[1,2,3] - En serio, joder Betty.
  • No hay regalos, o menos regalos que buenos niños.
    • ["Amy","Charles"],[] - Uno o más no recibirían regalos.
    • ["Amy","Charles"],[1] - Uno o más no recibirían regalos.
  • No hay regalos pares / impares para satisfacer a todos los niños buenos.
    • ["Amy","Dave"],[2,4,6] - Amy está jodida.

Aquí hay una lista de escenarios que no deberían afectar a PPCGmas:

  • Regalos sobrantes (Todos los niños deben recibir la cantidad máxima de regalos).
    • ["Amy","Dave"],[2,4,6,8,10,12,14,7,9] = [["Amy",[7,9]],["Dave",[2,4,6,8]]]

Reglas principales reiteradas

  1. Los niños buenos son pares o impares, según su primera inicial.
  2. Los niños malos tienen una primera inicial totalmente divisible por 3.
  3. Todos los niños buenos deben recibir al menos un regalo.
  4. Ningún niño bueno debe recibir más de 2 regalos más que cualquier otro niño bueno.
  5. Si va a haber sobras de regalos, debe distribuirlos al máximo, sin violar 4.
  6. Los niños malos no deben recibir regalos.
  7. Si se infringe CUALQUIERA de estos, debe generar resultados PPCGmas is cancelled!exactamente.

Requisitos de formato de E / S

  • La primera entrada debe ser una cadena delimitada por matriz / lista / delimitada por comas de nombres completos, no solo la primera inicial.
  • La segunda entrada debe ser una serie de enteros positivos delimitados por comas / listas / comas.
  • El resultado puede ser cualquier denotación de cómo distribuyó los regalos que tiene sentido; o PPCGmas is Cancelled!.

Criterio ganador:

TL; DR: Betty es una idiota, no compitas.

Urna de pulpo mágico
fuente
No entiendo, en el ejemplo, ¿por qué Betty no entiende 3? EDITAR : Si uno debe "joder a Betty", ¿por qué está ella en el desafío?
NoOneIsHere
@SeeOneRhino B = 66, 66% 3 = 0, 66 es divisible por 0, Betty es traviesa.
Urna de pulpo mágico

Respuestas:

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

Esto toma los regalos como argumento izquierdo, los hijos como argumento derecho, y devuelve una matriz donde la primera columna contiene los nombres de los hijos y la segunda columna contiene los regalos que reciben.

Casos de prueba:

      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ón sin golf aquí.

marinus
fuente
¿Qué es esta "navidad" de la que hablas en la versión no golfista: P?
Magic Octopus Urn
4

JavaScript (ES6), 525 492 454 453 bytes

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

Pruébalo en línea!

Versión sin golf

Puede ser más golf, creo. Acabo de hacer una traducción literal de la versión sin golf.

Esto ahora es más corto que la suma del CharCode que compone "santa" (115 + 97 + 110 + 116 + 97 = 535). Yeay

ColdK
fuente
C[0]en lugar de C.charCodeAt(0)guardar 11 bytes. Además, cuando una propiedad se repite muchas veces, puede almacenar su nombre como L='length'y usar en i[L]lugar de i.length.
Washington Guedes
2
Por cierto, bienvenidos a PPCG !!
Washington Guedes
Gracias por los consejos! :RE. Bueno, he intentado C [0] en lugar de C.charCodeAt (0) (navegador moderno de Firefox en repl.it) y devuelve "PPCGmas está cancelado" en la primera verificación. En cuanto a la segunda, funciona bien, gracias por los Bytes :)
ColdK
1
Esto tiene el mismo error que mi respuesta original donde falla si los niños buenos son todos pares o impares, intente esta prueba:P(["Amy", "Betty", "Clyde"],[1,2,3,4,5,6,7,8,9,10,11,12,13,14]);
Jake Cobb
Es verdad ! Fue porque usé "&&" en lugar de "+" en una de las últimas verificaciones. Gracias a ti, este problema ya está solucionado y gané un 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))

Perdió 21 bytes para manejar el caso de hijos únicos o pares.

Guardado 1 byte gracias a @TuukkaX.

Jake Cobb
fuente
No funciona, ord('A')%3==0es Falsepero 1-ord('A')%3es -1.
Jake Cobb
Oh si, tienes razon. Mis disculpas. %3<1Deberia trabajar.
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!"}

La salida (si no es la cadena de error) es un objeto cuyas claves son los nombres de los niños; el valor es la matriz de regalos que recibe el niño.

Ahorré dos bytes cuando me di cuenta de que tenía un par de paréntesis redundantes.

Versión sin golf:

(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
fuente
Hola, bienvenido a PPCG! Me alegra ver que parece entender cómo se formatean las publicaciones. Happy Code-Golfing!
ATaco
@ATaco ¡Gracias! Estoy al acecho
Ian