Aidez-moi à remplir mon portefeuille!

9

Il y a quelque temps, j'ai acheté un nouveau portefeuille qui peut contenir 8 cartes (4 des deux côtés). Cependant, il me semble que j'ai beaucoup plus de cartes que cela et je dois faire des choix sur celles que je veux emporter avec moi. Certaines cartes que j'utilise plus souvent que d'autres, mais les cartes que je préfère emporter avec moi ne sont pas nécessairement celles que j'utilise le plus.

Le défi

Étant donné une pile de cartes, retournez la disposition de mon portefeuille de la meilleure façon possible par mes préférences et restrictions. La disposition doit être la suivante:

__ __ (row 1)
__ __ (row 2)
__ __ (row 3)
__ __ (row 4)

Actuellement, je possède les cartes suivantes - les piles consisteront toujours en une sélection parmi celles-ci:

  • 1 carte d'identité ( ID )
  • 1 permis de conduire ( DL )
  • 2 cartes de crédit ( CC )
  • 5 cartes de débit ( DC )
  • 1 carte de transport public ( PC )
  • 1 carte d'accès au gymnase ( GC )
  • 9 cartes de membre de magasins et entrepôts aléatoires ( MC )

J'ai quelques préférences et restrictions:

  • Cartes triées par priorité: ID, DL, CC, DC, PC, GC, MC
  • Cartes triées par fréquence d'utilisation: CC, DC, PC, GC, MC, ID, DL
  • Pour des raisons de sécurité, le nombre total de cartes de débit et de cartes de crédit dans mon portefeuille peut être au plus 1 de plus que la somme de toutes les autres cartes qui iront dans mon portefeuille ( N DC + N CCN ID + N DL + N PC + N GC + N MC +1).
  • S'ils sont présents, ma carte d'identité et mon permis de conduire doivent toujours aller dans la rangée 1. Cela ne signifie pas que d'autres cartes ne peuvent pas occuper des places dans la rangée 1.
  • Les cartes de la pile les plus fréquemment utilisées doivent toujours aller dans la rangée 4.

Règles

  • Aucune carte 2 ne peut occuper la même place.
  • Les cartes de priorité élevée sont toujours préférées aux cartes de priorité inférieure, sauf si la restriction DC / CC intervient.
  • ID / DL à la ligne 1 annule la règle de fréquence: si seul l'ID est fourni, il ira à la ligne 1 et la ligne 4 sera vide!
  • Le formatage d'entrée peut être effectué comme vous le souhaitez, tant que l'ordre de la pile d'entrée est conservé. eg ID,CC,PC,MC,MC,MC,DLpeut également être fourni comme eg 1ID 1CC 1PC 3MC 1DL 0DC 0GCou ID CC PC MC MC MC DL.
  • Le formatage de sortie a quelques restrictions: les lignes doivent toutes commencer à une nouvelle ligne, les colonnes doivent être délimitées d'une manière ou d'une autre. Les espaces vides peuvent être présentés comme vous le souhaitez, tant que cela ne gâche pas la disposition 4x2.

  • Il peut y avoir plus d'une solution / commande, c'est à vous de choisir celle que vous fournissez en sortie.

  • Vous pouvez supposer que les cartes du même type seront toujours regroupées en entrée.
  • En dehors de ce qui précède, règles et échappatoires standard code s'appliquent.

Prime

Vous êtes autorisé à retirer 15% de votre bytecount si vous retournez également des cartes qui ne sont pas entrées dans le portefeuille. Imprimer "Ça va!" en cas d'absence de cartes restantes. Cette sortie supplémentaire doit être clairement séparée de la disposition de retour.

Exemples

Contribution:

ID, DL, CC, GC, MC

2 sorties possibles:

ID DL      DL ID
__ __  or  __ MC
MC __      __ __
CC GC      GC CC

optional: It fits!

Contribution:

ID, CC, DC, PC, GC, MC, MC, MC, MC, MC

2 sorties possibles:

ID MC      GC ID
MC MC  or  MC PC
PC GC      MC MC
CC DC      DC CC

optional: e.g. (MC, MC)  or  (2MC)

Contribution:

DC, DC, CC, CC, GC, DL

2 sorties possibles:

DL __      GC DL
__ __  or  DC __
GC DC      __ __
CC CC      CC CC

optional: e.g. (DC)  or  (1DC)

Contribution:

CC, DC, DC, DC

2 sorties possibles:

__ __      __ __
__ __  or  __ __
__ __      __ __
CC __      __ CC

optional: e.g. (DC, DC, DC)  or  (3DC)

Contribution:

CC, CC, MC, MC, MC, MC, MC, MC, PC, DC, DC, DC, DC, DC, GC

2 sorties possibles:

MC MC      MC DC
PC GC  or  DC GC
DC DC      PC MC
CC CC      CC CC

optional: e.g. (DC, DC, DC, MC, MC, MC, MC)  or  (3DC, 4MC)

Contribution:

MC, MC, MC, MC, MC, MC, MC

2 sorties possibles:

__ MC      MC MC
MC MC  or  MC MC
MC MC      MC __
MC MC      MC MC

optional: It fits!

Contribution:

ID, CC

2 sorties possibles:

ID __      __ ID
__ __  or  __ __
__ __      __ __
CC __      CC __

optional: It fits!

Il s'agit de , donc le code le plus court (en octets) l'emporte.

slvrbld
la source

Réponses:

3

Java 10, 385 384 382 octets

C->{String[]R=new String[8],F={"CC","DC","PC","GC","MC"};int c=C.size(),i=1,s=0;c=c>8?8:c;for(var q:C)if("DCC".contains(q))s++;for(;s>c- --s;c=(c=C.size())>8?8:c)i=C.remove(F[i])?i:0;for(c=0,i=8;i>0&c<5;c++)for(;i>0&C.remove(F[c]);)R[--i]=F[c];if(C.remove("ID"))R[c=0]="ID";if(C.remove("DL"))R[c<1?1:0]="DL";for(i=0;i<8;)System.out.print((R[i]!=null?R[i]:"__")+(i++%2>0?"\n":" "));}

Bien que cela n'ait pas été trop difficile, je peux voir pourquoi il est resté sans réponse. Surtout que la règle concernant " N DC + N CC ≤ N ID + N DL + N PC + N GC + N MC +1 " coûte pas mal d'octets en ce moment ..
Et comme cela fait environ 2,5 ans que ce défi a été posté, OP pourrait avoir un autre portefeuille maintenant de toute façon ..; p

-1 octet grâce à @Jakob .

Essayez-le en ligne.

Explication:

C->{                       // Method with String-List parameter and String return-type
  String[]R=new String[8], //  String-array of size 8
          F={"CC","DC","PC","GC","MC"};
                           //  Frequency-order String-array
  int c=C.size(),          //  Size of the input-List
      i=1,                 //  Index integer, starting at 1
      s=0;                 //  Count-integer, starting at 0
  c=c>8?8:c;               //  If the size is larger than 8, set it to 8
  for(var q:C)             //  Loop over the cards of the input-List
    if("DCC".contains(q))  //   If the card is a DC or CC:
      s++;                 //    Increase the counter by 1
  for(;s>                  //  Loop as long as the amount of DC/CC is larger 
         c- --s;           //  than the other amount of cards + 1
      c=(c=C.size())>8?8:c)//    Recalculate the size after every iteration
    i=C.remove(F[i])?i:0;  //   If the List still contains a DC, remove it
                           //   Else: remove a CC instead
  for(c=0,                 //  Reset `c` to 0
      i=8;i>0              //  Loop as long as there is still room in the wallet,
      &c<5;                //  and we still have cards left
      c++)                 //    Go to the next card-type after every iteration
    for(;i>0               //   Inner loop as long as there is still room in the wallet,
        &C.remove(F[c]);)  //   and we still have a card of the current type left
      R[i--]=F[c];         //    Put a card of the current type in the wallet
  if(C.remove("ID"))R[c=0]="ID";
                           //  Add the 'ID' card to the first row if present
  if(C.remove("DL"))R[c<1?1:0]="DL";
                           //  Add the 'DL' card to the first row if present
  for(i=0;i<8;)            //  Loop over the wallet
    System.out.print(      //   Print:
      (R[i]!=null?         //    If the current slot contains a card:
        R[i]               //     Append this card
       :                   //    Else:
        "__")              //     Append an empty slot ("__")
      +(i++%2>0?"\n":" "));//    Append the correct delimiter (space or new-line)
  return r;}               //  And finally return the result

Java 10, 390,15 (459 octets - 15% de bonus)

C->{String r="",R[]=new String[8],F[]={"CC","DC","PC","GC","MC"},t=r;int c=C.size(),i=1,s=0;for(var q:C)if("DCC".contains(q))s++;for(;s>(c>8?8:c)- --s;c=C.size())if(C.remove(F[i]))t+=F[i]+",";else i=0;for(c=0,i=8;i>0&c<5;c++)for(;i>0&&C.remove(F[c]);)R[--i]=F[c];if(C.remove("ID")){t+=R[0]+",";R[c=0]="ID";};if(C.remove("DL")){t+=R[c=c<1?1:0]+",";R[c]="DL";}for(i=0;i<8;)r+=(R[i]!=null?R[i]:"__")+(i++%2>0?"\n":" ");return r+"\n"+(C.size()>0?t+C:"It fits!");}

Essayez-le en ligne.

Kevin Cruijssen
la source
1
Vous pouvez enregistrer un octet en initialisant Favec {"CC","DC","PC","GC","MC"}.
Jakob
@Jakob Ah, je ne savais pas que c'était plus court. Merci!
Kevin Cruijssen