টেরা মাইস্টিকা: সাইক্লিং পাওয়ার


28

বোর্ডগেম টেরা মাইস্টিকার প্রাথমিক অন্যতম এক সংস্থান, পাওয়ারের জন্য খুব আকর্ষণীয় মেকানিক রয়েছে। একটি ব্যাংক থেকে পাওয়ার ইউনিট পাওয়ার এবং ব্যয় করার পরিবর্তে প্রতিটি খেলোয়াড় ঠিক 12 ইউনিট শক্তি দিয়ে খেলা শুরু করে যা তিনটি "বাটি" -র উপরে বিতরণ করা হয়, যা I, II এবং III লেবেলযুক্ত। শক্তি অর্জন এবং ব্যয় করার পরে কেবল এই বাটিগুলির মধ্যে শক্তি স্থানান্তরিত হয়:

  • পাওয়ারের একক ব্যয় করতে, বাটি III থেকে বোলিং আইতে সরান (আপনি যদি তৃতীয় বাটিতে একটি ইউনিট রাখেন)।
  • যখন আপনি পাওয়ারের একক অর্জন করেন, আমি যদি প্রথম বাটিতে একটি ইউনিট থাকে, তবে এটি দ্বিতীয়টি বোলিংয়ে নিয়ে যান। যদি প্রথম বাটিতে কোনও ইউনিট না থাকে তবে দ্বিতীয় বাটিতে একটি ইউনিট থাকে তবে এটি তৃতীয় বোলিংয়ে নিয়ে যান। যদি সমস্ত ইউনিট ইতিমধ্যে তৃতীয় বাটিতে থাকে তবে কিছুই হয় না।
  • আপনি একবারে একাধিক ইউনিট অর্জন বা ব্যয় করার সময় এগুলি একবারে এক ইউনিট প্রসেস করা হয়।

এখানে একটি উদাহরণ। বলুন, কোনও প্লেয়ার নিম্নলিখিত পাওয়ার বিতরণ দিয়ে শুরু হয় (ক্রমে দেওয়া I | II | III):

5 | 7 | 0

তাদের পাওয়ারটি পরিবর্তিত হয় যদি তারা কিছুবার শক্তি অর্জন করে এবং ব্যয় করে:

               5 |  7 |  0
Gain  3  ==>   2 | 10 |  0
Gain  6  ==>   0 |  8 |  4   (move 2 power from I to II, 
                              then the remaining 4 from II to III)
Gain  7  ==>   0 |  1 | 11
Spend 4  ==>   4 |  1 |  7
Gain  1  ==>   3 |  2 |  7
Spend 7  ==>  10 |  2 |  0
Gain 12  ==>   0 | 10 |  2   (move 10 power from I to II,
                              then the remaining 2 from II to III)
Gain 12  ==>   0 |  0 | 12   (the two excess units go to waste)

আপনার কাজটি হ'ল এরকম একটি লাভ বা ব্যয় ইভেন্টের ফলাফল গণনা করা।

চ্যালেঞ্জ

আপনাকে ইনপুট হিসাবে চারটি পূর্ণসংখ্যা দেওয়া হয়। প্রথম তিনটি, I, II, III, ক্ষমতা পরিমাণ তিন বাটি প্রতিটি প্রতিনিধিত্ব করে। এগুলি অ-নেতিবাচক হবে এবং এগুলির পরিমাণ 12 হবে The চতুর্থ সংখ্যাটি, Pলাভ বা ব্যয় করা পরিমাণের পরিমাণ, এবং অন্তর্ভুক্তিক পরিসরে থাকবে [-III, 24](সুতরাং আপনি ধরে নিতে পারেন যে প্লেয়ার কখনও বেশি শক্তি ব্যয় করার চেষ্টা করবেন না তারা বর্তমানে পারে তার চেয়ে বেশি তবে তারা সমস্ত শক্তি বোলিতে সরানোর প্রয়োজনের চেয়ে আরও বেশি শক্তি অর্জন করতে পারে)।

আপনি এই সংখ্যাগুলি যে কোনও ধারাবাহিক ক্রমে, পৃথক যুক্তি হিসাবে, পূর্ণসংখ্যার তালিকা হিসাবে অথবা এই সংখ্যাসমূহের একটি স্ট্রিং হিসাবে নিতে পারেন। এছাড়াও আপনি গ্রহণ করতে পারেন Pহিসাবে, এক আর্গুমেন্ট হিসাবে I, II, IIIএকটি পৃথক তালিকা আর্গুমেন্ট হিসাবে।

আপনি আউটপুট তিনটি পূর্ণসংখ্যার উচিত I', II', III'প্রতিটি বাটি মধ্যে ক্ষমতার পরিমাণ প্রতিনিধিত্ব যা পরে P ইউনিট অর্জন হয় না বা অতিবাহিত নিম্নলিখিত নিয়মগুলি উপরে ব্যাখ্যা।

আপনি কোনও প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন এবং ইনপুট গ্রহণ এবং আউটপুট সরবরাহের আমাদের মানক পদ্ধতির কোনওটি ব্যবহার করতে পারেন ।

আপনি যে কোনও প্রোগ্রামিং ভাষা ব্যবহার করতে পারেন তবে নোট করুন যে এই ফাঁকগুলি ডিফল্টরূপে নিষিদ্ধ।

এটি , তাই সংক্ষিপ্ততম বৈধ উত্তর - বাইটগুলিতে মাপা - জয় w

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

I II III P => I' II' III'
5 7 0 3    => 2 10 0
2 10 0 6   => 0 8 4
0 8 4 7    => 0 1 11
0 1 11 -4  => 4 1 7
4 1 7 0    => 4 1 7
4 1 7 1    => 3 2 7
3 2 7 -7   => 10 2 0
10 2 0 12  => 0 10 2
0 10 2 12  => 0 0 12

1
আমি লিঙ্গ-নির্দিষ্ট সর্বনামগুলি সরানোর এবং তাদের প্রতি লিঙ্গ-নিরপেক্ষ একটি (বা বাক্য পুনর্গঠন) দিয়ে প্রতিস্থাপন করার পরামর্শ দিচ্ছি: গেমারদের পুরুষ হতে হবে না।
গ্রেগ মার্টিন

1
@ গ্রেগমার্টিন অবশ্যই আমি কি তাদের সব ধরলাম?
মার্টিন এন্ডার

2
দেখতে যেমন; এটি সম্পর্কে চিন্তা করার জন্য আপনাকে ধন্যবাদ! এছাড়াও, টেরা মাইস্টিকা যেমন শুনেছি তেমন দুর্দান্ত?
গ্রেগ মার্টিন

4
@ গ্রেগমার্টিন হ্যাঁ :)
মার্টিন এন্ডার

5
কোন শক্তি বাটি 2 থেকে জ্বলে? এটি ঠিক তাই অসম্পূর্ণ বোধ।
আরও

উত্তর:


6

গণিত, 52 বাইট

{x=#-#4~Min~#,y=Max[#2+#-Abs[#4~Max~0-#],0],12-x-y}&

এটি একটি নামবিহীন ফাংশন যা {I, II, III, P}ইনপুট হিসাবে একটি তালিকা নেয় এবং একটি তালিকা ফেরত দেয় {I', II', III'}

একটি বদ্ধ-ফর্ম সমাধান। এটি এখনও সত্যিই অনুকূল অনুভব করে না ...


ভেবেছিলাম আমি সংক্ষিপ্ত করতে পারি তবে {##,12-+##}&[#-#4~Min~#,Max[#2+#-Abs[#4~Max~0-#],0]]&এটি একটি বাইট দীর্ঘ। 12-+##যদিও আমি পছন্দ করি ।
গ্রেগ মার্টিন

1
@ গ্রেগমার্টিন আমি একই জিনিসটি চেষ্টা করেছিলাম :)
মার্টিন এন্ডার

6

সি, 97 94 বাইট

f(i,j,k,n){for(;n;n-=n/abs(n))n<0?k?++i+--k:0:i?++j+--i:j?++k+--j:0;printf("%d %d %d",i,j,k);}

নিরবচ্ছিন্ন আকারে:

f(i, j, k, n) {
    while (n) {
        if (n < 0) {
            if (k) {
                ++i; --k;
            }
            ++n;
        } else {
            if (i) {
                ++j; --i;
            }
            else if (j) {
                ++k; --j;
            }
            --n;
        }
    }
    printf("%d %d %d", i, j, k);
}


5

হাস্কেল, 58 বাইট

f(a,b,c)d|m<-min a d,z<-min(c+d-max 0 m)12=(a-m,b+c+m-z,z)

মধ্যবর্তী মানটি mপ্রথম বাটি থেকে (বা নেতিবাচক হলে) zপাওয়ার পরিমাণকে বোঝায় , ক্রিয়াটির পরে তৃতীয় বাটিতে পাওয়ার পরিমাণকে বোঝায়। শেষ মুহুর্তে একটি বাইট অপটিমাইজেশন 12-a+m-zপরিচয়টি ব্যবহার থেকে দ্বিতীয় বাটির জন্য পুরানো অভিব্যক্তিটি পরিবর্তন করে a+b+c=12

প্রাকৃতিক ফলাফলের ধরণটি বাটিগুলির জন্য একটি ট্রিপল, সুতরাং ইনপুটটিও বাটিগুলি একটি ট্রিপল হিসাবে গ্রহণ করে এবং দ্বিতীয় যুক্তির হিসাবে শক্তি পরিবর্তন করে। এটির একটি প্রয়োগের মাধ্যমে সমস্ত পরীক্ষার কেস পরিচালনা করতে দেয় scanl:

*Main> scanl f (5,7,0) [3,6,7,-4,0,1,-7,12,12]
[(5,7,0),(2,10,0),(0,8,4),(0,1,11),(4,1,7),(4,1,7),(3,2,7),(10,2,0),(0,10,2),(0,0,12)]

5

Röda , 100 94 বাইট

f a,b,c,p{{c+=p;a-=p}if[p<0]else{{a--;b++;p--}while[p*a>0];{b--;c++;p--}while[p*b>0]};[a,b,c]}

Ungolfed:

f a,b,c,p {
    if [ p < 0 ] do
        c += p
        a -= p
    else
        { a-=1; b+=1; p-=1 } while [ p > 0 and a > 0 ]
        { b-=1; c+=1; p-=1 } while [ p > 0 and b > 0 ]
    done
    return a, b, c
}

Roda নেই ++এবং --অপারেটরদের?
ক্রিটসি লিথোস

@ ক্রিটিক্সিলিথোস ধন্যবাদ! হ্যাঁ এটা করে.
ফার্গুসক


3

জিএনইউ সেড , 66 বাইট

এর জন্য +1 অন্তর্ভুক্ত -r

/-/!{:
s/1,(.* )1/,1\1/
t}
s/(.*)(1+) -\2/\2\1/
s/(,,1{12}).*/\1/

অবিচ্ছিন্ন ব্যবহার করুন ( এই sensকমত্য দেখুন )।

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

/-/!{                  # If there is not a '-'
  :                    # start loop
  s/1,(.* )1/,1\1/     # move a 1 from before a ',' to after the ',' for every 1 after the space
                       # sed reads left to right, so this takes everything from the first bowl before starting on the second
  t                    # loop if something changed
}                      # end if
s/(.*)(1+) -\2/\2\1/   # take all of the 1s from after a '-' and move them to the begining.
                       # at the same time, remove that many 1s from the 3rd bowl
s/(,,1{12}).*/\1/      # remove everything after 12 1s in the third bowl

3

রেটিনা ,  46  41 39 38 বাইট

একাধিক সহায়ক পরামর্শের জন্য মার্টিন ইন্ডারকে ধন্যবাদ !

+`1,(.*¶)1
,1$1
(.*)(1+)¶-\2$
$2$1
G`,

আনারি ইনপুট নেয়। প্রথম লাইনে তিনটি বাটিতে শক্তির পরিমাণ রয়েছে, কমা দ্বারা পৃথক করা হয়েছে, দ্বিতীয় লাইনে চক্রের পাওয়ার পরিমাণ রয়েছে।

পরীক্ষার স্যুট - একক লাইনে সমস্ত ইনপুট নেয় এবং দশমিক থেকে আনারি এবং পরিবর্তে ব্যবহারের সুবিধার জন্য রূপান্তর করে।

ব্যাখ্যা

+`1,(.*¶)1
,1$1

ধনাত্মক কেস: আমরা বার বার 1দ্বিতীয় লাইন থেকে শীর্ষস্থানীয়কে সরিয়ে 1ফেলি এবং যতক্ষণ না এই অপারেশনটি সম্ভব হয় ততক্ষণ প্রথম অ-খালি বাটি থেকে একটিটিকে নীচের দিকে নিয়ে যাই (যেমন চক্রের পাওয়ারের সংখ্যা শূন্য নয় এবং সমস্ত নয় শক্তি তৃতীয় বাটি মধ্যে)। sপরিবর্তক মানে single-lineযার ফলে .এছাড়াও সম্পর্কে newline মেলে।

(.*)(1+)¶-\2$
$2$1

Gণাত্মক কেস: তৃতীয় থেকে প্রথম বাটিতে সর্বশেষ ইনপুট দ্বারা নির্দেশিত পাওয়ারের পরিমাণ সরিয়ে এক ধাপে সমস্ত করা। এটি সরানোর জন্য theণাত্মক পরিমাণযুক্ত লাইনটিও সরিয়ে ফেলবে।

G`,

কমাযুক্ত একমাত্র রেখাগুলি (গ্রেপ) রাখুন। এটি প্রথম লাইনের শেষ অবশেষ থেকে মুক্তি পাবে।



2

ব্যাচ, 87 বাইট

@set/a"i=%4-%1,j=%4*(-%4>>5)-%2-2*i*(-i>>5),i*=i>>5,j*=j>>5,k=12-i-j
@echo %i% %j% %k%

নিম্নলিখিত সূত্রগুলি ব্যবহার করুন:

I' = min(I - P, 0)
II' = min(II + min(P, 0) - 2 * min(P - I, 0), 0)
III' = 12 - I' - II'

ব্যাচ যেহেতু অপারেটরের চেয়ে কম নয়, তাই আমি i = min(-i, 0)ব্যবহার করে গণনা করি i*=i>>5


2

পার্ল 6 , 99 বাইট

->\a,\b,\c,\d{d>0??[»+»] (a,b,c),|(|((-1,1,0)xx a),|((0,-1,1)xx a+b),|(0 xx*))[^d]!!(a- d,b,c+d)}

যাক a, bএবং cআমি দ্বিতীয় ও III যথাক্রমে বাটি মধ্যে টোকেন শুরু সংখ্যা হতে। তারপরে, অ্যাডিং পাওয়ার কেসের জন্য, একটি তালিকা তৈরি করা হয় যার মধ্যে aট্রিপলেটের অনুলিপি থাকে (-1, 1, 0), তারপরে ত্রিপলিটির a + bঅনুলিপিগুলি এবং (0, -1, 1)তারপরে অনন্ত কপিগুলি থাকে 0dএই তালিকার প্রথম উপাদানগুলি dযোগ করার ক্ষমতার পরিমাণ হ'ল প্রাথমিক বিদ্যুৎ বিতরণে উপাদান হিসাবে যুক্ত করা হয়।

শক্তি (নেতিবাচক বিয়োগ জন্য d), একটি সহজ বদ্ধ ফর্ম ব্যবহার করা হয়: (a - d, b, c + d)


2

টিনাইলিস্প , 134 বাইট

(d f(q((x y z p)(i p(i(l p 0)(f(s x p)y(a z p)0)(i x(f(s x 1)(a y 1)z(s p 1))(i y(f x(s y 1)(a z 1)(s p 1))(f x y z 0))))(c x(c y(c z(

একটি ফাংশন সংজ্ঞা দেয় fযা চারটি আর্গুমেন্ট, তিনটি বাটি ( x y z) এবং লেনদেনের পাওয়ার পরিমাণ ( p) গ্রহণ করে এবং লেনদেনের পরে তিনটি বাটির একটি তালিকা প্রদান করে। সমস্ত পরীক্ষার কেস সহ এখানে একটি যথাযথভাবে ব্যবধানযুক্ত সংস্করণ: এটি অনলাইনে চেষ্টা করুন!

(d f                         Define f to be
 (q(                          a quoted two-item list (which acts as a function):
  (x y z p)                    Arglist: the three bowls x y z and power p
  (i p                         If p is nonzero
   (i (l p 0)                   then if p is negative (spending power)
    (f(s x p)y(a z p)0)          then take -p from z, add -p to x, and recurse with p=0
    (i x                         else (gaining power), if x is nonzero
     (f(s x 1)(a y 1)z(s p 1))    then take 1 from x, add to y, decrement p and recurse
     (i y                         else if y is nonzero
      (f x(s y 1)(a z 1)(s p 1))   then take 1 from y, add to z, decrement p and recurse
      (f x y z 0))))               else no moves possible; recurse with p=0
   (c x(c y(c z())))))))        else (p=0), cons x y z into a list and return it
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.