নিরাপদে পাস করতে ট্রোল টোল গণনা করুন


12

Https://puzzling.stackexchange.com/q/626 দ্বারা অনুপ্রাণিত


আপনার দু: সাহসিক কাজগুলিতে আপনি 7 টি সেতুতে ক্রস করতে হবে series প্রতিটি ব্রিজের নীচে একটি ট্রল থাকে। ব্রিজটি অতিক্রম করার জন্য, আপনাকে প্রথমে ট্রোলটি আপনাকে বহন করা কেকের সংখ্যার শতাংশ হিসাবে অবশ্যই কয়েকটি সংখ্যক কেক দিতে হবে। যেহেতু এগুলি সদয় ট্রল, তারা আপনাকে একটি নির্দিষ্ট সংখ্যক কেক ফিরিয়ে দেবে।

প্রতিটি দিনের শুরুতে, স্থানীয় ট্রোল কিং প্রতিটি ভ্রমণকারীকে যে শতাংশ কেক ট্যাক্স দিতে হবে তা নির্ধারণ করে এবং ট্রোল কেকের ফেরত ফেরত - প্রতিটি ট্রোলকে অবশ্যই ভ্রমণকারীদের ফিরিয়ে দিতে হবে এমন কেকের সংখ্যা।

আপনার কাজ হ'ল সেই দিন প্রদত্ত অবস্থার জন্য সমস্ত 7 টি ট্রল ব্রিজ পাস করার জন্য প্রয়োজনীয় ন্যূনতম সংখ্যার কেক গণনা করা।

ধরে:

  1. দুটি ইনপুট প্যারামিটার: শতাংশ কেক ট্যাক্স (0 থেকে 100 পর্যন্ত পূর্ণসংখ্যা) এবং ট্রোল কেকের রিফান্ড।
  2. ট্রলও নয়, কেউই অন্য ট্রল দ্বারা আংশিকভাবে খাওয়া একটি কেক চায় না। যদি আপনি একটি কেকের ভগ্নাংশ রেখে যান তবে ট্রলটি তা পায়।
  3. যদি কোনও ট্রল একটি কেক শুল্ক গ্রহণ করে তবে তারপরে আপনাকে সমস্ত কেক ফিরিয়ে দিতে হবে (আগের তুলনায় একই বা কম কেকের সাহায্যে বাকী থাকবে), এতে রাগ হয়ে আপনার এবং আপনার পিঠা খাবে eat
  4. প্রতিটি ট্রোলকে অবশ্যই কমপক্ষে একটি সম্পূর্ণ কেক রাখতে হবে।
  5. আপনি কেবল সর্বোচ্চ 100 টি কেক বহন করতে পারেন।
  6. আপনি বর্তমানে যে দিনটি অবস্থান করছেন সেখানে বা সমস্ত 7 সেতুর অন্যদিকে আপনাকে শেষ করতে হবে।

চ্যালেঞ্জ:

বর্তমান দিন বা শূন্যের জন্য নিরাপদে আজ ভ্রমণ করা সম্ভব না হলে ন্যূনতম সংখ্যক কেক আউটপুট দেওয়ার জন্য একটি সম্পূর্ণ প্রোগ্রাম লিখুন - আগামীকাল সংখ্যাটি কী তা দেখার জন্য আপনি অপেক্ষা করবেন।

স্টিডিন, কমান্ড লাইন আর্গুমেন্ট বা ফাইল ইনপুট হিসাবে ইনপুটটি পাস করা উচিত।

সংক্ষিপ্ততম কোড (বাইট গণনা) জিতেছে।

উদাহরণ:

25% কেক ট্যাক্স, 2 ট্রোল কেক রিফান্ড।


ট্রোল 1 এর আগে 19 টি কেক দিয়ে শুরু করুন : (19 * 0.75) = ট্রোল
1 এর পরে 14.25 : (14 + 2) = 16

ট্রোল 2 এর আগে: (16 * 0.75) = 12
ট্রোল 2 পরে: (12 + 2) = 14

প্রভৃতি

19 কেক -> 16 -> 14 -> 12 -> 11 -> 10 -> 9 -> 8
18 কেক -> 15 -> 13 -> 11 -> 10 -> 9 -> 8 -> 8 (বিধি 3)

18 টি কেকের জন্য, শেষ ট্রলটি কোনও কেক রাখেনি। সুতরাং, 25% / 2 দিনের জন্য কেকের সর্বনিম্ন সংখ্যা 19 হয় is

input: 25 2
output: 19

উদাহরণ 2:

90% কেক ট্যাক্স, 1 ট্রল কেক রিফান্ড

100 কেক -> 11 -> 2 -> 1 (নিয়ম 4)

তৃতীয় ট্রলটি কোনও কেক রাখেনি। অতএব সর্বাধিক সংখ্যক কেক দিয়ে শুরু করেও 90% / 1 দিনে ভ্রমণ করা সম্ভব নয়।

input: 90 1
output: 0

উপাত্ত

ইনপুট এবং আউটপুট মানগুলির একটি দ্রুত গ্রাফ একসাথে রাখুন। আমি অবাক হয়েছিলাম এটি "মসৃণ" ছিল না (ঘন্টার বক্র বা অনুরূপ); বেশ কয়েকটি লক্ষণীয় দ্বীপ রয়েছে।

ডেটা চার্ট

আগ্রহীদের জন্য ডেটা। কলামগুলি 5% ব্যবধানে বিভক্ত করা হয়েছে, সারিগুলি 1 টি পিষ্টক ফেরতের ব্যবধানগুলির একক (চিত্রটি এক্সেলকে ঘোরানো)। আপনি দেখতে পাচ্ছেন যে 28 টি কেকের চেয়ে বেশি টাকা ফেরত পাওয়া যাবে না।

27, 17, 13, 14, 15, 18, 20, 24, 53, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
47, 27, 20, 19, 19, 19, 24, 39, 48, 68, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0
67, 37, 28, 24, 23, 28, 27, 29, 50, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
87, 47, 33, 29, 27, 28, 31, 44, 37, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 57, 40, 34, 31, 29, 34, 34, 62, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 67, 48, 39, 35, 38, 37, 49, 57, 76, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 77, 53, 44, 39, 38, 47, 39, 59, 78, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 87, 60, 49, 43, 39, 40, 54, 46, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 97, 68, 54, 47, 48, 44, 44, 71, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 73, 59, 51, 48, 47, 59, 73, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 80, 64, 55, 49, 51, 49, 68, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 88, 69, 59, 58, 54, 64, 70, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 93, 74, 63, 58, 57, 54, 57, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 100, 79, 67, 59, 67, 69, 82, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 84, 71, 68, 60, 59, 77, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 89, 75, 68, 64, 74, 79, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 94, 79, 69, 67, 64, 66, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 99, 83, 78, 71, 79, 91, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 87, 78, 74, 69, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 91, 79, 77, 84, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 95, 88, 87, 74, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 99, 88, 80, 89, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 89, 84, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 87, 94, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 91, 84, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 99, 94, 99, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 97, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

ভাল যুক্তি. সরলতার জন্য এটি একটি সম্পূর্ণ প্রোগ্রাম করুন। ইনপুট নির্দিষ্ট করা যেতে পারে তবে যতক্ষণ না এটি হার্ড-কোডড (আপডেট চ্যালেঞ্জ) না থাকে ততক্ষণ আপনি ফিট দেখতে পারেন।

এটি সিজেএম-এ জোরপূর্বক শক্তিশালী ধাঁধা। আমি আগামীকালই এটি করব

বাহ, এই কারণেই সি # তে ভাল জিনিস থাকতে পারে না

বিধি 2 দেখে মনে হচ্ছে যে ট্রোলটি কেবলমাত্র একটি কেকের একটি ভগ্নাংশ গ্রহণ করার সম্ভাবনা বাদ দেয়, যা অনুমান 4 রিয়ন্ডান্ট করা উচিত। তবুও আপনি উদাহরণ 2 বলছেন যে তৃতীয় ট্রলটি কেবল 0.8 কেক পাবে akes
ডেনিস

কল্পনা নিয়ে দ্বন্দ্ব রয়েছে। ইন 25 211 পিষ্টক ক্ষেত্রে, আপনি দানব 2.75 কেক দিতে এবং ফিরে 2 পেতে তাই দানব রাখে .75 (+ +। 25) এবং আপনার টেকা। ইন 90 12 পিষ্টক ক্ষেত্রে, আপনি দানব 1.8 দিতে এবং তাই দানব রাখে .8 ফিরে 1 পেতে (+ +। 2) কিন্তু আপনি মারা যায়।
টুইনাইট

উত্তর:


6

সিজেম, 46 43 41 39 38 36 33 বাইট

100:H,{)_7{ea:i~H@m2$*H/+@;}*>}#)

এআরজিভি এর মাধ্যমে ইনপুট।

একটি অনলাইন দোভাষী আছে, তবে দুর্ভাগ্যক্রমে এটি কমান্ড-লাইন যুক্তি সমর্থন করে না। পরীক্ষার জন্য, আপনি এই সংস্করণটির সাথে এটি STDIN থেকে নকল করতে পারেন:

rr]:A;
100:H,{)_7{A:i~H@m2$*H/+@;}*>}#)

এআরজিভি-ভিত্তিক সংস্করণটির ব্যাখ্যা:

100:H                                  "Push a 100 and save it in H.";
     ,                                 "Create a range (as an array) from 0 to 99.";
      {                       }#       "Find the first index in [0,1,2,...,99] for which the
                                        block produces a truthy (non-zero) value.";
       )_                              "Increment and duplicate the current array element.";
         7{                }*          "Execute the block seven times.";
           ea:i                        "Push the command-line arguments as an array of strings
                                        and convert each element to an integer";
               ~                       "Unwrap the array.";
                H@                     "Push a 100 and rotate the stack to pull up
                                        the first command line argument.";
                  m                    "Subtract (from 100).";
                   2$                  "Copy the last iterations result.";
                     *H/               "Multiply and divide by 100, deducting tax.";
                        +              "Add the refund.";
                         @;            "Rotate top three stack elements, and discard the one that 
                                        has been pulled to the top. This always leaves the last 
                                        two results on the stack.";

                             >         "Make sure that the last result was less than the second 
                                        to last. Yields 0 or 1.";
                                )      "After the # search completes, we'll get -1 if no such 
                                        index exists, or one less than the desired number if it 
                                        does, so we can just increment.";

স্ট্যাকের সামগ্রীগুলি প্রোগ্রামের শেষে স্বয়ংক্রিয়ভাবে মুদ্রিত হয়।


আপনার কোড 55 2(এর 0পরিবর্তে 100) এবং 56 5( 98পরিবর্তে ) এর জন্য ভুল ফলাফল তৈরি করে 94। এটি কারণ 100_0.55*-iএবং 25_0.56*-iভাসমান পয়েন্ট অসম্পূর্ণতার শিকার হয়ে পড়ে। আমি যতদূর বলতে পারি, 31 24, 31 25, 33 21, 33 22, 33 23, 35 10, 35 12, 35 15, 35 16, 35 27, 56 1, 57 4জোড়গুলিও ভুল ফল দেয়।
ডেনিস

1
@ ডেনিস স্থির, ধন্যবাদ!
মার্টিন ইন্ডার

@ ডেনিস যা আসলে একটি বাইট সংরক্ষণ করেছিল। আমি আশা করি সিজেএমের ক্লোজারগুলি ছিল, তবে আমি শুরুতে কেবলমাত্র একটি ব্লক সংজ্ঞা দিতে পারতাম যা কর ছাড়ের মতো হয় এবং দুটি ভেরিয়েবল ব্যবহার না করে এটি ব্যবহার করতে পারি। আমি STDIN এর পরিবর্তে ARGV ব্যবহার করে কিছু সঞ্চয় করতে পারি, আমাকে দেখতে দিন।
মার্টিন ইন্ডার

5

সিজেম, 44 40 38 37 35 বাইট

l~U100:M),{{_M5$-*M/3$+_@<*}7*}=]W=

অথবা কমান্ড লাইন আর্গুমেন্ট এবং {}#ট্রিক ব্যবহার করার সময়, 33 বাইট :

100:M,{){_ea:i~M@-@*M/+_@<*}7*}#)

এটিকে আমার প্রধান হিসাবে বিবেচনা না করা {}#মার্টিনের উত্তর থেকে অনুপ্রাণিত।

উদাহরণ রান:

ইনপুট:

25 2

আউটপুট:

19

আরেকটি:

ইনপুট:

15 14

আউটপুট:

100

কিভাবে এটা কাজ করে

l~                       "Read the two numbers, swap and convert tax to double";
  U100:M),               "Push 0 and [0, 1, ... 100] to stack, storing 100 in M";
          {  ...  }=     "Run this code for each element until top stack element is 1";
           {...}7*       "Run this code block 7 times";
_                        "Copy the array element";
  M5$                    "Push 100 and a copy tax % to stack";
     -*                  "Number = (100 - tax %) * Number";
       M/                "Integer divide the number by 100";          
         3$+             "Add refund";
            _@<*         "Convert to 0 if refunded number > before tax one";
                    ]W=  "Take the last element of the stack";

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


এবং এখন বাকি আছে ডেনিসের সাথে আসা এবং আমাদের দু'জনকে মারার অপেক্ষা করা। ;)
মার্টিন এন্ডার

সিজেমে নেই;) (আশাকরি)
অপ্টিমাইজার

আমি ]W=কৌশলটি সত্যিই পছন্দ করি তবে এখন পর্যন্ত যতবারই এটি ব্যবহার করার চেষ্টা করি আমি একই চরিত্রের গণনা দিয়ে শেষ করি।
মার্টিন ইন্ডার

@ মার্টিনবাটনার - হ্যাঁ, আমিও।
অপ্টিমাইজার 21

1
@ ডেনিস - এখন 2 বাইট সংক্ষিপ্ত কোডের অতিরিক্ত বেনিফিট সহ কাজ করা উচিত: ডি
অপ্টিমাইজার

4

এপিএল (39)

T R←⎕⋄⊃Z/⍨{⍵(⊢×>)R+⌊⍵×1-T÷M}⍣7¨Z←⍳M←100

ব্যাখ্যা:

  • T R←⎕: কীবোর্ড থেকে দুটি নম্বর পড়ুন এবং সেগুলিতে T(কর) এবং R(ফেরত) সঞ্চয় করুন।
  • Z←⍳M←100: সংখ্যা সংরক্ষণ 100মধ্যে M, এবং থেকে সমস্ত সংখ্যার 1জন্য 100মধ্যে Z
  • {... }⍣7¨: প্রতিটি উপাদান জন্য Z, নিম্নলিখিত ফাংশনটি 7 বার চালান:
    • R+⌊1-T÷M: কত কেক প্রদান করতে হবে তা গণনা করুন,
    • ⍵(⊢×>): ট্রোলটি শুরু হওয়ার চেয়ে বেশি কেক দিয়ে শেষ হলে, বা যদি না হয় তবে 0 দিয়ে সেই পরিমাণটি গুন করুন।
  • ⊃Z/⍨: প্রতিটি উপাদানের জন্য Z, সেই ফাংশনটি দিয়েছিল এমন সংখ্যায় এটি প্রতিলিপি করুন। (সুতরাং সমস্ত নম্বর যার জন্য ফাংশনটি ফিরে 0গেছে সেগুলি অদৃশ্য হয়ে যায়)) তারপরে সেই তালিকা থেকে প্রথম আইটেমটি নির্বাচন করুন। যদি তালিকাটি খালি শেষ হয় তবে এটি দেয় 0

3

সি, 83 বাইট

int cake(int perc_taken, int given_back)
{
    int startcake = floor(100.f/perc_taken*given_back+1);
    for(int i = 0; i < 6; i++)
    {
        startcake = ceil((startcake-given_back) * 100.f/(100 - perc_taken));
    }
    return startcake;
}

যদি এটি কাজ করে তবে এটি 1 থেকে 100 পর্যন্ত নয়, সমস্ত সম্ভাব্য স্টার্টকেকের জন্য কাজ করে।

সম্পাদনা: এটি কাজ করে। Golfed:

n(int p,int g) {int s=100./p*g+1,i=0;for(;i++<6;){s=ceil((s-g)*100./(100-p));}return s;}

'সর্বোচ্চ 100 কেক' সীমা সহ:

n(int p,int g) {int s=100./p*g+1,i=0;for(;i++<6;){s=ceil((s-g)*100./(100-p));}return s>100?0:s;}

91 বাইট।


আমি মনে করি এটি অনুমানের একটি গুরুত্বপূর্ণ অংশ যে সমাধানটি শূন্য ফিরে আসে যদি আপনার শুরুতে 100 টিরও বেশি কেকের প্রয়োজন হয়।
মার্টিন ইন্ডার


1

সি ++ - 202 অক্ষর

যথারীতি, আমার সি ++ সবচেয়ে খারাপ করেছে:

#include<iostream>
int main(){double p,g,c=1,i,r,t;std::cin>>p>>g;for(;c<101;c++){r=c;for(i=0;i<7;i++){t=(int)(r*(1-(p/100))+g);if(t>=r){r=-1;break;}r=t;}if(r!=-1)break;}r!=-1?std::cout<<c:std::cout<<0;}

1

এপিএল, 36

x y←⎕⋄101|1⍳⍨y<x×{y+⍵-⌈⍵×x}⍣6⍳x÷←100

ব্যাখ্যা

মনে রাখবেন যে "কেকের প্রান্তিক" রয়েছে। করের হার xএবং ফেরতের জন্য y, y÷xপরবর্তী ব্রিজটি পাস করার জন্য আপনার কেকের চেয়ে কঠোরভাবে আরও বেশি প্রয়োজন ।

x y←⎕ইনপুট নিন এবং x(ট্যাক্স) এবং y(রিটার্ন)
⍳x÷←100বিভক্তিকে x100 দ্বারা ভাগ করুন এবং তারপরে 1 থেকে 100 এর অ্যারে তৈরি করুন

{y+⍵-⌈⍵×x}⍣6"পাস ব্রিজ" ফাংশনটি 6 বার কল করুন:
⌈⍵×xআপনার কাছে যে কেক রয়েছে তার সংখ্যা, করের হারের চেয়ে বহুগুণ বেশি (আপনি যে পরিমাণ অর্থ প্রদান করেন)
⍵-আপনার যে কেক রয়েছে তার সংখ্যার বিয়োগ
y+করুন ফেরত যোগ করুন

তারপরে আপনি একটি 100-উপাদান অ্যারে পাবেন যেখানে আপনি 1 ~ 100 কেক দিয়ে শুরু করলে 6 টি সেতু পার হওয়ার পরে আপনার যে কেকের বাকি রয়েছে তা প্রদর্শিত হবে। আপনি শেষ ব্রিজটি পার করতে পারবেন কিনা তা দেখতে, আপনি প্রান্তিকের উপরে আছেন কিনা তা পরীক্ষা করে দেখুন y÷x। বিকল্পভাবে: এর চেয়ে বড় কিনা তা পরীক্ষা
করে অ্যারের গুণ করুনx
y<y

শেষ
1⍳⍨অবধি, 1(সত্য) এর প্রথম ঘটনার সূচকটি সন্ধান করুন , 101যদি
101|101 101 পাওয়া না যায় তবে ফিরে আসে returns


1

সি 128

অন্যান্য সি এর সমাধানের মতো সুন্দর তবে আমি মনে করি এটি অনিবার্য। মূল কৌশলটি সম্পূর্ণরূপে যায় কিনা তা নির্ভর করে বিভিন্ন মান সহ অভ্যন্তরীণ লুপটি ভেঙে ফেলা হয়। এটি আমাকে ব্যবহার করতে দেয়?: যখন আমি বিরতি ব্যবহার করতাম না তখন;

t,r,j,k,l,p;main(i){for(scanf("%d%d",&t,&r),i=101;k=--i;){for(j=8;--j>0;)(p=r+k*(100-t)/100)<k?k=p:j=0;j?0:l=i;}printf("%d",l);} 

Ungolfed

int t,r,j,k,l,p;
main(int i)
{
    for(scanf("%d%d",&t,&r),i=101;k=--i;)
    {
        for(j=8;--j>0;)
        {
            if((p=r+k*(100-t)/100)<k)
                k=p;
            else
                j=0;
        }
        j?0:l=i;
    }
    printf("%d",l);
}

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