Giúp tôi điền ví của tôi!


9

Cách đây một thời gian, tôi đã mua một chiếc ví mới có thể chứa 8 thẻ (4 cái ở cả hai mặt). Tuy nhiên, tôi dường như có nhiều thẻ hơn thế và tôi cần đưa ra lựa chọn mà tôi muốn mang theo bên mình. Một số thẻ tôi sử dụng thường xuyên hơn những thẻ khác, nhưng những thẻ tôi thích mang theo không nhất thiết là những thẻ tôi sử dụng nhiều nhất.

Các thách thức

Đưa ra một chồng thẻ, trả lại bố cục ví của tôi theo cách tốt nhất có thể ghi lại các ưu tiên và hạn chế của tôi. Bố cục nên như sau:

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

Hiện tại tôi có các thẻ sau - ngăn xếp sẽ luôn bao gồm một lựa chọn từ những thứ sau:

  • 1 chứng minh nhân dân ( ID )
  • 1 bằng lái xe ( DL )
  • 2 thẻ tín dụng ( CC )
  • 5 thẻ ghi nợ ( DC )
  • 1 thẻ giao thông công cộng ( PC )
  • 1 thẻ truy cập phòng tập thể dục ( GC )
  • 9 thẻ thành viên từ các cửa hàng và kho ngẫu nhiên ( MC )

Tôi có một số ưu tiên và hạn chế:

  • Thẻ được sắp xếp theo mức độ ưu tiên: ID, DL, CC, DC, PC, GC, MC
  • Thẻ được sắp xếp theo tần suất sử dụng: CC, DC, PC, GC, MC, ID, DL
  • Vì lý do an toàn, tổng số thẻ ghi nợ và thẻ tín dụng trong ví của tôi có thể nhiều hơn 1 so với tổng số tất cả các thẻ khác sẽ có trong ví của tôi ( N DC + N CCN ID + N DL + N PC + N GC + N MC +1).
  • Nếu có, chứng minh nhân dân và bằng lái xe của tôi phải luôn ở hàng 1. Điều này không có nghĩa là các thẻ khác có thể không chiếm các vị trí trong hàng 1.
  • Các thẻ được sử dụng thường xuyên nhất từ ​​ngăn xếp phải luôn đi trong hàng 4.

Quy tắc

  • Không có 2 thẻ có thể chiếm cùng một vị trí.
  • Thẻ ưu tiên cao hơn luôn được ưu tiên hơn các thẻ ưu tiên thấp hơn, trừ khi hạn chế DC / CC có hiệu lực.
  • ID / DL ở hàng 1 ghi đè quy tắc tần số: nếu chỉ được cung cấp ID, nó sẽ đi ở hàng 1 và hàng 4 sẽ trống!
  • Định dạng đầu vào có thể được thực hiện theo bất kỳ cách nào bạn muốn, miễn là thứ tự của ngăn xếp đầu vào được giữ lại. ví dụ ID,CC,PC,MC,MC,MC,DLcũng có thể được cung cấp như ví dụ 1ID 1CC 1PC 3MC 1DL 0DC 0GChoặc ID CC PC MC MC MC DL.
  • Định dạng đầu ra có một vài hạn chế: tất cả các hàng phải bắt đầu ở một dòng mới, các cột phải được phân tách theo một cách nào đó. Các điểm trống có thể được trình bày theo bất kỳ cách nào bạn thích, miễn là nó không làm rối bố cục 4x2.

  • Có thể có nhiều hơn một giải pháp / đơn hàng, tùy thuộc vào bạn cung cấp giải pháp nào.

  • Bạn có thể cho rằng các thẻ cùng loại sẽ luôn được nhóm ở đầu vào.
  • Ngoài những điều trên, các quy tắc và quy tắc tiêu chuẩn được áp dụng.

Tặng kem

Bạn được phép xóa 15% tổng số tiền của mình nếu bạn cũng trả lại bất kỳ thẻ nào không có trong ví. In "Nó phù hợp!" trong trường hợp không còn thẻ Đầu ra bổ sung này nên được tách biệt rõ ràng với bố trí returend.

Ví dụ

Đầu vào:

ID, DL, CC, GC, MC

2 đầu ra có thể:

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

optional: It fits!

Đầu vào:

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

2 đầu ra có thể:

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

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

Đầu vào:

DC, DC, CC, CC, GC, DL

2 đầu ra có thể:

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

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

Đầu vào:

CC, DC, DC, DC

2 đầu ra có thể:

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

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

Đầu vào:

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

2 đầu ra có thể:

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)

Đầu vào:

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

2 đầu ra có thể:

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

optional: It fits!

Đầu vào:

ID, CC

2 đầu ra có thể:

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

optional: It fits!

Đây là , vì vậy mã ngắn nhất (tính bằng byte) sẽ thắng.


Câu trả lời:


3

Java 10, 385 384 382 byte

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

Mặc dù nó không quá khó, tôi có thể thấy tại sao nó không được trả lời. Đặc biệt là quy tắc liên quan đến " N DC + N CC ≤ N ID + N DL + N PC + N GC + N MC +1 " có giá khá nhiều byte tại thời điểm này ..
Và vì đã khoảng 2,5 năm kể từ khi thử thách này diễn ra đã được đăng, OP có thể đã có một ví khác vào lúc này ..; p

-1 byte nhờ @Jakob .

Hãy thử trực tuyến.

Giải trình:

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 byte - tiền thưởng 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!");}

Hãy thử trực tuyến.


1
Bạn có thể lưu một byte bằng cách khởi tạo Fvới {"CC","DC","PC","GC","MC"}.
Jakob

@Jakob Ah, không nhận ra rằng nó ngắn hơn. Cảm ơn!
Kevin Cruijssen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.