মিনি গল্ফ কোড গল্ফ


18

এটি একটি মিনি গল্ফ গর্ত:

বাইরের সীমানাটি 10 ​​এবং কেন্দ্রের (0,0) ব্যাসার্ধ সহ একটি বৃত্ত। অভ্যন্তরীণ সীমারেখাটি একটি ব্যাসার্ধ 3 এবং কেন্দ্র (0,5) সহ একটি বৃত্ত। টি (0, -8) এ রয়েছে। ধরুন বল ব্যাসার্ধ 0 এর সাথে একটি পয়েন্ট মাত্র।

বলের গতিশীলতা নিম্নলিখিত নিয়ম দ্বারা নিয়ন্ত্রিত হয়:

  • বলটি প্রথমে শক্তি 50 এবং একটি প্রদত্ত কোণ দিয়ে আঘাত করা হয়।

    • কার্টেসিয়ান স্থানাঙ্ক ব্যবস্থায় কোণটি হতাশায় রয়েছে, সুতরাং 0 ° এর অর্থ সরাসরি ডানদিকে, 90 directly সরাসরি উপরে থাকে, ইত্যাদি।
  • বলটি অভ্যন্তরীণ বা বাহ্যিক বৃত্তের প্রান্তে আঘাত করলে, এটি প্রতিবিম্বের আইনটি ব্যবহার করে বৃত্তটি বন্ধ করে দেয়।

    • সেই বিন্দুতে বৃত্তের সাথে সংঘর্ষের কোণটি প্রতিবিম্বের কোণের সমান। (এখানে কোণগুলি সংঘর্ষের স্থানে বৃত্তের স্পর্শক রেখার সাথে সম্পর্কিত))

    • স্পষ্টকরণের জন্য, এটি বা এটি দেখুন (দ্বিতীয় লিঙ্কটির স্বীকৃতিতে, এই চ্যালেঞ্জটিতে R_0 = 0।)

  • বলটি চলতে চলতে শক্তি হারাতে থাকে।

    • এটি জুড়ে থাকা প্রতিটি ইউনিটের জন্য, এটি 1 ইউনিট শক্তি হারিয়ে ফেলে oses

    • প্রতিবার এটি কোনও প্রাচীরের বাইরে চলে আসে এটি 5 ইউনিট শক্তি হারিয়ে ফেলে।

  • শক্তিটি ফুরিয়ে গেলে বা গর্তে পড়লে বলটি থামে।

    • যদি বলটি <= 5 ইউনিট শক্তির সাথে কোনও দেয়ালে আঘাত করে তবে এটি বন্ধ হয়ে যায়।

    • এটি গর্তে পড়ে যদি তার শক্তি থাকে <10 যখন এটি গর্তের 1 দূরত্বের মধ্যে থাকে, অন্যথায় এটি চলতে থাকে।

চ্যালেঞ্জ

কোনও গর্তের এক্সআই স্থানাঙ্ক দেওয়া, বলটি গর্তে পড়ার জন্য আপনি বলটি আঘাত করতে পারেন এমন কোণটি ফিরিয়ে দিন (যদি এমন কোণ উপস্থিত থাকে)।

ইনপুট

ইনপুট হিসাবে কোনও সুবিধাজনক আকারে গর্তের কেন্দ্রের এক্স এবং y- স্থানাঙ্ক হিসাবে গ্রহণ করুন। ইনপুটটি STDIN (বা নিকটতম বিকল্প), কমান্ড লাইন প্যারামিটার বা ফাংশন যুক্তি থেকে নেওয়া যেতে পারে।

আউটপুট

ডিগ্রি এমন একটি কোণ মুদ্রণ করুন বা ফিরে করুন যেখানে বল টি থেকে এমনভাবে আঘাত করতে পারে যাতে বলটি গর্তে পড়ে। যদি এই জাতীয় কোণ উপস্থিত থাকে তবে আউটপুটটি [0, 360) এর মধ্যে থাকা উচিত, অন্যথায় আউটপুটটি -1 হওয়া উচিত।


আপনি x এবং y মানগুলি কীভাবে পড়তে হবে তা নির্দিষ্ট করতে চান (স্ট্যান্ডার্ড ইনপুট, ফাংশন আর্গুমেন্ট ইত্যাদি)।
লুভজো

এ জাতীয় কোনও অস্তিত্ব না থাকলে কী ফিরিয়ে দেওয়া উচিত?
অ্যালেক্স এ।

আসুন নির্দিষ্ট করে দিন যে কোনও সমাধান থাকলে ফাংশনটি [0,360) এ একটি মান প্রদান করবে এবং অন্যথায় -1 প্রদান করবে।
এরিক ব্রুকস

আমি বেশ কয়েকটি সম্পাদনা করেছি। যদি এটি আপনার উদ্দেশ্যটির সাথে মেলে না, দয়া করে সম্পাদনাটি আবার রোল করুন।
অ্যালেক্স এ।

এছাড়াও, আপনি কমপক্ষে একটি পরীক্ষার কেস সরবরাহ করতে পারেন?
অ্যালেক্স এ।

উত্তর:


4

সি, 415 430

সম্পাদনা: @ উইনি উল্লিখিত মত, 255 এর উপরে প্রস্থানের মানগুলি সম্ভব নয়, সুতরাং 360 টির মান মুদ্রণের জন্য আমাকে এই কোডের আকারটি বাড়াতে হয়েছিল।

2 (এবং কেবল 2) কমান্ড-লাইন ইনপুটগুলি (xy) ইনট হিসাবে ধরে নেয়। ডিগ্রিতে উত্তর মুদ্রিত হয় বা -1 ডিগ্রি না থাকলে।

#include <math.h>
#define E(z) {if((e-=5)<0)break;q=n/sqrt(n*n+pow(m-z,2));w=(m-z)/sqrt(n*n+pow(m-z,2));d=(t=d)*(1-2*q*q)-2*f*q*w;f=f*(1-2*w*w)-2*t*q*w;}
main(a,v)char**v;{float D=.01,e,d,f,n,m,p=.0174,q,t,w;a-=4;while(++a<360){n=0,m=-8,d=D*cos(a*p),f=D*sin(a*p),e=50;while(e>0){if((pow(n-atoi(v[1]),2)+pow(m-atoi(v[2]),2)<1)&(e<10)&&printf("%d",a))return;n+=d,m+=f,e-=D;if(n*n+m*m>100)E(0)if(n*n+pow(m-5,2)<9)E(5)}}puts("-1");}

যাত্রা।

>./golfed 0 2; echo $?
90
>./golfed 0 10; echo $?
0
>./golfed -2 -7; echo $?
12

প্রথমবারের গল্ফার; সম্ভবত কিছুটা উন্নতি করা যেতে পারে। যদি আমাদের আরও নির্ভুলতার প্রয়োজন হয় তবে আমার কাছে এমন একটি সংস্করণ রয়েছে যা XY এ নিয়ে যায় এবং ডাবলসের সাথে কোণটি ফিরে আসে ।01 ডিগ্রি নির্ভুলতার সাথে 449 অক্ষরে কাজ করে।

পঠনযোগ্য সংস্করণ:

#include <math.h>
int main(int argc, char** argv)
{
    // p is roughly pi/180 and q, t, and w are temp vars
    float Delta=.01, energy, delta_x, f(delta_y), n(cur_x), m(cur_y), p=.0174, q, t, w;
    argc -= 4; /*using argc as int for angle*/
    // iterate through each degree
    while (++argc < 360)
    {
        n=0, m=-8, d=D*cos(a*p), f=D*sin(a*p), e=50;
        // then move in discrete .01 steps
        while (e > 0)
        {
            // check to see if we're inside the hole
            if ((pow(n-atoi(v[1]),2) + pow(m-atoi(v[2]),2) < 1) 
                & (e<10) && printf("%d",a)) return;
            // move forward
            n += d, m += f, e -= D;
            // check if we've hit the outer wall
            if (n * n + m * m > 100)
            {
                // if too slow, finish this iteration
                // if not, find reflection vector
                if ((e -= 5) < 0) break;
                q = n / sqrt(n * n + pow(m,2));
                w = (m) / sqrt(n * n + pow(m,2));
                d = (t = d) * (1 - 2 * q * q) - 2 * f * q * w;
                f = f * (1 - 2 * w * w) - 2 * t * q * w;
            }
            // check inner wall collision
            if (n * n + pow(m - 5,2) < 9)
            {
                // if too slow, finish this iteration
                // if not, find reflection vector
                if ((e -= 5) < 0) break;
                q = n / sqrt(n * n + pow(m - 5,2));
                w = (m - 5) / sqrt(n * n + pow(m - 5,2));
                d = (t = d) * (1 - 2 * q * q) - 2 * f * q * w;
                f = f * (1 - 2 * w * w) - 2 * t * q * w;
            }
        }
    }
    // if an angle not found, return -1
    puts("-1");
}

আমি মনে করি না আপনি 255 এর চেয়ে বড় মানগুলি দিয়ে দিতে পারবেন exit(code)। লিনাক্স এবং ফ্রিবিএসডি এর মাধ্যমে পরীক্ষিত echo 'int main(){return 300;}' > test.c && cc test.c && ./a.out; echo $?
উইনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.