बिलियर्ड खेलना


17

इस कोड गोल्फ में, आपको सबसे छोटे शॉट की दिशा निर्धारित करनी होगी जो पॉकेट में गिरने से पहले बिल्कुल एन कुशन को हिट करता है ।

बिलियर्ड टेबल निम्नलिखित विशेषताओं के साथ एक 6 पॉकेट पूल टेबल है:

  • आयाम परिवर्तनशील हैं ( एक x b )
  • कोई घर्षण नहीं: गेंद हमेशा के लिए लुढ़क जाएगी जब तक कि वह जेब में न आ जाए
  • जेब और गेंद का आकार लगभग शून्य है। इसका मतलब यह है कि गेंद जेब में तभी गिरेगी जब उनके पास एक ही स्थिति होगी।
  • गेंद को शुरुआत में निचले बाएं छेद में रखा जाता है (लेकिन इसमें गिरावट नहीं होती है)

3cushion

एक पूरा कार्यक्रम या समारोह है कि आयाम (लेता बनाएं एक , हिट करने के लिए तालिका के) और तकिये के एक नंबर n वास्तव में मार कम से कम पथ की डिग्री में कोण इनपुट और रिटर्न के रूप में एन एक जेब में गिरने से पहले तकिये।

  • > 0
  • b > ०
  • 0 <= n <10000000
  • 0 < अल्फा <90 (डिग्री में) सटीक: कम से कम 10 ^ -6

उदाहरण :

साथ एक = 2, = 1, n = 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 कुशन मारना है ?
पीटर टेलर

@PeterTaylor बिल्कुल n कुशन
डेमियन

सबसे छोटा रास्ता हमेशा आगे और पीछे बाईं ओर ऊपर और नीचे के बीच होता है और फिर बीच के छेद में से एक में?
यूमेल

नहीं, 2 1 4 उदाहरण देखें। यह रास्ता sqrt (25) = 5 लंबा है जबकि आपका समाधान sqrt (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 बाइट्स @ @ धन्यवाद के लिए धन्यवाद

स्पष्टीकरण: कुशन हिट की गणना करने के बजाय, मैं एन टेबल जोड़ रहा हूं और नए छेद को मान्य मान रहा हूं: बिलार्ड ब्लैक बॉर्डर / होल मूल है, ग्रीन बॉर्डर / छेद n = 1 के लिए मान्य है, लाल बॉर्डर / छेद के लिए वैध है n = 2 और इसी तरह। फिर मैं अमान्य छेद (जैसे n = 1 के लिए नीले तीर) को हटा देता हूं। मेरे पास मान्य छेद और उनके निर्देशांक की एक सूची होगी, फिर मैं प्रारंभिक बिंदु से उनकी दूरी की गणना करता हूं, और फिर छोटी दूरी के कोण की।
नोट:
a = 4.76, b = 3.64, n = 27 - 52.66286 दें, यह पता लगाने की कोशिश करें कि क्यों तय किया गया है, और इस प्रक्रिया में 8 बाइट्स बचाए गए हैं = D
a 43, b = 21, n = 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 बाइट प्राप्त कर सकते हैं। :) (What @MorganThrapp ने कहा)
-

2
यह रास्ता वैध है, लेकिन यह सभी मामलों में सबसे छोटा नहीं है, उदाहरण के लिए 2 1 4 ..
डेमियन

यह भी मानता है b < a। यह आसानी से न्यूनतम / अधिकतम aऔर bहालांकि प्राप्त करके तय किया जा सकता है ।
user81655

फिक्स्ड (सॉर्टा)
रॉड

3

हास्केल, 133 117 बाइट्स

यह मेरा कार्यान्वयन है:

एक 2x1 तालिका के साथ, एक पथ पॉकेट में जाने से पहले बिल्कुल n कुशन को हिट करेगा अगर: (x-1) / 2 + (y-1) == n और x, y पारस्परिक रूप से primes हैं। जहाँ x, y क्षैतिज / ऊर्ध्वाधर अक्षों पर गेंद की दूरी है।

पथ मनमानी तालिका आकार के साथ समान हैं, इसलिए हमें बस (ए, बी) के साथ लंबाई और कोण को अपडेट करना होगा और सबसे छोटा रखना होगा। पथ की लंबाई sqrt ((x * a / 2) ^ 2 + (y * b) ^ 2) है और कोण atan ((y * b) / (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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.