Cüzdanımı doldurmama yardım et!


9

Bir süre önce 8 kart (her iki tarafta 4 adet) tutabilen yeni bir cüzdan satın aldım. Ancak, bundan daha fazla kartım var ve benimle taşımak istediğim şeyleri seçmem gerekiyor. Bazı kartlar diğerlerinden daha sık kullanıyorum, ama yanımda taşımayı tercih ettiğim kartlar mutlaka en çok kullandığım kartlar değil.

Meydan okuma

Bir kart yığını verildiğinde, cüzdanımın düzenini tercihlerim ve kısıtlamalarıma göre mümkün olan en iyi şekilde döndürün. Düzen aşağıdaki gibi olmalıdır:

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

Şu anda aşağıdaki kartları poz - yığınlar her zaman bunlardan bir seçim oluşur:

  • 1 kimlik kartı ( ID )
  • 1 sürücü belgesi ( DL )
  • 2 kredi kartı ( CC )
  • 5 banka kartı ( DC )
  • 1 toplu taşıma kartı ( PC )
  • 1 spor salonu erişim kartı ( GC )
  • Rastgele mağaza ve depolardan 9 üyelik kartı ( MC )

Bazı tercihlerim ve kısıtlamalarım var:

  • Önceliğe göre sıralanmış kartlar: Kimlik, DL, CC, DC, PC, GC, MC
  • Kullanım sıklığına göre sıralanan kartlar: CC, DC, PC, GC, MC, ID, DL
  • Güvenlik nedeniyle, cüzdanımdaki toplam banka kartı ve kredi kartı sayısı, cüzdanıma gidecek diğer tüm kartların toplamından en fazla 1 daha fazla olabilir ( N DC + N CCN ID + N DL + N PC + N GC + N MC +1).
  • Varsa, kimlik kartım ve ehliyetim her zaman 1. sıraya girmelidir. Bu, diğer kartların 1. sıradaki noktaları işgal edemeyeceği anlamına gelmez.
  • Yığından en sık kullanılan kartlar her zaman 4. satıra gitmelidir.

kurallar

  • Aynı yerde 2 kart kullanılamaz.
  • DC / CC kısıtlaması devreye girmedikçe, yüksek öncelikli kartlar her zaman düşük öncelikli kartlara tercih edilir.
  • 1. satırdaki ID / DL, frekans kuralını geçersiz kılar: yalnızca ID sağlanırsa, 1. satıra gider ve 4. satır boş olur!
  • Giriş yığınının sırası korunduğu sürece, giriş biçimlendirme istediğiniz şekilde yapılabilir. örn . ID,CC,PC,MC,MC,MC,DL, örn. 1ID 1CC 1PC 3MC 1DL 0DC 0GCveya ID CC PC MC MC MC DL.
  • Çıktı biçimlendirmesinin birkaç kısıtlaması vardır: satırların tümü yeni bir satırda başlamalı, sütunlar bir şekilde sınırlandırılmalıdır. 4x2 düzenini bozmadığı sürece boş noktalar istediğiniz şekilde sunulabilir.

  • Birden fazla çözüm / sipariş olabilir, çıktı olarak hangisini sağladığınıza bağlıdır.

  • Aynı tür kartların her zaman girişte gruplandırılacağını varsayabilirsiniz.
  • Yukarıdakilerin dışında standart kurallar ve boşluklar geçerlidir.

Bonus

Cüzdana gitmeyen kartları da iade ederseniz, bayt hesabınızın % 15'ini kaldırmanıza izin verilir . Yazdır "Uyuyor!" kart kalmadığında. Bu ek çıktı, geri ödeme düzeninden açıkça ayrılmalıdır.

Örnekler

Giriş:

ID, DL, CC, GC, MC

2 olası çıkış:

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

optional: It fits!

Giriş:

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

2 olası çıkış:

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

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

Giriş:

DC, DC, CC, CC, GC, DL

2 olası çıkış:

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

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

Giriş:

CC, DC, DC, DC

2 olası çıkış:

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

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

Giriş:

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

2 olası çıkış:

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)

Giriş:

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

2 olası çıkış:

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

optional: It fits!

Giriş:

ID, CC

2 olası çıkış:

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

optional: It fits!

Bu , böylece en kısa kod (bayt cinsinden) kazanır.


Yanıtlar:


3

Java 10, 385 384 382 bayt

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

Çok zor olmasa da neden cevaplanmadığını görebiliyorum. Özellikle " N DC + N CC ≤ N ID + N DL + N PC + N GC + N MC +1 " ile ilgili bu kural şu anda oldukça fazla bayt maliyeti ..
Ve bu meydan okumadan bu yana yaklaşık 2,5 yıl geçti postalanmıştır, OP zaten başka bir cüzdan zaten olabilir ..; p

@ Jakob sayesinde -1 bayt .

Çevrimiçi deneyin.

Açıklama:

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

Çevrimiçi deneyin.


1
Sen başlatılıyor tek bayt kaydedebilirsiniz File {"CC","DC","PC","GC","MC"}.
Jakob

@ Jakob Ah, bunun daha kısa olduğunun farkında değildi. Teşekkürler!
Kevin Cruijssen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.