財布を埋めるのを手伝ってください!


9

少し前に、8枚のカード(両面に4枚)を入れることができる新しい財布を購入しました。しかし、私はそれよりもはるかに多くのカードを持っているようであり、どのカードを携帯するかを選択する必要があります。一部のカードは他のカードよりも頻繁に使用しますが、持ち歩きたいカードは、必ずしも最も頻繁に使用するカードではありません。

チャレンジ

カードのスタックが与えられたら、私の好みと制限に対して可能な限り最良の方法で私の財布のレイアウトを返します。レイアウトは次のようになります。

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

現在私は以下のカードを持っています-スタックは常にこれらからの選択で構成されます:

  • 1枚のIDカード(ID
  • 1運転免許証(DL
  • 2クレジットカード(CC
  • 5デビットカード(DC
  • 公共交通機関カード(PC1
  • ジムアクセスカード(GC1
  • ランダムストアおよび倉庫からの9枚の会員証(MC

私はいくつかの好みと制限があります:

  • 優先度でソートされたカード:ID、DL、CC、DC、PC、GC、MC
  • 使用頻度でソートされたカード:CC、DC、PC、GC、MC、ID、DL
  • 安全上の理由から、私の財布でデビットカードとクレジットカードの総数が(私の財布になります他のすべてのカードの合計よりも最大で1より可能N DC + N CCN ID + N DL + N PCを + N GC + N MC +1)。
  • 存在する場合、私の身分証明書と運転免許証は常に行1に配置する必要があります。これは、他のカードが行1のスポットを占有しない可能性があることを意味しません。
  • スタックから最も頻繁に使用されるカードは常に4行目に配置する必要があります。

ルール

  • 同じ場所に2枚のカードを入れることはできません。
  • DC / CCの制限が適用されない限り、優先度の高いカードは優先度の低いカードよりも常に優先されます。
  • 行1のID / DLは頻度ルールを無効にします。IDのみが指定されている場合、ID / DLは行1に入り、行4は空になります。
  • 入力スタックの順序が保持されている限り、入力フォーマットは任意の方法で行うことができます。eg ID,CC,PC,MC,MC,MC,DLはeg 1ID 1CC 1PC 3MC 1DL 0DC 0GCまたはとしても提供されID CC PC MC MC MC DLます。
  • 出力フォーマットにはいくつかの制限があります。行はすべて新しい行から開始し、列は何らかの方法で区切る必要があります。空のスポットは、4x2レイアウトを台無しにしない限り、好きなように表示できます。

  • 複数のソリューション/オーダーが存在する可能性があります。どのソリューションを出力として提供するかはユーザー次第です。

  • 同じタイプのカードは常に入力時にグループ化されると想定することができます。
  • 上記とは別に、標準の規則と抜け穴が適用されます。

ボーナス

ウォレットに入らなかったカードも返す場合は、バイトカウントの15%を削除できます。「それは合う!」と印刷する カードが残っていない場合。この追加の出力は、returendレイアウトから明確に分離する必要があります。

入力:

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!

これはなので、最短のコード(バイト単位)が優先されます。


回答:


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

それほど難しくはありませんでしたが、なぜ答えられなかったのかがわかります。特に、その「に関する規則N DC + N CC ≤N ID + N DL + N PC + N GC + N MC +1」のコストはかなり現時点ではバイトがたくさん...
そして、このような課題が有しているので、それは2.5年程度となっていますので、投稿されましたが、OPはとにかく別のウォレットを持っているかもしれません..; p

@Jakobのおかげで-1バイト。

オンラインでお試しください。

説明:

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と、1バイト節約できます{"CC","DC","PC","GC","MC"}
Jakob

@Jakobああ、それがもっと短いことに気づかなかった。ありがとう!
Kevin Cruijssen、2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.