당구를 재생


17

이 코드 골프에서는 포켓에 떨어지기 전에 정확히 n 개의 쿠션 에 맞는 최단 샷의 방향을 결정해야합니다 .

당구 테이블은 다음과 같은 특징이있는 6 개의 포켓 풀 테이블입니다.

  • 치수는 가변적입니다 ( a x b )
  • 마찰 없음 : 공이 주머니에 들어갈 때까지 영원히 굴러갑니다.
  • 포켓과 볼 크기는 거의 제로입니다. 이것은 공이 같은 위치에있는 경우에만 주머니에 빠질 것임을 의미합니다.
  • 공은 처음에 왼쪽 하단 구멍에 배치됩니다 (그러나 떨어지지 않습니다)

3 쿠션

테이블 의 치수 ( a , b )와 n 을 입력 으로 타격 할 쿠션 수 를 취하고 포켓에 떨어지기 전에 정확히 n 개의 쿠션을 타격하는 최단 경로 각도를 반환 하는 전체 프로그램 또는 함수를 작성하십시오 .

  • a > 0
  • b > 0
  • 0 <= n <10000000
  • 0 < 알파 <90 (도) 정밀도 : 10 ^ -6 이상

예 :

함께 = 2, B = 1, n은 세 가지 경로가있다 = 1 : (1) (2) (3) 다음에도이. 숫자 (1)이 가장 짧으므로 출력은 atan (2) = 63.43494882292201도 여야합니다.

1 쿠션

용 용액 = 2, B = 1, N (4/3)는도 53.13010235415598 = ATAN = 4 인

4 쿠션

테스트 샘플 :

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 개의 쿠션
Damien

가장 짧은 경로가 항상 왼쪽 상단과 하단 사이에서 앞뒤로 중간 구멍 중 하나에 들어 가지 않습니까?
Eumel

아니요, 2 1 4 예를보십시오. 이 경로는 sqrt (25) = 5 길지만 솔루션은 sqrt (26)입니다.
Damien

답변:


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
  • @Dschoni 덕분에 -16 바이트

설명 : 대신 쿠션 적중을 계산하고 n 테이블을 추가하고 새 구멍을 유효한 것으로 간주합니다 : Billard 검은 색 테두리 / 구멍은 원래이고 녹색 테두리 / 구멍은 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
Morgan Thrapp

나는 당신의 대답이 어떻게 작동하는지 모르겠지만 (수학적으로) 콜론 다음에 공백을 제거하면 1 바이트를 얻을 수 있다고 생각합니다. :) (@MorganThrapp의 말)
basile-henry 님이

2
이 경로는 유효하지만 모든 경우에 가장 짧지는 않습니다 (예 : 2 1 4).
Damien

이것 또한 가정합니다 b < a. 그것은 쉽게의 최소 / 최대 값을 얻어서 고정 수 ab있지만.
user81655

고정 (sorta)
Rod

3

하스켈, 133117 바이트

이것은 내 구현입니다.

2x1 테이블의 경우 (x-1) / 2 + (y-1) == n 및 x, y가 서로 소수 인 경우 포켓에 들어가기 전에 경로가 정확히 n 개의 쿠션에 도달합니다. 여기서 x, y는 수평 / 수직 축에서의 볼 거리입니다.

경로는 임의의 테이블 크기와 동일하므로 길이와 각도를 (a, b)로 업데이트하고 가장 짧게 유지하면됩니다. 경로 길이는 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.