비틀 거리는 시작


13

레이서가 커브 트랙의 적어도 한 턴을 돌고있는 레이스에서는 각 레이서의 시작 위치가 엇갈리게되므로 각 레이서가 트랙 주위에서 동일한 거리를 이동합니다 (그렇지 않으면 가장 안쪽 차선의 레이서가 큰 이점을 갖습니다) ).

타원형 트랙의 장축과 부축의 길이 (또는 원한다면 반 장점과 반 원점)와 트랙의 차선 수를 고려하여 각 차선이 가장 안쪽 차선의 시작점으로부터의 거리를 출력하십시오 비틀 거려야합니다.

명세서

  • 각 차선은 가장 짧은 차선보다 5 단위 더 긴 반장 축을 가진 타원입니다. 간단히하기 위해 레인의 너비가 0이라고 가정합니다.
  • 가장 안쪽 차선은 항상 0에서 시작하며 다른 모든 시작 지점은 이전 시작 지점보다 크거나 같은 양의 정수입니다.
  • 입력 및 출력은 편리하고 합리적인 형식 일 수 있습니다.
  • 입력은 항상 정수입니다.
  • 트랙의 둘레를 실제 값의 0.01 단위 이내로 계산해야합니다.
  • 출력은 가장 가까운 정수 (마루)로 내림됩니다.
  • 결승선은 가장 안쪽 경주자의 출발점입니다. 레이스에는 랩이 하나만 있습니다.
  • 축의 길이는 트랙의 가장 안쪽 차선을 사용하여 측정됩니다.
  • 가장 안쪽 레인의 오프셋에 0을 출력하는 것은 선택 사항입니다.

테스트 사례

체재: a, b, n -> <list of offsets, excluding innermost lane>

20, 10, 5 -> 30, 61, 92, 124
5, 5, 2 -> 31
15, 40, 7 -> 29, 60, 91, 121, 152, 183
35, 40, 4 -> 31, 62, 94

이 테스트 케이스는 Ramanujan이 고안 한 타원 둘레의 근사치를 사용하는 다음 Python 3 스크립트로 생성되었습니다.

#!/usr/bin/env python3

import math

a = 35 # semi-major axis
b = 40 # semi-minor axis
n = 4  # number of lanes
w = 5  # spacing between lanes (constant)

h = lambda a,b:(a-b)**2/(a+b)**2
lane_lengths = [math.pi*(a+b+w*i*2)*(1+3*h(a+w*i,b+w*i)/(10+math.sqrt(4-3*h(a+w*i,b+w*i)))) for i in range(n)]

print("{}, {}, {} -> {}".format(a, b, n, ', '.join([str(int(x-lane_lengths[0])) for x in lane_lengths[1:]])))

사용 된 근사값은 다음과 같습니다.

타원 둘레 근사

마지막으로 오프셋 계산을 이해하는 데 유용한 다이어그램이 있습니다.

과정


나는 당신처럼 Ramanujan의 근사치를 사용합니다. 이것이 우리가해야 할 일입니까, 아니면 무한 시리즈의 수렴을 평가하기를 원하십니까?
Adám

1
@ Adám 필요한 정밀도를 얻기 위해 필요한 모든 것을 할 수 있습니다. 그 오류의 정도이므로 Ramanujan에 근사 많은 값 좋다 h**5잘 받고, 0.01값 광범위한.
Mego

입력 크기에 제한이없는 경우 최소 정확도는 어느 정도입니까?
feersum

답변:


2

05AB1E , 43 바이트

UVFXY-nXY+WZn/3*©T4®-t+/>Z*žq*5DX+UY+V})¬-ï

설명

UV                                           # X = a, Y = b
  F                                   }      # n times do
   XY-n                                      # (a-b)^2
       XY+W                                  # Z = (a + b)
             /                               # divide (a-b)^2
           Zn                                # by (a+b)^2
              3*                             # multiply by 3
                ©                            # C = 3h
                       /                     # 3h divided by 
                 T                           # 10
                      +                      # +
                  4®-t                       # sqrt(4-3h)
                        >                    # increment
                         Z*žq*               # times (a + b)*pi
                              5DX+UY+V       # increase a and b by 5
                                       )     # wrap in list of circumferences
                                        ¬-   # divide by inner circumference
                                          ï  # floor
                                             # implicitly display

온라인으로 사용해보십시오!


2

하스켈, 103 98 바이트

c!d|h<-3*d*d/c/c=pi*c*(1+h/(10+sqrt(4-h)))
f a b n|x<-a-b=[floor$(a+b+10*w)!x-(a+b)!x|w<-[1..n-1]]

1

파이썬 세, 168 164 바이트

각각 -2 바이트의 @ Adám 및 @Mego 덕분에

from math import*
h=lambda a,b:3*(a-b)**2/(a+b)**2;C=lambda a,b:pi*(a+b)*(1+h(a,b)/(10+sqrt(4-h(a,b))))
f=lambda a,b,n:[int(C(a+i*5,b+i*5)-C(a,b))for i in range(n)]

f인수를 통해 입력 0을 받고 가장 안쪽 레인을 포함하여 레인 오프셋 목록을 반환하는 함수 입니다 .

작동 원리

이것은 Ramanujan의 근사치를 사용합니다. 우리는 단순히 함수를 정의 h하고 C매개 변수와 둘레를 계산하기 위해, 모든 차선에 대해, 현재의 차선과 바닥의 길이에서 가장 안쪽 차선의 길이를 뺍니다.

Ideone에서 사용해보십시오


sqrt(4-3*h(a,b))같은 짧은 (4-3*h(a,b))**.5floor대체 될 수있다 int. 두 가지를 모두 수행하면 가져올 필요가 없습니다 math.
Mego

@ Mego 감사합니다. 내가 바보가 아닌 한, 처음 두 사람의 길이가 같지 않습니까? 그러나 import 문이 제거되면 pi를 정의하는 데 문제가 있습니다.
TheBikingViking

하여 포함함으로써 3*에서를 h, 당신은 2 바이트를 저장해야합니다.
Adám

나는 당신이 사용하는 것을 완전히 놓쳤다. pi당신은 그것을 충분히 정밀하게 하드 코딩 할 수 있습니다. 그리고 네, 처음 두 가지는 길이가 같습니다. 물론 수입하지 않고 의미했습니다! : P
Mego

@ Adám 지적 해 주셔서 감사합니다.
TheBikingViking

1

Dyalog APL , 45 바이트

프롬프트에 대한 N 다음 들면 B . 많은 시스템에서 기본값이 필요합니다 . ⎕IO←0

1↓(⊢-⊃)(○+×1+h÷10+.5*⍨4-h3×2*⍨-÷+)⌿⎕∘.+5×⍳⎕

⍳⎕n 에 대한 프롬프트를 표시 한 다음 {0, 1, 2, ..., n -1)

다섯 승산하여를 얻을 {0, 5, 10, ..., 5 N -5}

⎕∘.+묻기 및 B : 다음 부가 테이블을 , +5, +10 ... +5 N -5 B , B +5, B +10, ...을 b를 +5 N −5
  
  

(... )⌿괄호로 묶은 함수를 각 수직 쌍에 적용하십시오. 즉
  f ( a , b ), f ( a +5, b +5), f ( a +10, b +10), ..., f ( a + 5 N -5, B +5 N -5)
  여기서, f는 ( X , Y )이다 *

파이 타임

( x + y ) 회

1+ 하나 더하기

h ( x , y ) [함수 h 는 나중에 정의 될 것입니다.]

10+ 10 플러스

.5*⍨ 제곱근

4- 네 빼기

h← h ( x , y )는

세 번

2*⍨ 의 제곱

( xy )를 나눈 값

+ x + y

(⊢-⊃) 각 쌍에 적용된 함수의 결과에서 첫 번째 결과의 값을 뺍니다.

1↓ 첫 번째를 제거하십시오 (0)

반올림

TryAPL 온라인!


* 절차 언어로 :

-÷+xy 의 합과 차이의 분수를 구합니다

2*⍨ 분수의 제곱

이 제곱에 3을 곱하십시오

h←해당 제품을 h에 할당

4- 4에서 그 제품을 빼기

.5*⍨ 그 차이의 제곱근을 취하십시오

10+ 그 제곱근에 10을 더하다

h 를 그 합으로 나눕니다

1+ 그 분수에 1을 더하다

그 합에 xy 의 합을 곱하십시오

해당 제품에 파이를 곱하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.