คำนวณความเร็วสัมพัทธภาพ


10

ในทฤษฎีสัมพัทธภาพพิเศษความเร็วของวัตถุเคลื่อนที่ที่สัมพันธ์กับวัตถุอื่นที่เคลื่อนที่ในทิศทางตรงกันข้ามนั้นได้รับจากสูตร:

s=โวลต์+ยู1+โวลต์ยู/2.

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

ในสูตรนี้โวลต์และยูคือขนาดของความเร็วของวัตถุและคือความเร็วของแสง (ซึ่งประมาณ3.0×108ม./sใกล้พอสำหรับความท้าทายนี้ประมาณ)

ตัวอย่างเช่นถ้าวัตถุหนึ่งถูกย้ายที่v = 50,000 m/sและวัตถุอื่นกำลังจะย้ายไปที่u = 60,000 m/sความเร็วของวัตถุแต่ละเทียบกับคนอื่น ๆ s = 110,000 m/sจะอยู่ที่ประมาณ นี่คือสิ่งที่คุณคาดหวังภายใต้ทฤษฎีสัมพัทธภาพของกาลิลี (ซึ่งจะเพิ่มความเร็ว) อย่างไรก็ตามถ้าv = 50,000,000 m/sและu = 60,000,000 m/sความเร็วเชิงสัมพัทธ์จะอยู่ที่ประมาณ106,451,613 m/sซึ่งแตกต่างอย่างมีนัยสำคัญกว่าที่110,000,000 m/sคาดการณ์ไว้โดยทฤษฎีสัมพัทธภาพของกาลิเลโอ

ความท้าทาย

ได้รับสองจำนวนเต็มvและuเช่นที่คำนวณความเร็วของสารเติมแต่งความสัมพันธ์โดยใช้สูตรข้างต้นด้วย0 <= v,u < c c = 300000000ผลลัพธ์จะต้องเป็นค่าทศนิยมหรือเศษส่วนที่ลดลง เอาต์พุตต้องอยู่ภายใน0.001ค่าจริงสำหรับค่าทศนิยมหรือแน่นอนสำหรับเศษส่วน

กรณีทดสอบ

รูปแบบ: 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)

7
s/velocity/Velocity of an Unladen Swallow/g
mbomb007

1
"ทฤษฎีสัมพัทธภาพของกาลิเลโอ"? กลไกของ Gaillilean บางที แต่ฉันเรียกวลีของคุณว่า oxymoron (อาจเป็น retronym ที่ผิดสมัยเช่นกัน) เป็นคำถามที่ดี PPCG!
Toby Speight

คำตอบ:



11

Mathematica ขนาด 17 ไบต์

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

ฟังก์ชันที่ไม่มีชื่อซึ่งรับค่าจำนวนเต็มสองค่าและส่งคืนเศษส่วนที่แน่นอน

คำอธิบาย

ใช้สองเทคนิคที่ดีกับลำดับการโต้เถียง##ซึ่งช่วยให้ฉันหลีกเลี่ยงการอ้างอิงแต่ละอาร์กิวเมนต์uและvแยกกัน ##ขยายไปยังลำดับของอาร์กิวเมนต์ทั้งหมดซึ่งเป็นประเภทของ "รายการที่ไม่ได้เปิด" นี่คือตัวอย่างง่ายๆ:

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

จะช่วยให้

{x, u, v, y}

งานเดียวกันในฟังก์ชั่นตามอำเภอใจ (เนื่องจาก{...}เป็นเพียงการจดชวเลขList[...]):

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

จะช่วยให้

f[x, u, v, y]

ตอนนี้เราสามารถส่ง##ผู้ปฏิบัติงานซึ่งจะถือว่าพวกเขาเป็นตัวถูกดำเนินการครั้งแรกเท่าที่ผู้ประกอบการเกี่ยวข้อง จากนั้นตัวดำเนินการจะถูกขยายเป็นแบบเต็มf[...]และจากนั้นจะขยายลำดับเท่านั้น ในกรณีนี้+##คือPlus[##]อะไรPlus[u, v]นั่นคือตัวเศษที่เราต้องการ

ในส่วนบนมืออื่น ๆ ที่ปรากฏเป็นผู้ประกอบการทางด้านซ้ายมือของ## /เหตุผลนี้ทวีคูณuและvค่อนข้างบอบบาง /ถูกนำมาใช้ในแง่ของTimes:

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

ดังนั้นเมื่อaเป็น##จะได้รับการขยายตัวและหลังจากนั้นเราจะจบลงด้วย

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

นี่*^เป็นเพียงตัวดำเนินการของ Mathematica สำหรับสัญกรณ์ทางวิทยาศาสตร์


4

เยลลี่ขนาด 9 ไบต์

÷3ȷ8P‘÷@S

ลองออนไลน์! อีกวิธีหนึ่งถ้าคุณต้องการเศษส่วนคุณสามารถเรียกใช้รหัสเดียวกันด้วย MM

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

÷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.

3

Python3, 55 31 29 ไบต์

Python แย่มากสำหรับการรับอินพุตตามที่แต่ละอินพุตต้องการint(input()) แต่นี่คือโซลูชันของฉัน:

โวลต์, U = int (input ()), int (input ()); พิมพ์ ((V + U) / (1 + V * u / 9e16))

ขอบคุณ @Jakube ฉันไม่ต้องการ prgrame ทั้งหมดเพียงแค่ฟังก์ชั่น ดังนั้น:

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

ค่อนข้างอธิบายตนเองรับอินพุตคำนวณ ฉันใช้ c ^ 2 และทำให้เข้าใจง่ายว่าเนื่องจาก 9e16 นั้นสั้นกว่า (3e8 ** 2)

Python2, 42 ไบต์

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

ขอบคุณ @muddyfish


1
หากคุณใช้ python2 คุณสามารถวางint(input())และแทนที่ด้วยinput()คุณยังสามารถวางวงเล็บล้อมรอบคำสั่งการพิมพ์ได้
Blue

@Jakube คุณจะรับอินพุตอย่างไร? OP บอกว่า "รับจำนวนเต็มสองจำนวน v และ u"
george

@ Jakube ใช่ว่าจะเป็นวิธีที่ฉันจะใช้แลมบ์ดาในนั้น แต่ OP ขอให้โดยปริยายสำหรับโปรแกรมทั้งหมดไม่ใช่แค่ฟังก์ชั่น นั่นคือมันมีอินพุตและเอาต์พุต
george

@Jakube เป็นอย่างดีในกรณีนี้ฉันตีมันลงเล็กน้อย ไชโย!
george

คุณสามารถมีได้lambda u,v:(v+u)/(1+v*u/9e16)และสิ่งนี้ใช้ได้กับทั้ง Python 2 และ 3
mbomb007


2

Matlab ขนาด 24 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อที่รับสองอินพุต ไม่มีอะไรแฟนซีส่งเพียงเพื่อความสมบูรณ์


ฉันขอแนะนำให้คุณลบ "ปกติ" ออกจากชื่อ หากมีการใช้กล่องเครื่องมือจะต้องมีการกล่าวถึง เพื่อให้คุณสามารถพูดคำว่า "Matlab" ได้อย่างปลอดภัย โอ้และยินดีต้อนรับสู่ PPCG!
Luis Mendo

2

CJam, 16 ไบต์

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

ฉันยังมั่นใจว่ามีไบต์ที่จะบันทึกที่นี่


นี่คือสองไบต์เหล่านั้น:q~d]_:+\:*9e16/)/
Martin Ender

@MartinEnder ขอบคุณไม่รู้เกี่ยวกับdการทำงานแบบนั้น แต่ไม่อยากจะเชื่อเลยว่าฉันพลาดโอเปอร์เรเตอร์ที่เพิ่มขึ้น ....
ซิมมอนส์

น้อยกว่า 1 ไบต์ด้วยการป้อนข้อมูลอาร์เรย์:q~_:+\:*9.e16/)/
Luis Mendo

2

Dyalog APLขนาด 11 ไบต์

+÷1+9E16÷⍨×

เศษส่วนของผลรวมและ [การเพิ่มขึ้นของการหารเก้าสิบ quadrillion และผลิตภัณฑ์]:

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

÷⍨คือ "หาร" เช่นเดียวกับใน "เก้าสิบ quadrillion หารn " คือเทียบเท่ากับnหารด้วยเก้าสิบ quadrillion


แน่นอนว่ามี 11 ตัวอักษรไม่ใช่ไบต์เพราะฉันค่อนข้างแน่ใจว่าสัญลักษณ์บางอย่างนั้นไม่ได้อยู่ใน ASCII ใช่ไหม
จูลส์

@Jules ใน UTF-8 แน่นอน แต่ APL มีหน้ารหัสของตัวเองซึ่งลงวันที่ก่อนหน้า Unicode ภายในไม่กี่ทศวรรษ
Dennis

2

Haskell, 24 ไบต์

เป็นฟังก์ชั่นเดียวที่สามารถให้จำนวนทศนิยมหรือเศษส่วนขึ้นอยู่กับบริบทที่ใช้ ...

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

ตัวอย่างการใช้งานใน REPL:

*Main> r 20 30
49.999999999999666
*Main> default (Rational)
*Main> r 20 30 
7500000000000000 % 150000000000001

บันทึกไบต์ที่สองด้วยการกำหนดแทนu#v r u v
Zgarb


1

Pyth, 14 ไบต์

csQhc*FQ*9^T16

ชุดทดสอบ

สูตร: sum(input) / (1 + (product(input) / 9e16))

โบนัส: คลิกที่นี่!


5
มันไม่จำเป็นจริงๆที่จะรวม "FGITW" ในทุก ๆ โซลูชันที่เป็นปัญหาแรก
Mego

ขออภัยฉันลบมันแล้ว
Leun Nun



1

Noether , 24 ไบต์

ไม่ใช่การแข่งขัน

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

ลองที่นี่!

ดูเหมือนว่า Noether จะเป็นภาษาที่เหมาะสมสำหรับความท้าทายเนื่องจากEmmy Noetherเป็นผู้บุกเบิกแนวคิดเรื่องสมมาตรซึ่งนำไปสู่สมการของ Einstein (เช่นนี้E = mc^2เป็นต้น)

อย่างไรก็ตามนี่คือการแปลของสมการที่กำหนดไว้เพื่อย้อนกลับสัญลักษณ์การขัด



0

PowerShell ขนาด 34 ไบต์

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

การใช้งานที่ไม่ซับซ้อน ไม่มีความหวังที่จะจับขึ้นกับทุกคน แต่ขอบคุณที่ 6 $ที่จำเป็น




0

ForceLang, 116 ไบต์

ไม่ใช่การคอมไพล์ใช้ฟังก์ชันภาษาที่เพิ่มหลังจากการโพสต์ความท้าทาย

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


0

dc, 21 ไบต์

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

20kนี้อนุมานว่าแม่นยำได้รับการตั้งค่าเช่นกับ เพิ่ม 3 ไบต์หากคุณไม่สามารถทำการสันนิษฐานได้

รุ่นที่แม่นยำยิ่งขึ้นคือ

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

ที่ 24 ไบต์

ทั้งคู่เป็นสูตรที่เชื่อถือได้อย่างสมเหตุสมผลโดยมีเพียงนักกอล์ฟที่มีชื่อเสียงเท่านั้นที่ใช้งาน9I16^*


0

PHP, 44 45 ไบต์

ฟังก์ชั่นนิรนามตรงไปตรงมาสวย

function($v,$u){echo ($v+$u)/(1+$v*$u/9e16);}

3
คุณต้องการc^2ตัวส่วน ... เช่น9e16หรือเทียบเท่า
AdmBorkBork



0

Forth (gforth) , 39 ไบต์

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

ลองออนไลน์!

รหัสคำอธิบาย

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