帮我塞满我的钱包!


9

不久前,我购买了一个新钱包,该钱包可容纳8张卡(两面均为4张)。但是,我似乎拥有比这更多的卡片,并且我需要选择要随身携带的卡片。有些卡片比其他卡片使用得更多,但是我更喜欢随身携带的卡片不一定是我使用最多的卡片。

挑战

给定一堆纸牌,以我的喜好和限制尽可能的最好的方式返回我的钱包的布局。布局应如下所示:

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

目前,我摆出了以下几张纸牌-堆叠中总是有以下选择:

  • 1张身份证(ID
  • 1张驾照(DL
  • 2张信用卡(CC
  • 5张借记卡(DC
  • 1张公共交通卡(PC
  • 1张健身房出入卡(GC
  • 随机商店和仓库(MC)的9张会员卡

我有一些偏好和限制:

  • 卡按优先级排序:ID,DL,CC,DC,PC,GC,MC
  • 卡按使用频率排序:CC,DC,PC,GC,MC,ID,DL
  • 出于安全原因,借记卡和信用卡在我的钱包总数可以比所有其它卡的总和,将在我的钱包去(至多更多ň DC + ñ CCñ ID + ñ DL + ñ PC + N GC + N MC +1)。
  • 如果有的话,我的身份证和驾驶执照应始终排在第1行。这并不意味着其他卡可能不会在第1行占据位置。
  • 堆栈中使用最频繁的卡应始终排在第4行。

规则

  • 没有2张卡可以占据同一位置。
  • 除非DC / CC限制生效,否则始终优先使用优先级较高的卡而不是优先级较低的卡。
  • 第1行的ID / DL否决了频率规则:如果仅提供ID,则它将进入第1行,而第4行将为空!
  • 只要保留输入堆栈的顺序,就可以以任何您喜欢的方式进行输入格式化。例如ID,CC,PC,MC,MC,MC,DL也可以作为1ID 1CC 1PC 3MC 1DL 0DC 0GC或提供ID CC PC MC MC MC DL
  • 输出格式确实有一些限制:行必须全部以换行开头,列必须以某种方式定界。只要不干扰4x2布局,就可以用任何您喜欢的方式显示空白点。

  • 可以有多个解决方案/订单,这取决于您提供哪种输出。

  • 您可以假设相同类型的卡总是在输入时分组。
  • 除了上述标准 规则和漏洞适用。

奖金

如果您还退还钱包中没有的任何卡,则可以删除15%的字节数。打印“很合适!” 如果没有剩余的卡。此额外的输出应与后勤布局明确分开。

例子

输入:

ID, DL, CC, GC, MC

2种可能的输出:

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

optional: It fits!

输入:

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

2种可能的输出:

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

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

输入:

DC, DC, CC, CC, GC, DL

2种可能的输出:

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

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

输入:

CC, DC, DC, DC

2种可能的输出:

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

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

输入:

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

2种可能的输出:

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)

输入:

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

2种可能的输出:

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

optional: It fits!

输入:

ID, CC

2种可能的输出:

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

optional: It fits!

这是 ,因此最短的代码(以字节为单位)获胜。


Answers:


3

Java的10,385个 384 382字节

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":" "));}

尽管不是很困难,但我可以理解为什么它没有得到答复。特别是关于“规则ñ DC + N CC ≤ñ ID + N DL + N PC + N GC + N MC +1 ”成本相当多的那一刻字节..
而且因为它已经约2.5今年以来这一挑战发布后,OP可能现在已经有了另一个钱包。.p

-1个字节感谢@Jakob

在线尝试。

说明:

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字节-15%奖金)

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

在线尝试。


1
您可以通过初始化保存一个字节F{"CC","DC","PC","GC","MC"}
雅各布

@Jakob啊,没有意识到那短。谢谢!
凯文·克鲁伊森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.