En la relatividad especial , la velocidad de un objeto en movimiento en relación con otro objeto que se mueve en la dirección opuesta viene dada por la fórmula:
s = ( v + u ) / ( 1 + v * u / c ^ 2)
En esta fórmula, y son las magnitudes de las velocidades de los objetos, y es la velocidad de la luz (que es aproximadamente , una aproximación lo suficientemente cercana para esto desafío).
Por ejemplo, si un objeto se movía a v = 50,000 m/s
, y otro objeto se movía a u = 60,000 m/s
, la velocidad de cada objeto en relación con el otro sería aproximadamente s = 110,000 m/s
. Esto es lo que cabría esperar con la relatividad galileana (donde las velocidades simplemente se suman). Sin embargo, si v = 50,000,000 m/s
y u = 60,000,000 m/s
, la velocidad relativa sería aproximadamente 106,451,613 m/s
, que es significativamente diferente a la 110,000,000 m/s
predicha por la relatividad galileana.
El reto
Dado dos enteros v
y u
tal que 0 <= v,u < c
, calcule la velocidad aditiva relativista, usando la fórmula anterior, con c = 300000000
. La salida debe ser un valor decimal o una fracción reducida. La salida debe estar dentro 0.001
del valor real para un valor decimal, o exacto para una fracción.
Casos de prueba
Formato: 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)
fuente
s/velocity/Velocity of an Unladen Swallow/g
Respuestas:
MATL , 9 bytes
Pruébalo en línea!
fuente
Mathematica, 17 bytes
Una función sin nombre que toma dos enteros y devuelve una fracción exacta.
Explicación
Esto usa dos buenos trucos con la secuencia de argumentos
##
, lo que me permite evitar hacer referencia a los argumentos individualesu
y porv
separado.##
se expande a una secuencia de todos los argumentos, que es una especie de "lista sin envolver". Aquí hay un ejemplo simple:da
Lo mismo funciona dentro de funciones arbitrarias (ya que
{...}
es solo una abreviatura deList[...]
):da
Ahora también podemos pasar
##
a operadores que primero los tratarán como un solo operando en lo que respecta al operador. Luego, el operador se expandirá a su forma completaf[...]
, y solo entonces se expandirá la secuencia. En este caso+##
esPlus[##]
cuál esPlus[u, v]
, es decir, el numerador que queremos.En el denominador, por otro lado,
##
aparece como el operador izquierdo de/
. La razón de esto se multiplicau
yv
es bastante sutil./
se implementa en términos deTimes
:Entonces, cuando
a
es así##
, se expande después y terminamos conAquí,
*^
es solo el operador de Mathematica para la notación científica.fuente
Jalea, 9 bytes
Pruébalo en línea! Alternativamente, si se prefiere fracciones, se puede ejecutar el mismo código con M .
Cómo funciona
fuente
Python3,
55 3129 bytesPython es horrible para obtener entradas, ya que cada entrada necesita,
int(input())
pero aquí está mi solución de todos modos:v, u = int (input ()), int (input ()); print ((v + u) / (1 + v * u / 9e16))Gracias a @Jakube, en realidad no necesito todo el programa, solo la función. Por lo tanto:
Más bien se explica por sí mismo,
obtiene entradas,computa. He usado c ^ 2 y simplifiqué que como 9e16 es más corto que (3e8 ** 2).Python2, 42 bytes
Gracias a @muddyfish
fuente
int(input())
y reemplazarlo coninput()
, también puede colocar los corchetes alrededor de la declaración de impresiónlambda u,v:(v+u)/(1+v*u/9e16)
, y esto funciona para Python 2 y 3.J,
1311 bytesUso
Donde
>>
está STDIN y<<
es STDOUT.fuente
Matlab, 24 bytes
Función anónima que toma dos entradas. Nada lujoso, solo presentado para completar.
fuente
CJam, 16 bytes
Todavía estoy seguro de que hay bytes para guardar aquí
fuente
q~d]_:+\:*9e16/)/
d
trabajar así, pero no puedo creer que me perdí el operador de incremento ...q~_:+\:*9.e16/)/
Dyalog APL , 11 bytes
La fracción de la suma y [el incremento de las divisiones de noventa cuatrillones y el producto]:
÷⍨
es "divide", como en "noventa cuatrillones divide n ", es decir, equivalente a n dividido entre noventa cuadrillones.fuente
Haskell, 24 bytes
Como una sola función que puede proporcionar un punto flotante o un número fraccionario, dependiendo del contexto en el que se use ...
Ejemplo de uso en REPL:
fuente
u#v
lugar der u v
.Pyke, 12 bytes
Pruébalo aquí!
fuente
Pyth, 14 bytes
Banco de pruebas.
Fórmula:
sum(input) / (1 + (product(input) / 9e16))
Bono: haga clic aquí!
fuente
Javascript 24 bytes
Afeitado 4 bytes gracias a @LeakyNun
Muy claro
fuente
v=>u=>(v+u)/(1+v*u/9e16)
bien?Julia, 22 bytes
Pruébalo en línea!
fuente
Noether , 24 bytes
No competidora
Pruébalo aquí!
Noether parece ser un lenguaje apropiado para el desafío dado que Emmy Noether fue pionero en las ideas de simetría que condujeron a las ecuaciones de Einstein (esto,
E = mc^2
etc.)De todos modos, esto es básicamente una traducción de la ecuación dada a la notación polaca inversa.
fuente
TI-BASIC, 12 bytes
Toma de entrada como una lista de
{U,V}
sobreAns
.fuente
PowerShell, 34 bytes
Implementación extremadamente sencilla. Sin embargo, no hay esperanza de alcanzar a nadie, gracias a los 6
$
requeridos.fuente
Oracle SQL 11.2, 39 bytes
fuente
T-SQL, 38 bytes
Pruébalo en línea!
Implementación directa de fórmulas.
fuente
ForceLang, 116 bytes
Sin competencia, utiliza la funcionalidad de idioma agregada después de que se publicó el desafío.
fuente
TI-Basic, 21 bytes
fuente
E
vale la pena 2 bytes?dc, 21 bytes
Esto supone que la precisión ya se ha establecido, por ejemplo, con
20k
. Agregue 3 bytes si no puede hacer esa suposición.Una versión más precisa es
a 24 bytes.
Ambas son transcripciones razonablemente fieles de la fórmula, y el único juego de golf notable es el uso de
9I16^*
for c².fuente
PHP,
4445 bytesFunción anónima, bastante sencilla.
fuente
c^2
en el denominador ... es decir,9e16
o equivalente.En realidad, 12 bytes
Pruébalo en línea!
Explicación:
fuente
Java (JDK) , 24 bytes
Pruébalo en línea!
fuente
Adelante (gforth) , 39 bytes
Pruébalo en línea!
Explicación del código
fuente