আমার মানিব্যাগটি পূরণ করতে আমাকে সহায়তা করুন!


9

কিছুক্ষণ আগে আমি একটি নতুন ওয়ালেট কিনেছিলাম যা 8 টি কার্ড (উভয় পক্ষে 4) রাখতে সক্ষম। যাইহোক, আমার কাছে তার চেয়ে আরও বেশি কার্ড রয়েছে বলে মনে হয় এবং আমার সাথে আমার পছন্দেরগুলি নির্বাচন করা দরকার যা আমি আমার সাথে চালিয়ে যেতে চাই। কিছু কার্ড আমি অন্যদের তুলনায় বেশিবার ব্যবহার করি তবে আমি যে কার্ডগুলিকে আমার সাথে চালিয়ে যেতে পছন্দ করি সেগুলি আমি বেশি বেশি ব্যবহার করি না।

চ্যালেঞ্জ

কার্ডের একটি স্ট্যাক দেওয়া, আমার মানচিত্রের লেআউটটিকে সর্বোত্তম উপায়ে আমার পছন্দগুলি এবং বিধিনিষেধগুলিকে ফিরিয়ে দিন। লেআউটটি নিম্নরূপ হওয়া উচিত:

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

বর্তমানে আমি নিম্নলিখিত কার্ডগুলি পোজ করছি - স্ট্যাকগুলি সর্বদা এগুলি থেকে একটি নির্বাচন নিয়ে গঠিত:

  • 1 পরিচয়পত্র ( আইডি )
  • 1 ড্রাইভার লাইসেন্স ( ডিএল )
  • 2 ক্রেডিট কার্ড ( সিসি )
  • 5 ডেবিট কার্ড ( ডিসি )
  • 1 পাবলিক ট্রান্সপোর্ট কার্ড ( পিসি )
  • 1 জিম অ্যাক্সেস কার্ড ( জিসি )
  • এলোমেলো স্টোর এবং গুদাম ( এমসি ) এর 9 সদস্যপদ কার্ড

আমার কিছু পছন্দ এবং বিধিনিষেধ রয়েছে:

  • কার্ড অগ্রাধিকার অনুসারে বাছাই করা: আইডি, ডিএল, সিসি, ডিসি, পিসি, জিসি, এমসি
  • কার্ডগুলি ব্যবহারের ফ্রিকোয়েন্সি অনুসারে বাছাই করা: সিসি, ডিসি, পিসি, জিসি, এমসি, আইডি, ডিএল
  • সুরক্ষার কারণে, আমার মানিব্যাগে ডেবিট কার্ড এবং ক্রেডিট কার্ডের মোট সংখ্যা আমার ওয়ালেটে যে সমস্ত অন্যান্য কার্ড যাবে তার সংখ্যার চেয়ে কমপক্ষে 1 টি বেশি হতে পারে ( N DC + N CCN ID + N DL + N PC + এন জিসি + এন এমসি +1)।
  • যদি উপস্থিত থাকে তবে আমার পরিচয়পত্র এবং ড্রাইভারের লাইসেন্স সর্বদা 1 সারিতে রাখা উচিত This এর অর্থ এই নয় যে অন্যান্য কার্ডগুলি সারি 1-তে স্পট দখল করতে পারে না।
  • স্ট্যাক থেকে সর্বাধিক ব্যবহৃত কার্ডগুলি সর্বদা সারি 4 এ চলে যাওয়া উচিত।

বিধি

  • কোনও 2 কার্ড একই জায়গা দখল করতে পারে না।
  • উচ্চতর অগ্রাধিকারের কার্ডগুলি সর্বদা নিম্ন অগ্রাধিকারের চেয়ে বেশি অগ্রাধিকার দেওয়া হয়, যদি না ডিসি / সিসি নিষেধাজ্ঞায় প্রবেশ না করে।
  • সারি 1 এ আইডি / ডিএল ফ্রিকোয়েন্সি নিয়মকে অবিচ্ছিন্ন করে: যদি কেবল আইডি সরবরাহ করা হয় তবে এটি সারি 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% অপসারণের অনুমতি দেওয়া হবে । মুদ্রণ "এটি ফিট!" কোন অবশিষ্ট কার্ড ক্ষেত্রে। এই অতিরিক্ত আউটপুটটি সুস্পষ্টভাবে 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

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

যদিও এটি খুব বেশি কঠিন ছিল না, আমি কেন এটি উত্তরহীন ছিল তা দেখতে পাচ্ছি। বিশেষত " এন ডিসি + এন সিসি ≤ এন আইডি + এন ডিএল + এন পিসি + এন জিসি + এন এমসি +১ " সম্পর্কিত এই নিয়মের জন্য এই মুহুর্তে বেশ কয়েকটি বাইটের দাম পড়ছে ..
এবং যেহেতু এই চ্যালেঞ্জটি প্রায় 2.5 বছর হয়ে গেছে পোস্ট করা হয়েছে, ওপি এখন যাইহোক অন্য একটি মানিব্যাগ পেতে পারে ..; পি

-১ বাইট @ জ্যাকবকে ধন্যবাদ ।

এটি অনলাইনে চেষ্টা করুন।

ব্যাখ্যা:

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

জাভা 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

@ যাকব আহ, বুঝতে পারছেন না যে এটি কম ছিল। ধন্যবাদ!
কেভিন ক্রুইজসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.