Hitung kecepatan relativistik

10

Dalam relativitas khusus , kecepatan objek bergerak relatif terhadap objek lain yang bergerak berlawanan arah diberikan oleh rumus:

s=v+u1+vu/c2.

s = ( v + u ) / ( 1 + v * u / c ^ 2)

Dalam rumus ini, dan adalah besarnya kecepatan benda, dan adalah kecepatan cahaya (yaitu sekitar , perkiraan yang cukup dekat untuk ini tantangan).vkamuc3.0×108m/s

Misalnya, jika satu objek bergerak pada v = 50,000 m/s, dan objek lain bergerak pada u = 60,000 m/s, kecepatan masing-masing objek relatif terhadap yang lain akan sekitar s = 110,000 m/s. Inilah yang Anda harapkan di bawah relativitas Galilea (di mana kecepatan ditambahkan begitu saja). Namun, jika v = 50,000,000 m/sdan u = 60,000,000 m/s, kecepatan relatifnya akan mendekati 106,451,613 m/s, yang secara signifikan berbeda dari yang 110,000,000 m/sdiprediksi oleh relativitas Galilea.

Tantangan

Diberikan dua bilangan bulat vdan usedemikian rupa 0 <= v,u < c, hitung kecepatan aditif relativistik, dengan menggunakan rumus di atas, dengan c = 300000000. Output harus berupa nilai desimal atau fraksi tereduksi. Output harus dalam 0.001nilai aktual untuk nilai desimal, atau tepat untuk sebagian kecil.

Uji Kasus

Format: v, u -> exact fraction (float approximation)

50000, 60000 -> 3300000000000/30000001 (109999.99633333346)
50000000, 60000000 -> 3300000000/31 (106451612.90322581)
20, 30 -> 7500000000000000/150000000000001 (49.999999999999666)
0, 20051 -> 20051 (20051.0)
299999999, 299999999 -> 53999999820000000000000000/179999999400000001 (300000000.0)
20000, 2000000 -> 4545000000000/2250001 (2019999.1022226212)
2000000, 2000000 -> 90000000000/22501 (3999822.2301231055)
1, 500000 -> 90000180000000000/180000000001 (500000.9999972222)
1, 50000000 -> 90000001800000000/1800000001 (50000000.972222224)
200000000, 100000000 -> 2700000000/11 (245454545.45454547)
Mego
sumber
7
s/velocity/Velocity of an Unladen Swallow/g
mbomb007
1
"Relativitas Gallilean"? Mekanika Gaillilean, mungkin, tapi saya akan menyebut frasa Anda sebagai oxymoron (mungkin juga retronim anakronistis). Pertanyaan PPCG yang bagus!
Toby Speight

Jawaban:

6

MATL , 9 byte

sG3e8/pQ/

Cobalah online!

s      % Take array [u, v] implicitly. Compute its sum: u+v
G      % Push [u, v] again
3e8    % Push 3e8
/      % Divide. Gives [u/c, v/c]
p      % Product of array. Gives u*v/c^2
Q      % Add 1
/      % Divide. Display implicitly
Luis Mendo
sumber
11

Mathematica, 17 byte

+##/(1+##/9*^16)&

Fungsi tanpa nama mengambil dua bilangan bulat dan mengembalikan pecahan yang tepat.

Penjelasan

Ini menggunakan dua trik yang bagus dengan urutan argumen## , yang memungkinkan saya untuk menghindari referensi argumen individu udan vsecara terpisah. ##meluas ke urutan semua argumen, yang merupakan semacam "daftar tidak terbuka". Ini adalah contoh sederhana:

{x, ##, y}&[u, v]

memberi

{x, u, v, y}

Pekerjaan yang sama di dalam fungsi arbitrer (karena {...}hanya singkatan untuk List[...]):

f[x, ##, y]&[u, v]

memberi

f[x, u, v, y]

Sekarang kita juga dapat menyerahkan ##kepada operator yang pertama-tama akan memperlakukan mereka sebagai operan tunggal sejauh menyangkut operator. Kemudian operator akan diperluas ke bentuk penuh f[...], dan hanya dengan demikian barulah urutannya diperluas. Dalam hal ini +##adalah Plus[##]yang mana Plus[u, v], yaitu pembilang yang kita inginkan.

Di penyebut di sisi lain, ##muncul sebagai operator kiri /. Alasannya berlipat ganda udan vagak halus. /diimplementasikan dalam hal Times:

FullForm[a/b]
(* Times[a, Power[b, -1]] *)

Jadi ketika aadalah ##, hal itu akan diperluas setelah itu dan kami berakhir dengan

Times[u, v, Power[9*^16, -1]]

Di sini, *^hanya operator Mathematica untuk notasi ilmiah.

Martin Ender
sumber
4

Jelly, 9 byte

÷3ȷ8P‘÷@S

Cobalah online! Atau, jika Anda lebih suka pecahan, Anda dapat mengeksekusi kode yang sama dengan M .

Bagaimana itu bekerja

÷3ȷ8P‘÷@S  Main link. Argument: [u, v]

÷3ȷ8       Divide u and v by 3e8.
    P      Take the product of the quotients, yielding uv ÷ 9e16.
     ‘     Increment, yielding 1 + uv ÷ 9e16.
        S  Sum; yield u + v.
      ÷@   Divide the result to the right by the result to the left.
Dennis
sumber
3

Python3, 55 31 29 byte

Python mengerikan untuk mendapatkan input karena setiap input membutuhkan int(input()) tetapi inilah solusi saya:

v, u = int (input ()), int (input ()); print ((v + u) / (1 + v * u / 9e16))

Berkat @ Jakube saya tidak benar-benar membutuhkan seluruh prgrame, hanya fungsinya. Karenanya:

lambda u,v:(v+u)/(1+v*u/9e16)

Cukup jelas sendiri, dapatkan input, hitung. Saya telah menggunakan c ^ 2 dan menyederhanakannya karena 9e16 lebih pendek dari (3e8 ** 2).

Python2, 42 byte

v,u=input(),input();print(v+u)/(1+v*u/9e16)

Berkat @muddyfish

George
sumber
1
Jika Anda menggunakan python2, Anda dapat menjatuhkan int(input())dan menggantinya dengan input(), Anda juga dapat menjatuhkan tanda kurung di sekeliling pernyataan cetak
Biru
@ Jakube Bagaimana cara Anda mendapatkan input? OP mengatakan "Diberi dua bilangan bulat v dan u"
george
@ Yakub Ya itu akan bagaimana saya akan menggunakan lambda di dalamnya, tetapi OP secara implisit meminta seluruh program bukan hanya fungsi. yaitu memiliki input dan output
george
@ Yakub juga dalam hal ini saya golf sedikit. Bersulang!
george
Anda dapat memilikinya lambda u,v:(v+u)/(1+v*u/9e16), dan ini berfungsi untuk Python 2 dan 3.
mbomb007
2

J, 13 11 byte

+%1+9e16%~*

Pemakaian

>> f =: +%1+9e16%~*
>> 5e7 f 6e7
<< 1.06452e8

Di mana >>STDIN dan <<STDOUT.

Biarawati Bocor
sumber
2

Matlab, 24 byte

@(u,v)(u+v)/(1+v*u/9e16)

Fungsi anonim yang mengambil dua input. Tidak ada yang mewah, hanya dikirimkan untuk kelengkapan.

sintaks
sumber
Saya sarankan Anda menghapus "reguler" dari judul. Jika kotak peralatan digunakan, itu harus disebutkan; sehingga Anda dapat dengan aman mengatakan "Matlab". Oh dan selamat datang di PPCG!
Luis Mendo
2

CJam, 16 Bytes

q~_:+\:*9.e16/)/

Saya masih yakin ada byte yang harus disimpan di sini

A Simmons
sumber
Inilah dua dari byte itu:q~d]_:+\:*9e16/)/
Martin Ender
@ MartinEnder Terima kasih, tidak tahu tentang dbekerja seperti itu tetapi tidak percaya saya melewatkan operator kenaikan ....
A Simmons
1 byte lebih sedikit dengan input larik:q~_:+\:*9.e16/)/
Luis Mendo
2

Dyalog APL , 11 byte

+÷1+9E16÷⍨×

Fraksi penjumlahan dan [pertambahan pembagian sembilan puluh kuadriliun dan produk]:

┌─┼───┐         
+ ÷ ┌─┼──────┐  
    1 + ┌────┼──┐
        9E16 ÷⍨ ×

÷⍨adalah "membagi", seperti dalam "sembilan puluh kuadriliun membagi n " yaitu setara dengan n dibagi dengan sembilan puluh kuadriliun.

Adm
sumber
Tentunya itu 11 karakter, bukan byte, karena saya cukup yakin beberapa simbol itu tidak ada di ASCII?
Jules
@ Jules Di UTF-8, tentu saja, tetapi APL memiliki halaman kode sendiri, yang mendahului Unicode oleh beberapa dekade.
Dennis
2

Haskell, 24 byte

Sebagai fungsi tunggal yang dapat memberikan titik apung atau angka fraksional, tergantung pada konteks di mana itu digunakan ...

r u v=(u+v)/(1+v*u/9e16)

Contoh penggunaan dalam REPL:

*Main> r 20 30
49.999999999999666
*Main> default (Rational)
*Main> r 20 30 
7500000000000000 % 150000000000001
Jules
sumber
Simpan dua byte dengan mendefinisikan u#valih-alih r u v.
Zgarb
1

Pyke, 12 byte

sQB9T16^*/h/

Coba di sini!

Biru
sumber
1

Pyth, 14 byte

csQhc*FQ*9^T16

Suite uji.

Rumus: sum(input) / (1 + (product(input) / 9e16))

Bonus: klik di sini!

Biarawati Bocor
sumber
5
Benar-benar tidak perlu memasukkan "FGITW" pada setiap solusi yang merupakan tantangan pertama.
Mego
Maaf, saya sudah menghapusnya.
Leaky Nun
1

Javascript 24 byte

Dicukur 4 byte berkat @LeakyNun

v=>u=>(v+u)/(1+v*u/9e16)

Cukup mudah

Bálint
sumber
Apakah v=>u=>(v+u)/(1+v*u/9e16)baik-baik saja?
Leaky Nun
@ LeakyNun ya menurut meta posting ini
Patrick Roberts
1

Noether , 24 byte

Non-bersaing

I~vI~u+1vu*10 8^3*2^/+/P

Coba di sini!

Noether tampaknya menjadi bahasa yang tepat untuk tantangan mengingat Emmy Noether memelopori ide-ide simetri yang mengarah pada persamaan Einstein (ini, E = mc^2dll.)

Bagaimanapun, ini pada dasarnya adalah terjemahan dari persamaan yang diberikan untuk membalikkan notasi polish.

Peluruhan Beta
sumber
1

TI-BASIC, 12 byte

:sum(Ans/(1+prod(Ans/3ᴇ8

Mengambil input sebagai daftar {U,V}aktif Ans.

Scott Milner
sumber
0

PowerShell, 34 byte

param($u,$v)($u+$v)/(1+$v*$u/9e16)

Implementasi yang sangat mudah. Tidak ada harapan untuk mengejar ketinggalan dengan siapa pun, berkat 6 yang $diperlukan.

AdmBorkBork
sumber
0

Oracle SQL 11.2, 39 byte

SELECT (:v+:u)/(1+:v*:u/9e16)FROM DUAL;
Jeto
sumber
0

T-SQL, 38 byte

DECLARE @U REAL=2000000, @ REAL=2000000;
PRINT FORMAT((@U+@)/(1+@*@U/9E16),'g')

Cobalah online!

Implementasi formula langsung.

Ross Presser
sumber
0

ForceLang, 116 byte

Noncompeting, menggunakan fungsionalitas bahasa yang ditambahkan setelah tantangan diposting.

def r io.readnum()
set s set
s u r
s v r
s w u+v
s c 3e8
s u u.mult v.mult c.pow -2
s u 1+u
io.write w.mult u.pow -1
SuperJedi224
sumber
0

TI-Basic, 21 byte

Prompt U,V:(U+V)/(1+UV/9ᴇ16
Timtech
sumber
Bukankah Ebernilai 2 byte?
Leaky Nun
3
Silakan periksa sendiri terlebih dahulu ... tibasicdev.wikidot.com/e-ten
Timtech
0

dc, 21 byte

svddlv+rlv*9/I16^/1+/

Ini mengasumsikan bahwa ketepatan sudah diatur, misalnya dengan 20k. Tambahkan 3 byte jika Anda tidak dapat membuat asumsi itu.

Versi yang lebih akurat adalah

svdlv+9I16^*dsc*rlv*lc+/

pada 24 byte.

Keduanya transkripsi formula yang cukup beriman, dengan satu-satunya golf terkenal adalah penggunaan 9I16^*untuk c².

Toby Speight
sumber
0

PHP, 44 45 byte

Fungsi anonim, cukup mudah.

function($v,$u){echo ($v+$u)/(1+$v*$u/9e16);}
Xanderhall
sumber
3
Anda perlu c^2dalam penyebut ... yaitu, 9e16atau setara.
AdmBorkBork
0

Sebenarnya, 12 byte

;8╤3*ì*πu@Σ/

Cobalah online!

Penjelasan:

;8╤3*ì*πu@Σ/
;             dupe input
 8╤3*ì*       multiply each element by 1/(3e8)
       πu     product, increment
         @Σ/  sum input, divide sum by product
Mego
sumber
0

Keempat (gforth) , 39 byte

: f 2dup + s>f * s>f 9e16 f/ 1e f+ f/ ;

Cobalah online!

Penjelasan Kode

: f            \ start a new work definition
  2dup +       \ get the sum of u and v
  s>f          \ move to top of floating point stack
  * s>f        \ get the product of u and v and move to top of floating point stack
  9e16 f/      \ divide product by 9e16 (c^2)
  1e f+        \ add 1
  f/           \ divide the sum of u and v by the result
;              \ end word definition
reffu
sumber