সর্বাধিক স্কিটল উপভোগ


17

আপনাকে স্কিটলসের একটি ব্যাগ দেওয়া হয়েছে। সকলেই জানেন যে বিভিন্ন স্বাদের সর্বাধিক প্রশংসা করতে আপনার স্বাদের মধ্যে ঘোরানো দরকার।

বুনিয়াদি:

  1. আপনি একবারে 1 টি স্কিটল খেতে পারেন
  2. আপনি আপনার স্কিটলগুলি যে ক্রমটি খান তা অবশ্যই পর্যায়ক্রমিক হতে হবে
  3. প্রতিটি পিরিয়ডে একাধিকবার একটি নির্দিষ্ট গন্ধ থাকতে পারে না।
  4. আপনার ব্যাগে কেবল এতগুলি স্কিটল রয়েছে। আপনার ব্যাগের চেয়ে বেশি পরিমাণে স্কিটল এর স্বাদ বেশি খেতে পারবেন না।
  5. আপনি যতটা স্কিটল খেতে চান তা খেতে চান (এটি সর্বদা সম্ভব নাও হতে পারে)

উদাহরণ:

আপনাকে 3 লাল, 2 টি নীল এবং 3 টি সবুজ স্কিটল দিয়ে শুরু করতে বলুন:

R B G R B G R G       Invalid:  The last R must be followed by a B, not a G
R B G R B G R         Valid, but sub-optimal
R R R                 Valid, but sub-optimal
R G B R G B R G       Valid and optimal
G R B G R B G R       Also valid and optimal (there are multiple good solutions)

ইনপুট আউটপুট

  • রঙ গণনাগুলির জন্য আপনাকে ইতিবাচক পূর্ণসংখ্যার একটি খালি খালি তালিকা দেওয়া হয়েছে। (উপরের উদাহরণটি হবে [3,2,3])।
  • আপনাকে বৈধ এবং সর্বোত্তম ক্রমযুক্ত একটি তালিকা ফেরত দিতে হবে।
  • রঙগুলি ব্যবহার করার পরিবর্তে, আপনি ইনপুট তালিকা থেকে সূচকগুলি ব্যবহার করবেন। (উপরের শেষ উদাহরণ আউটপুট হবে[2,0,1,2,0,1,2,0] )।
  • আপনার আউটপুট 0-সূচকযুক্ত বা 1-ইনডেক্সড হতে পারে। আমার উদাহরণগুলি 0 সূচকযুক্ত হবে

পরীক্ষার মামলা

1                          0
4                          0 0 0 0
4 1                        0 0 0 0
3 1                        0 1 0                   or  0 0 0
5 2 2                      0 1 2 0 1 2 0
2 3 5                      2 1 0 2 1 0 2 1         or  1 2 0 1 2 0 1 2
2 4 5                      2 1 2 1 2 1 2 1 2
3 4 5                      2 1 0 2 1 0 2 1 0 2 1   or  1 2 0 1 2 0 1 2 0 1 2
1 1 1 1 1 6                5 0 1 2 3 4 5           (lots of other solutions)
1 1 1 1 1 8                5 5 5 5 5 5 5 5
2 4 6 8                    3 2 1 3 2 1 3 2 1 3 2 1 3 2

এটি একটি , তাই আপনার পছন্দসই ভাষাগুলিতে আপনার সমাধানগুলি যতটা সম্ভব সংক্ষিপ্ত করুন!


1
পাশাপাশি লিঙ্ক করা হতে পারে এই
জনাথন অ্যালান

2
@ জোনাথন অ্যালান এবং সে কারণেই আমার স্কিটল উপভোগ নিশ্চিত করার জন্য আমার একটি কম্পিউটারের প্রয়োজন :)
নাথান মেরিল

উত্তর:


4

জাভাস্ক্রিপ্ট (ES6), 177 175 বাইট

a=>a.map((n,i)=>[n,l=i]).sort((a,b)=>a[0]-b[0]).reduce((P,x,i,a)=>(v=a.reduce((p,c,j)=>j<i?p:p+Math.min(c[0],x[0]+1),0))>m?[...Array(m=v)].map((_,k)=>a[l-k%(l+1-i)][1]):P,m=0)

বিন্যাসিত এবং মন্তব্য

a => a                              // given an array a:
.map((n, i) => [n, l = i])          // map it to [value, index] arrays / set l = length - 1
.sort((a, b) => a[0] - b[0])        // sort it by values in ascending order
.reduce((P, x, i, a) =>             // for each reference entry x at position i:
  (v = a.reduce((p, c, j) =>        //   for each entry c at position j:
    j < i ?                         //     if c is before x:
      p                             //       keep the previous sum (which is 0)
    :                               //     else:
      p + Math.min(c[0], x[0] + 1), //       add minimum(value[j], value[i] + 1)
    0                               //   initialize the sum at 0
  )) > m ?                          //   if the new sum v is better than our current best m:
    [...Array(m = v)].map((_, k) => //     update m to v and update the result to an array
      a[l - k % (l + 1 - i)][1]     //     of length m filled with indices picked repeatedly
    )                               //     between i and l
  :                                 //   else:
    P,                              //     keep the previous result
  m = 0                             // start with best score m = 0
)                                   // the final result is returned by the outer reduce()

ব্যবহৃত সূত্র

নীচে এখানে একটি সূত্র দেখায় যে সূত্রটি F(i, j) = minimum(value[j], value[i] + 1)কীভাবে কাজ করছে তা এখানে i = 0এবং ইনপুট সহ[ 5, 2, 2 ]

এই সূত্রটি নিম্নরূপ ব্যাখ্যা করা যেতে পারে: প্রতিটি স্কিটল ধরণের জন্য, আমরা কমপক্ষে উপলভ্য টাইপ প্লাস ওয়ান সংখ্যার চেয়ে আর কোনও নির্বাচন করতে পারি না।

 j | Sorted    | value[j] | F(0, j) | Selected        | Output
   | input     |          |         | Skittles        | (starting from bottom left)
---+-----------+----------+---------+-----------------+-----------------------------
 0 | 2 2       |     2    |    2    | [2] [2]         | \
 1 | 1 1       |     2    |    2    | [1] [1]         |  > 0 1 2 0 1 2 0
 2 | 0 0 0 0 0 |     5    |    3    | [0] [0] [0] 0 0 | /

পরীক্ষার মামলা


যোগফলের (0) আর m"লুপস" এর শেষে গল্ফ-প্ররোচিতের শেষে কী কী আরম্ভ হয় তা ঠিক কীভাবে জেএসের হয়?
জোনাথন অ্যালান

@ জোনাথান অ্যালান এটি জেএস উপায় : হ্রাস () এর প্রাথমিক মান কলব্যাকের পরে অবস্থিত। ফেলে m=0এখানে গলফ ইনডিউসড কারণ আমি (এটা যাহাই হউক না কেন ওভাররাইট হতে যাচ্ছে) এই লুপের প্রাথমিক মান যত্ন সম্পর্কে না, কিন্তু,। প্রাথমিকভাবে mসুবিধাজনক।
আর্নল্ড

আহ আমি এটি একটি লুপের চেয়ে ফাংশন কলের মতো দেখতে পাই (পাইথনের হ্রাস ফাংশনটির একটি বিকল্প প্রাথমিক মান রয়েছে)।
জোনাথন অ্যালান

@ জোনাথান অ্যালান [1,2,3].reduce((x, y) => x+y, 10)জেএসে reduce(lambda x,y: x+y, [1,2,3], 10)পাইথন হবে (আমার মনে হয়), উভয়ই ফলস্বরূপ 16
আর্নল্ড

2

জেলি , 22 বাইট

ċЀṢN
ỤṚ;\Ṛẋ"‘Ṣ$ḣ"ÇLÞṪ

1-ভিত্তিক সূচক।

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

কিভাবে?

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

একটি অতিরিক্ত পর্যায়ক্রমিক পুনরাবৃত্তি থেকে যে নম্বরটি সরিয়ে নেওয়া উচিত তা হ'ল সেই উপসর্গ জুড়ে সর্বনিম্ন গণনা সহ কেবল সংখ্যা।

ỤṚ;\Ṛẋ"‘Ṣ$ḣ"ÇLÞṪ - Main link                   e.g. [6,4,2,8]
Ụ                - grade up: sort indices by value  [3,2,1,4]
 Ṛ               - reverse                          [4,1,2,3]
   \             - cumulative reduce with
  ;              -     concatenation (get prefixes) [[4],[4,1],[4,1,2],[4,1,2,3]]
    Ṛ            - reverse                          [[4,1,2,3],[4,1,2],[4,1],[4]]
         $       - last two links as a monad
       ‘         -     increment                    [7,5,3,9]
        Ṣ        -     sort                         [3,5,7,9]
      "          - zip with
     ẋ           -     list repetition              [[4,1,2,3,4,1,2,3,4,1,2,3],[4,1,2,4,1,2,4,1,2,4,1,2,4,1,2],[4,1,4,1,4,1,4,1,4,1,4,1,4,1],[4,4,4,4,4,4,4,4,4]]
            Ç    - call last link (1) as a monad    [-1,-1,-1,-1]
          "      - zip with
           ḣ     - head list to (remove excess)     [[4,1,2,3,4,1,2,3,4,1,2],[4,1,2,4,1,2,4,1,2,4,1,2,4,1],[4,1,4,1,4,1,4,1,4,1,4,1,4],[4,4,4,4,4,4,4,4]]
              Þ  - sort by
             L   -     length                       [[4,4,4,4,4,4,4,4],[4,1,2,3,4,1,2,3,4,1,2],[4,1,4,1,4,1,4,1,4,1,4,1,4],[4,1,2,4,1,2,4,1,2,4,1,2,4,1]]
               Ṫ - tail                             [4,1,2,4,1,2,4,1,2,4,1,2,4,1]

ċЀṢN - Link 1: head amounts (negative of skittle excess of each N+1 repeated period)
   Ṣ  - sort                                        [2,4,6,8]
 Ѐ   - for each mapped over right argument
ċ     - count                                       [1,1,1,1]
    N - negate                                      [-1,-1,-1,-1]

1

Python3, 174 172 167 বাইট

ধারণা

প্রদত্ত যেমন 3 লাল, 2 নীল এবং 3 টি সবুজ স্কিটলস একটি গ্রিডে রঙ এবং পরিমাণ অনুসারে বাছাই করতে পারে:

r g
r g b
r g b

যদি কেউ ঠিক আমি স্কিটলস খেতে চেষ্টা করে তবে একজন কমপক্ষে আই * সি স্কিটলস খেতে পারেন, যেখানে সি-র কলামের স্কিটলসের সংখ্যা, যেমন i = 2 এর জন্য কমপক্ষে 6 টি স্কিটল খেতে পারে।

r g
# # #
# # #

অসম্পূর্ণ সময়কালে কত অতিরিক্ত স্কিটলস খাওয়া যায় তা গণনা করা একমাত্র কাজ।

Golfed

def f(a):
 r=range;f=m=0;s=r(len(a));b=sorted(zip(a,s))[::-1]
 for i in s:
  c=b[i][0];n=-~i*c+sum(c<e[0]for e in b)
  if n>m:f,m=i+1,n
 return[b[j%f][1]for j in r(m)]

মন্তব্য

def f(a):
    r = range;
    f = m = 0;                          - Some variables we need later on
    s = r(len(a));                      - Integers from 0 to (num_skittles - 1)
    b = sorted(zip(a,s))[::-1]          - Zip with s to remember initial order,
                                          then sort and reverse
    for i in s:
        c = b[i][0]
        n = (i+1)*c                     - If we attempt to eat i different skittles,
                                          we can surely eat (i+1)*c skittles.
          + sum(1 for e in b if e[0]>c) - The additional sum corresponds to an incomplete period.
        if n>m:                         - If a better way of eating skittles is found:
            f,m = i+1,n                 - update variables
    return [b[j%f][1] for j in r(m)]

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

সম্পাদনা: প্রতিস্থাপিত (i+1)সঙ্গে -~i2 বাইট সংরক্ষণ করুন।

সম্পাদনা করুন: -5 বাইটস ডেড পসামকে ধন্যবাদ


তুমি বদলাতে পারো sum(1for e in b if e[0]>c) করতেsum(c<e[0]for e in b) । এটি সত্যকে 1 টি স্পষ্টত রূপান্তরিত করবে এবং আপনাকে 5 বাইট সংরক্ষণ করবে
মৃত পসসাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.