Mengingat posisi 2-dimensi dan kecepatan sepasang bola biliar tepat sebelum benturan, hitung kecepatannya setelah tumbukan elastis sempurna . Bola diasumsikan sebagai bola ideal (atau setara: lingkaran) dengan jari-jari yang sama, massa yang sama, kerapatan seragam, dan tidak ada gesekan.
Input terdiri dari 8 angka: di p0x,p0y,v0x,v0y,p1x,p1y,v1x,v1y
mana p0x,p0y
adalah pusat bola pertama, v0x,v0y
kecepatannya, dan sama p1x,p1y,v1x,v1y
untuk bola kedua. Anda dapat menerima input dalam urutan apa pun dan terstruktur dengan cara apa pun yang mudah, misalnya sebagai array 2x2x2, atau mungkin array 2x2 untuk p
dan dua array panjang-2 untuk v0
dan v1
. Tidak masalah untuk mengambil bilangan kompleks (jika bahasa Anda mendukungnya) alih-alih pasangan xy. Namun, Anda tidak boleh mengambil input dalam sistem koordinat selain dari Cartesian, yaitu kutub tidak diperbolehkan.
Perhatikan bahwa jari-jari bola biliar adalah setengah jarak antara p0x,p0y
dan p1x,p1y
, jadi itu tidak diberikan sebagai bagian eksplisit dari input.
Tulis sebuah program atau fungsi yang menghasilkan atau mengembalikan 4 angka dalam representasi Cartesian yang nyaman: nilai-nilai pasca-tabrakan v0x,v0y,v1x,v1y
.
Algoritma yang mungkin adalah:
temukan garis normal yang melewati kedua pusat
temukan garis singgung yang melewati titik tengah antara dua pusat dan tegak lurus terhadap garis normal
berubah sistem koordinat dan memecah
v0x,v0y
danv1x,v1y
menjadi komponen-komponen tangensial dan normal merekav0t,v0n
danv1t,v1n
menukar komponen normal
v0
danv1
, mempertahankan komponen tangensial merekaubah kembali ke sistem koordinat asli
Tes (hasil dibulatkan ke 5 tempat desimal):
p0x p0y v0x v0y p1x p1y v1x v1y -> v0x' v0y' v1x' v1y'
[-34.5,-81.8, 34.7,-76.1, 96.2,-25.2, 59.2,-93.3] [ 49.05873, -69.88191, 44.84127, -99.51809]
[ 36.9, 77.7,-13.6,-80.8, -7.4, 34.4, 15.1,-71.8] [ 5.57641, -62.05647, -4.07641, -90.54353]
[-51.0, 17.6, 46.1,-80.1, 68.6, 54.0,-35.1,-73.9] [ -26.48927,-102.19239, 37.48927, -51.80761]
[-21.1,-52.6,-77.7, 91.5, 46.0, 94.1, 83.8, 93.7] [ -48.92598, 154.40834, 55.02598, 30.79166]
[ 91.3, -5.3, 72.6, 89.0, 97.8, 50.5, 36.2, 85.7] [ 71.73343, 81.56080, 37.06657, 93.13920]
[-79.9, 54.9, 92.5,-40.7,-20.8,-46.9,-16.4, -0.9] [ 47.76727, 36.35232, 28.33273, -77.95232]
[ 29.1, 80.7, 76.9,-85.1,-29.3,-49.5,-29.0,-13.0] [ 86.08581, -64.62067, -38.18581, -33.47933]
[ 97.7,-89.0, 72.5, 12.4, 77.8,-88.2, 31.5,-34.0] [ 33.42847, 13.97071, 70.57153, -35.57071]
[-22.2, 22.6,-61.3, 87.1, 67.0, 57.6,-15.3,-23.1] [ -58.90816, 88.03850, -17.69184, -24.03850]
[-95.4, 15.0, 5.3, 39.5,-54.7,-28.5, -0.7, 0.8] [ 21.80656, 21.85786, -17.20656, 18.44214]
[ 84.0,-26.8,-98.6,-85.6,-90.1, 30.9,-48.1, 37.2] [ -89.76828, -88.52700, -56.93172, 40.12700]
[ 57.8, 90.4, 53.2,-74.1, 76.4,-94.4,-68.1,-69.3] [ 51.50525, -57.26181, -66.40525, -86.13819]
[ 92.9, 69.8,-31.3, 72.6,-49.1,-78.8,-62.3,-81.6] [-123.11680, -23.48435, 29.51680, 14.48435]
[-10.3,-84.5,-93.5,-95.6, 35.0, 22.6, 44.8, 75.5] [ -11.12485, 99.15449, -37.57515,-119.25449]
[ -3.9, 55.8,-83.3, 9.1, -2.7,-95.6, 37.7,-47.8] [ -82.84144, -48.75541, 37.24144, 10.05541]
[-76.5,-88.4,-76.7,-49.9, 84.5, 38.0, 4.2, 18.4] [ 6.52461, 15.43907, -79.02461, -46.93907]
[ 64.2,-19.3, 67.2, 45.4,-27.1,-28.7, 64.7, -4.3] [ 59.66292, 44.62400, 72.23708, -3.52400]
[ 9.8, 70.7,-66.2, 63.0,-58.7, 59.5, 83.7,-10.6] [ 68.07646, 84.95469, -50.57646, -32.55469]
[ 62.9, 46.4, 85.0, 87.4, 36.3,-29.0,-63.0,-56.3] [ 23.53487, -86.82822, -1.53487, 117.92822]
[ -5.5, 35.6, 17.6,-54.3, -2.2, 66.8,-15.2, 11.8] [ 24.15112, 7.63786, -21.75112, -50.13786]
Kemenangan terpendek. Tidak ada celah.
terima kasih @Anush untuk membantu memperbaiki warna latar belakang diagram
r=p-q
denganp-=q
dan menggunakan lebih lanjutp
alih-alihr
, seperti dalam jawaban js NeilJavaScript (Node.js) ,
9088 byteCobalah online! Tautan termasuk test suite. Penjelasan:
q,r
digunakan kembali sebagai vektor perbedaan antara pusat, danu
merupakan kuadrat dari panjangnya.v
adalah perbedaan dalam produk titik dario,p
dans,t
denganq,r
, demikianv/u
juga faktor penskalaan untukq,r
yang memberikan jumlah kecepatan yang ditransfer dario,p
kes,t
. Sunting: Disimpan 2 byte berkat @Arnauld.sumber
Perl 6 ,
75646361 byte11 byte disimpan dengan beralih dari
map
kefor
, menghilangkan kebutuhan untuk memasukkan hal-hal ke dalam variabel perantara untukmap
dilihat.1 byte disimpan dengan mengubah
($^a-$^c)².&{$_/abs}
ke($^a-$^c).&{$_/.conj}
.2 byte disimpan berkat @nwellnhof.
Cobalah online!
Penjelasan
Ketika posting asli mengatakan bahwa input bisa berupa bilangan kompleks, terlalu sulit untuk menolak ... Jadi ini membutuhkan 4 bilangan kompleks (posisi 1, kecepatan 1, posisi 2, kecepatan 2) dan mengembalikan kecepatan sebagai bilangan kompleks.
And that's it. All the program does is just this calculation, golfed a bit.
sumber
($^a-$^c)
(and only inside a lambda that normalizes this number), the second acts on($b-$d)
. So they can't really be reconciled. I could make a function that would just call.conj
, but that would only add bytes (because I heavily use the$_
variable, which has the nice property that you can call methods on it without specifying it:.conj
instead of$_.conj
).Jelly, 16 bytes
Try it online!
A dyadic link taking as its left argument a list of the initial positions
[[p0x, p0y], [p1x, p1y]]
and its right argument the initial velocities[[v0x, v0y], [v1x, v2y]]
. Returns a list of the final velocities[[v0x', v0y'], [v1x', v2y']]
Based on the algorithm used by @Neil’s JavaScript answer so be sure to upvote that one too!
sumber
C (gcc),
140132 bytesTry it online!
Basically a port of @Neil's JavaScript answer, but then @ceilingcat shaved off 8 bytes by cleverly reusing
m
andn
to store temporaries.sumber
Python 2,
9792 bytesTry it online!
Modified version of Neil's approach.
sumber
C (gcc),
7772 bytesTry it online!
Based on the python implementation of @Joel
sumber
APL (Dyalog Classic), 21 bytes
Try it online!
based on @Joel's answer
in: 2x2 complex matrix, out: complex pair
sumber