交错开始


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

这些测试用例是使用以下Python 3脚本生成的,该脚本使用了Ramanujan设计的椭圆的近似周长:

#!/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的近似值。那是我们应该做的,还是您要我们评估无限级数的收敛?
2013年

1
@Adám您可以做任何事情以获取所需的精度。Ramanujan逼近适用于许多值,因为它的误差约为h**5,这在0.01很宽的范围内都很好。
Mego

当输入大小不受限制时,最低精度有什么好处?
feersum

Answers:


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

Haskell,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

Python 3中,168个 164字节

感谢@Adám和@Mego每个-2个字节

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最里面的车道。

怎么运行的

这使用拉马努詹的近似值。我们只需定义函数hC计算参数和周长,然后从所有车道的当前车道和地板的长度中减去最内侧车道的长度。

在Ideone上尝试


sqrt(4-3*h(a,b))的缩写为(4-3*h(a,b))**.5floor可以用代替int。两者都做,就意味着您不需要导入math
Mego

@Mego谢谢。除非我很笨,否则前两个长度不是一样吗?但是,如果删除了import语句,则存在定义pi的问题。
TheBikingViking

通过包含3*in h,您应该保存两个字节。
阿达姆,2013年

我完全错过了您使用的功能。pi您可能能够以足够的精度对其进行硬编码。是的,前两个长度相同-当然,我的意思是没有导入!:P
Mego

@Adám感谢您指出这一点。
TheBikingViking

1

Dyalog APL,45 字节

提示输入Ñ,那么对于一个 b。要求⎕IO←0在许多系统上是默认设置。

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

⍳⎕提示输入n,然后给出{0,1,2,...,n -1)

五乘法得到{0,5,10,...,5 ñ -5}

⎕∘.+提示b,然后再做一个附加表:
  一个 +5,一个 +10,... 一个 +5 ñ -5
  bb + 5,b + 10,... b +5 ñ −5

(... )⌿对每个垂直对应用括号函数,即
  fab),fa +5,b +5),fa +10,b +10),...,fa + 5 ñ -5,b 5 ñ -5)
  ,其中˚FXÿ)*是

圆周率

x + y)次

1+ 一加

hxy)[函数h将在以后定义]除以

10+ 十多

.5*⍨ 的平方根

4- 四减

h← hxy),即

三次

2*⍨ 的平方

x - y)除以

+ x + y

(⊢-⊃) 在应用于每个对的函数的结果上,减去第一个结果的值

1↓ 删除第一个(零)

四舍五入

在线尝试APL!


*以程序语言:

-÷+求出xy之间的差和之和

2*⍨ 平方那个分数

将该平方乘以三

h←将该产品分配给h

4- 从四减去该乘积

.5*⍨ 求出差异的平方根

10+ 将十加到该平方根

h除以该总和

1+ 在那部分加一

将该总和乘以xy的总和

该乘积乘以pi

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.