বিলিয়ার্ডস খেলছে


17

এই কোড গল্ফটিতে, আপনাকে পকেটে পড়ার আগে সবচেয়ে ছোট শটটির দিক নির্ধারণ করতে হবে যা হ'ল এন কুশনকে আঘাত করে ।

বিলিয়ার্ড টেবিলটি নিম্নলিখিত বৈশিষ্ট্য সহ একটি 6 পকেট পুল টেবিল:

  • মাত্রা পরিবর্তনশীল ( একটি এক্স বি )
  • কোনও ঘর্ষণ নেই: বলটি পকেটে না যাওয়া পর্যন্ত চিরতরে ঘুরবে
  • পকেট এবং বলের আকারগুলি প্রায় শূন্য। এর অর্থ হ'ল বল পকেটে পড়বে কেবল যদি তাদের একই অবস্থান থাকে।
  • বলটি প্রথমে নীচে বাম গর্তে স্থাপন করা হয় (তবে এতে পড়ে না)

3cushion

একটি পূর্ণ প্রোগ্রাম বা ফাংশন যা মাত্রা (নেয় তৈরি করুন একটি , আঘাত টেবিলের) এবং নিরাপত্তা একটি নম্বর এন ঠিক আঘাত সবচেয়ে কম পথের ডিগ্রীতে কোণ ইনপুট এবং আয় যেমন এন একটা পকেট মধ্যে পতিত আগে নিরাপত্তা।

  • a > 0
  • b > 0
  • 0 <= n <10000000
  • 0 < আলফা <90 (ডিগ্রীতে) নির্ভুলতা: কমপক্ষে 10 ^ -6

উদাহরণ:

সঙ্গে একটি = 2, = 1, এন = 1 তিনটি সম্ভাব্য পাথ: (1) (2) (3) নিচের চিত্র উপর। সংখ্যা (1) সবচেয়ে সংক্ষিপ্ত তাই আউটপুটটি atan (2) = 63.43494882292201 ডিগ্রি হওয়া উচিত

1cushion

সমাধান একটি = 2, = 1, এন = 4 হয় ATAN (4/3) = 53,13010235415598 ডিগ্রী

4cushions

পরীক্ষার নমুনা:

a = 2,    b = 1,    n = 1,       -> alpha = 63.43494882292201
a = 2,    b = 1,    n = 2,       -> alpha = 71.56505117707799
a = 2,    b = 1,    n = 3,       -> alpha = 75.96375653207353
a = 2,    b = 1,    n = 4,       -> alpha = 53.13010235415598
a = 2,    b = 1,    n = 5,       -> alpha = 59.03624346792648
a = 2,    b = 1,    n = 6,       -> alpha = 81.86989764584403
a = 4.76, b = 3.64, n = 27,      -> alpha = 48.503531644784466
a = 2,    b = 1,    n = 6,       -> alpha = 81.86989764584403
a = 8,    b = 3,    n = 33,      -> alpha = 73.24425107080101
a = 43,   b = 21,   n = 10005,   -> alpha = 63.97789961246943

এটি কোড / বিলিয়ার্ড গল্ফ: সংক্ষিপ্ততম কোড জয়!


বলটি কি ঠিক n কুশন, বা কমপক্ষে n কুশন মারতে হবে ?
পিটার টেলর

@ পিটারটেলর হ'ল এন কুশন
ড্যামিয়েন

বাম পাশের উপরে এবং নীচের মাঝে এবং তারপরে মাঝের গর্তের মধ্যে সর্বদা সংক্ষিপ্ততম পথটি কি পিছনে নেই?
Eumel

না, 2 1 4 উদাহরণ দেখুন। এই পথটি বর্গক্ষেত্র (25) = 5 দীর্ঘ যেখানে আপনার সমাধান বিকাশ (26)
ড্যামিয়েন

উত্তর:


11

পাইথন 2.7, 352 344 281 বাইট

from math import*
def l(a,b,n):
 a*=1.;b*=1.
 r=set()
 for i in range(1,n+3):
  t=[]
  for k in range(1,i):
   for h in[0,.5]:
    x=(i-k-h)
    if 1-(x/k in r):r.add(x/k);t+=(x*a,k*b),
 d=(a*n+1)**2+(b*n+1)**2
 for x,y in t:
  if x*x+y*y<d:d=x*x+y*y;o=degrees(atan(y/x))
 return o
  • -16 বাইটস @ ডিসকোনিকে ধন্যবাদ

ব্যাখ্যা: পরিবর্তে কুশন হিটগুলি গণনা করে, আমি এন টেবিলগুলি যুক্ত করছি এবং নতুন গর্তকে বৈধ হিসাবে নিচ্ছি: Billard কালো বর্ডার / গর্তগুলি মূল, সবুজ বর্ডার / গর্তগুলি এন = 1 এর জন্য বৈধ, লাল বর্ডার / গর্তগুলি বৈধ n = 2 এবং আরও। তারপরে আমি অবৈধ ছিদ্রগুলি মুছে ফেলি (উদাঃ ন = এর জন্য নীল তীর)। আমার কাছে বৈধ ছিদ্র এবং তাদের স্থানাঙ্কের একটি তালিকা থাকবে, তারপরে আমি প্রাথমিক বিন্দু থেকে তাদের দূরত্ব গণনা করব এবং তারপরে আরও ছোট দূরত্বের কোণ।
মন্তব্য:
a = 4.76, বি = 3.64, এন = 27 - কেন স্থির হয়েছে তা নির্ধারণের চেষ্টা করে এবং প্রক্রিয়ায় 8 বাইট সংরক্ষণ করেছে = ডি
এ = 43, বি = 21, এন = 10005 - ~ 80 সেকেন্ড লাগে ( কিন্তু সঠিক কোণ দেয়)

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

from math import *
def bill(a,b,n):
    a=float(a)
    b=float(b)
    ratios = set()
    for i in range(0,n+2): # Create the new boards
        outter = []
        j=i+1
        for k in range(1,j): # Calculate the new holes for each board
            #y=k
            for hole_offset in [0,0.5]:
                x=(j-k-hole_offset)
                if (x/k) not in ratios:
                    ratios.add(x/k)
                    outter.append((x*a,k*b))
    min_dist = (a*n+1)**2+(b*n+1)**2
    for x,y in outter:
        if x*x+y*y<min_dist:
            min_dist = x*x+y*y
            min_alpha=degrees(atan(y/x))
    return min_alpha

আপনি স্থানটি সরিয়ে একটি বাইট সংরক্ষণ করতে পারেন : degrees
মরগান থ্র্যাপ

আপনার উত্তর (গণিতের দিক দিয়ে) কীভাবে কাজ করে তা আমার কোনও ধারণা নেই তবে আমি মনে করি কোলনের পরে স্থানটি সরিয়ে আপনি 1 বাইট অর্জন করতে পারবেন। :) (@ মরগানথ্রাপ কী বলেছে)
-হেনরি

2
এই পথটি বৈধ, তবে এটি সমস্ত ক্ষেত্রে সংক্ষিপ্ত নয়, উদাহরণস্বরূপ 2 1 4 এর সাথে ..
ড্যামিয়েন

এটিও ধরে নিয়েছে b < a। এটি সর্বনিম্ন / সর্বোচ্চ aএবং bযদিও পেয়ে খুব সহজেই ঠিক করা যায় ।
ব্যবহারকারী 81655

স্থির (সাজ্টে)
রড

3

হাস্কেল, 133 117 বাইট

এটি আমার বাস্তবায়ন:

একটি 2x1 টেবিলের সাহায্যে, কোনও পকেট পকেটে যাওয়ার আগে একটি পাথ হুবহু এন কুশনগুলিকে আঘাত করবে যদি: (x-1) / 2 + (y-1) == n এবং x, y পারস্পরিক প্রাইম হয়। যেখানে x, y অনুভূমিক / উল্লম্ব অক্ষের উপর দিয়ে বলের দূরত্ব।

স্বেচ্ছাসেবক সারণীর আকারের সাথে পাথগুলি একই রকম, সুতরাং আমাদের কেবল (ক, খ) দিয়ে দৈর্ঘ্য এবং কোণগুলি আপডেট করতে হবে এবং সংক্ষিপ্ততম রাখতে হবে। পাথের দৈর্ঘ্য বর্গক্ষেত্র ((x * a / 2) ^ 2 + (y * b) ^ 2) এবং কোণটি আতান ((y * খ) / (x * a / 2)) হয়

z=toEnum
f a b n=minimum[[z x^2+r^2,180/pi*atan(r/z x)]|x<-[1..2*n+2],y<-[n+1-div(x-1)2],r<-[2*b/a*z y],gcd x y<2]!!1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.