Bilardo oynamak


17

Bu kod golf, bir cebe düşmeden önce tam olarak n yastık vurur en kısa atış yönünü belirlemek zorunda kalacak .

Bilardo masası, aşağıdaki özelliklere sahip 6 cepli bilardo masasıdır:

  • Boyutlar değişkendir ( a x b )
  • Sürtünme yok: top cebe düşene kadar sonsuza kadar yuvarlanacak
  • Cepler ve top boyutları neredeyse sıfırdır. Bu, topun sadece aynı konuma sahip olmaları durumunda cebe düşeceği anlamına gelir.
  • Top başlangıçta sol alt deliğe yerleştirilir (ancak içine düşmez)

3cushion

Tablonun boyutlarını ( a , b ) ve giriş olarak n'ye vurulacak minder sayısını alan ve cebe düşmeden önce tam olarak n yastıklara çarpan en kısa yolun derecesini veren bir tam program veya işlev oluşturun .

  • a > 0
  • b > 0
  • 0 <= n <10000000
  • 0 < alfa <90 (derece olarak) hassasiyet: en az 10 ^ -6

örnekler:

ile bir = 2, b = 1 olduğunda, n, mümkün olan üç güzergâh mevcuttur = 1: (1) (2) (3) aşağıdaki şekil üzerinde. (1) sayısı en kısa olanıdır, bu nedenle çıktı atanmalıdır (2) = 63.43494882292201 derece

1cushion

İçin bir çözüm , bir = 2, b = 1 olduğunda, n, (4/3) 53,13010235415598 derece = atan = 4

4cushions

test örnekleri :

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

Bu kod / bilardo golf: en kısa kod kazanır!


Top vurmak zorunda mı tam n yastıkları veya en azından n minderler?
Peter Taylor

@PeterTaylor tam olarak n yastık
Damien

sol taraf üst ve alt arasında ve sonra orta deliklerden birine giden en kısa yol değil midir?
Eumel

hayır, 2 1 4 örneğine bakın. Bu yol sqrt (25) = 5 uzun, çözümünüz sqrt (26)
Damien

Yanıtlar:


11

Piton 2.7, 352 344 281 bayt

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
  • @Dschoni sayesinde -16 bayt

Açıklama: yerine yastık isabetleri hesaplanıyor, n tablo ekliyorum ve yeni delikleri geçerli olarak alıyorum: bilardo Siyah kenarlık / delikler orijinal, yeşil kenarlık / delikler n = 1 için geçerli, kırmızı kenarlık / delikler için geçerli n = 2 vb. Sonra geçersiz delikleri kaldırıyorum (örneğin n = 1 için mavi ok). Geçerli deliklerin ve koordinatlarının bir listesine sahip olacağım, sonra başlangıç ​​noktasından mesafelerini ve daha küçük mesafenin açısını hesaplıyorum.
Notlar:
a = 4.76, b = 3.64, n = 27 - 52.66286 verin, neden sabitlendiğini ve işlemde 8 bayt kaydetti = D
a = 43, b = 21, n = 10005 - ~ 80 saniye sürer ( ancak doğru açıyı verir)

okunabilir versiyon:

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
İçindeki

Cevabınızın nasıl çalıştığına dair hiçbir fikrim yok (matematik olarak), ancak kolondan sonra alanı kaldırarak 1 bayt kazanabileceğinizi düşünüyorum. :) (@MorganThrapp ne dedi)
-henry

2
Bu yol geçerli, ancak her durumda en kısa değil, örneğin 2 1 4 ..
Damien

Bu da bunu varsayar b < a. Bu, minimum / maksimum ave bolsa da kolayca düzeltilebilir .
user81655

sabit (sorta)
Çubuk

3

Haskell, 133 117 bayt

Bu benim uygulamam:

2x1 tablo ile, bir cebe girmeden önce bir yol tam olarak n yastıklara çarpacaktır: (x-1) / 2 + (y-1) == n ve x, y karşılıklı olarak asalsa. burada x, y topun yatay / dikey eksenler üzerindeki mesafesidir.

Yollar keyfi tablo boyutuyla aynıdır, bu nedenle uzunlukları ve açıları (a, b) ile güncellememiz ve en kısa kalmamız gerekir. Yol uzunluğu sqrt ((x * a / 2) ^ 2 + (y * b) ^ 2) ve açı atanıyor ((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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.