เริ่มเซ


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 เหมือนที่คุณทำ นั่นคือสิ่งที่เราควรจะทำหรือคุณต้องการให้เราประเมินการบรรจบกันของอนุกรมที่ไม่มีที่สิ้นสุด?
อดัม

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

ลองออนไลน์!



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เลนในสุด

มันทำงานอย่างไร

สิ่งนี้ใช้ประมาณ Ramanujan เราเพียงกำหนดฟังก์ชั่นhและCสำหรับการคำนวณพารามิเตอร์และเส้นรอบวงจากนั้นลบความยาวของเลนในสุดจากความยาวของเลนและพื้นปัจจุบันสำหรับเลนทั้งหมด

ลองใช้กับ Ideone


sqrt(4-3*h(a,b))สั้นเป็น(4-3*h(a,b))**.5และจะถูกแทนที่ด้วยfloor ทำทั้งสองวิธีที่คุณไม่จำเป็นต้องนำเข้าint math
Mego

@Mego ขอบคุณ เว้นเสียแต่ว่าฉันจะงี่เง่าสองคนแรกนั้นมีความยาวเท่ากันหรือไม่? อย่างไรก็ตามหากคำสั่งนำเข้าถูกลบออกจะมีปัญหาในการกำหนด pi
TheBikingViking

โดยการรวม3*ในhคุณควรบันทึกสองไบต์
อดัม

ฉันพลาดไปเลยว่าคุณใช้piคุณอาจจะสามารถฮาร์ดโค้ดด้วยความแม่นยำเพียงพอ และใช่สองคนแรกมีความยาวเท่ากัน - ฉันหมายถึงโดยไม่ต้องนำเข้าแน่นอน! : P
Mego

@ Adámขอบคุณที่ชี้ให้เห็น
TheBikingViking

1

Dyalog APL ขนาด 45 ไบต์

แจ้งสำหรับnแล้วสำหรับข ต้องการซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ ⎕IO←0

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

⍳⎕พรอมต์สำหรับnจากนั้นให้ {0, 1, 2, ... , n −1)

คูณด้วยห้าที่จะได้รับ {0, 5, 10, ... , 5 n -5}

⎕∘.+ความพร้อมในการและแล้วให้ตารางนอกจากนี้: , 5, 10 ... 5 n -5 , 5, 10, ... 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+ สิบบวก

.5*⍨ สแควร์รูทของ

4- สี่ลบ

h← h ( x , y ) ซึ่งก็คือ

สามครั้ง

2*⍨ ตารางของ

( x - y ) หารด้วย

+ x + y

(⊢-⊃) บนผลลัพธ์ของฟังก์ชันที่ใช้กับแต่ละคู่ให้ลบค่าของผลลัพธ์แรก

1↓ ลบครั้งแรก (ศูนย์)

ปัดเศษลง

ลองใช้ออนไลน์!


* ในภาษาขั้นตอน:

-÷+หาเศษส่วนของความแตกต่างระหว่างและผลรวมของxและy

2*⍨ กำลังสองเศษส่วนนั้น

คูณสี่เหลี่ยมนั้นด้วยสาม

h←กำหนดผลิตภัณฑ์นั้นให้กับเอช

4- ลบผลิตภัณฑ์นั้นจากสี่

.5*⍨ นำสแควร์รูทของความแตกต่างนั้น

10+ เพิ่มสิบเข้าไปในรากที่สอง

หารhด้วยผลรวมนั้น

1+ เพิ่มหนึ่งส่วนเข้าไปในส่วนนั้น

คูณผลรวมนั้นกับผลรวมของxและy

คูณผลิตภัณฑ์ด้วย pi

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.