Dalam balapan di mana pembalap berkeliling setidaknya satu putaran lintasan melengkung, posisi awal untuk setiap pembalap terhuyung, sehingga setiap pembalap menempuh jarak yang sama di lintasan (jika tidak, pembalap di jalur terdalam akan memiliki keuntungan besar. ).
Mengingat panjang sumbu utama dan minor (atau semi-mayor dan semi-minor, jika Anda mau) dari lintasan elips dan jumlah lajur di lintasan, output jarak dari titik awal lajur terdalam jalur yang setiap lajur harus terhuyung.
Spesifikasi
- Setiap jalur adalah elips dengan sumbu semi mayor 5 unit lebih panjang dari jalur terpendek berikutnya. Untuk kesederhanaan, asumsikan bahwa jalur memiliki lebar 0.
- Jalur terdalam selalu dimulai pada 0, dan setiap titik awal lainnya adalah bilangan bulat positif lebih besar dari atau sama dengan titik awal sebelumnya.
- Input dan output mungkin dalam format yang mudah dan masuk akal.
- Masukan akan selalu berupa bilangan bulat.
- Anda harus menghitung keliling lintasan ke dalam 0,01 unit dari nilai aktual.
- Keluaran harus dibulatkan ke bilangan bulat terdekat (lantai).
- Garis finish adalah titik awal untuk pembalap terdalam. Hanya ada satu putaran dalam lomba.
- Panjang sumbu diukur menggunakan jalur terdalam trek.
- Mengeluarkan 0 untuk offset jalur paling dalam adalah opsional.
Uji Kasus
Format: 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
Kasus uji ini dibuat dengan skrip Python 3 berikut, yang menggunakan perkiraan keliling elips yang dirancang oleh 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:]])))
Perkiraan yang digunakan adalah:
Akhirnya, berikut adalah diagram yang membantu untuk memahami perhitungan offset:
h**5
, yang jauh di bawah0.01
untuk berbagai nilai.Jawaban:
05AB1E , 43 byte
Penjelasan
Cobalah online!
sumber
Haskell,
10398 bytesumber
Python 3,
168164 byteTerima kasih kepada @ Adám dan @Mego untuk masing-masing -2 byte
Sebuah fungsi
f
yang mengambil input melalui argumen dan mengembalikan daftar offset lajur, termasuk0
untuk lajur terdalam.Bagaimana itu bekerja
Ini menggunakan perkiraan Ramanujan. Kami cukup mendefinisikan fungsi
h
danC
untuk menghitung parameter dan keliling, kemudian kurangi panjang jalur paling dalam dari panjang jalur dan lantai saat ini, untuk semua jalur.Cobalah di Ideone
sumber
sqrt(4-3*h(a,b))
lebih pendek(4-3*h(a,b))**.5
, danfloor
dapat diganti denganint
. Melakukan keduanya berarti Anda tidak perlu mengimpormath
.3*
inh
, Anda harus menyimpan dua byte.pi
Anda mungkin dapat melakukan hardcode dengan cukup presisi. Dan ya, dua yang pertama memiliki panjang yang sama - maksud saya tanpa impor, tentu saja! : PDyalog APL , 45 byte
Anjuran untuk n , maka untuk sebuah b . Membutuhkan
⎕IO←0
yang default pada banyak sistem.⍳⎕
meminta n , lalu berikan {0, 1, 2, ..., n −1)5×
kalikan dengan lima untuk mendapatkan {0, 5, 10, ..., 5 n -5}⎕∘.+
cepat untuk sebuah dan b , kemudian membuat tabel Selain itu:a , a 5, sebuah 10, ... sebuah 5 n -5
b , b 5, b 10, ... b 5 n −5
(
...)⌿
menerapkan fungsi kurung untuk setiap pasangan vertikal, yaituf ( a , b ), f ( a +5, b +5), f ( a +10, b +10), ..., f ( a + 5 n -5, b 5 n -5)
di mana f ( x , y ) adalah *
(⊢-⊃)
pada hasil fungsi yang diterapkan untuk masing-masing pasangan, kurangi nilai hasil pertama1↓
hapus yang pertama (nol)⌊
bulat ke bawahTryAPL online!
* Dalam bahasa prosedural:
-÷+
temukan fraksi perbedaan antara dan jumlah x dan y2*⍨
kuadrat fraksi itu3×
kalikan kuadrat itu dengan tigah←
tetapkan produk itu ke h4-
kurangi produk itu dari empat.5*⍨
ambil akar kuadrat dari perbedaan itu10+
tambahkan sepuluh ke akar kuadrat ituh÷
bagi h dengan jumlah itu1+
tambahkan satu ke fraksi itu+×
kalikan jumlah itu dengan jumlah x dan y○
kalikan produk itu dengan pisumber