En relativité restreinte , la vitesse d'un objet en mouvement par rapport à un autre objet qui se déplace dans la direction opposée est donnée par la formule:
s = ( v + u ) / ( 1 + v * u / c ^ 2)
Dans cette formule, et sont les amplitudes des vitesses des objets, et est la vitesse de la lumière (qui est d'environ , une approximation assez proche pour ce défi).
Par exemple, si un objet se déplaçait vers v = 50,000 m/s
, et un autre objet se déplaçait vers u = 60,000 m/s
, la vitesse de chaque objet par rapport à l'autre serait approximativement s = 110,000 m/s
. C'est ce que vous attendez de la relativité galiléenne (où les vitesses s'ajoutent simplement). Cependant, si v = 50,000,000 m/s
et u = 60,000,000 m/s
, la vitesse relative serait approximativement 106,451,613 m/s
, ce qui est significativement différent de celui 110,000,000 m/s
prédit par la relativité galiléenne.
Le défi
Étant donné deux nombres entiers v
et u
tels que 0 <= v,u < c
, calculer la vitesse additive relativiste, en utilisant la formule ci-dessus, avec c = 300000000
. La sortie doit être une valeur décimale ou une fraction réduite. La sortie doit être inférieure à 0.001
la valeur réelle pour une valeur décimale ou exacte pour une fraction.
Cas de test
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)
la source
s/velocity/Velocity of an Unladen Swallow/g
Réponses:
MATL , 9 octets
Essayez-le en ligne!
la source
Mathematica, 17 octets
Une fonction sans nom prenant deux entiers et retournant une fraction exacte.
Explication
Cela utilise deux belles astuces avec la séquence d'arguments
##
, ce qui me permet d'éviter de référencer les arguments individuelsu
etv
séparément.##
se développe en une séquence de tous les arguments, qui est en quelque sorte une "liste non enveloppée". Voici un exemple simple:donne
La même chose fonctionne à l'intérieur des fonctions arbitraires (car
{...}
c'est juste un raccourci pourList[...]
):donne
Maintenant, nous pouvons également remettre
##
aux opérateurs qui les traiteront d'abord comme un seul opérande en ce qui concerne l'opérateur. Ensuite, l'opérateur sera développé à sa forme complètef[...]
, et ce n'est qu'à ce moment que la séquence sera développée. Dans ce cas,+##
c'estPlus[##]
qui estPlus[u, v]
, c'est-à-dire le numérateur que nous voulons.Dans le dénominateur, en revanche,
##
apparaît comme l'opérateur de gauche de/
. La raison pour laquelle cela se multiplieu
etv
est plutôt subtile./
est mis en œuvre en termes deTimes
:Alors, quand il
a
est##
, il se développe ensuite et nous nous retrouvons avecIci,
*^
est juste l'opérateur de Mathematica pour la notation scientifique.la source
Gelée, 9 octets
Essayez-le en ligne! Sinon, si vous préférez fractions, vous pouvez exécuter le même code avec M .
Comment ça fonctionne
la source
Python3,
55 3129 octetsPython est horrible pour obtenir des entrées selon les besoins de chaque entrée,
int(input())
mais voici ma solution quand même:v, u = int (entrée ()), int (entrée ()); print ((v + u) / (1 + v * u / 9e16))Grâce à @Jakube, je n'ai pas vraiment besoin de tout le pré-jeu, juste de la fonction. Par conséquent:
Plutôt explicite,
obtenez des entrées, descalculs. J'ai utilisé c ^ 2 et simplifié car 9e16 est plus court que (3e8 ** 2).Python2, 42 octets
Merci à @muddyfish
la source
int(input())
et le remplacer parinput()
, vous pouvez également déposer les crochets autour de l'instruction printlambda u,v:(v+u)/(1+v*u/9e16)
, et cela fonctionne pour Python 2 et 3.J,
1311 octetsUsage
Où
>>
est STDIN et<<
STDOUT.la source
Matlab, 24 octets
Fonction anonyme qui prend deux entrées. Rien d'extraordinaire, juste soumis pour être complet.
la source
CJam, 16 octets
Je suis toujours sûr qu'il y a des octets à enregistrer ici
la source
q~d]_:+\:*9e16/)/
d
travailler comme ça, mais je ne peux pas croire que j'ai manqué l'opérateur d'incrémentation ....q~_:+\:*9.e16/)/
Dyalog APL , 11 octets
La fraction de la somme et [l'incrément des divisions de quatre-vingt-dix quadrillions et du produit]:
÷⍨
est "divise", comme dans "quatre-vingt-dix quadrillions divise n ", c'est-à-dire équivalent à n divisé par quatre-vingt-dix quadrillions.la source
Haskell, 24 octets
En tant que fonction unique qui peut fournir un nombre à virgule flottante ou fractionnaire, selon le contexte dans lequel il est utilisé ...
Exemple d'utilisation dans REPL:
la source
u#v
au lieu der u v
.Pyke, 12 octets
Essayez-le ici!
la source
Pyth, 14 octets
Suite de tests.
Formule:
sum(input) / (1 + (product(input) / 9e16))
Bonus: cliquez ici!
la source
Javascript 24 octets
Rasé de 4 octets grâce à @LeakyNun
Assez simple
la source
v=>u=>(v+u)/(1+v*u/9e16)
Ça irait ?Julia, 22 octets
Essayez-le en ligne!
la source
Noether , 24 octets
Non compétitif
Essayez-le ici!
Noether semble être un langage approprié pour le défi étant donné qu'Emmy Noether a été le pionnier des idées de symétrie qui conduisent aux équations d'Einstein (ceci,
E = mc^2
etc.)Quoi qu'il en soit, il s'agit essentiellement d'une traduction de l'équation donnée en notation polonaise inverse.
la source
TI-BASIC, 12 octets
Prend entrée comme une liste de
{U,V}
surAns
.la source
PowerShell, 34 octets
Mise en œuvre extrêmement simple. Aucun espoir de rattraper qui que ce soit, cependant, grâce aux 6
$
requis.la source
Oracle SQL 11.2, 39 octets
la source
T-SQL, 38 octets
Essayez-le en ligne!
Mise en œuvre simple de la formule.
la source
ForceLang, 116 octets
Non compétitif, utilise la fonctionnalité de langue ajoutée après la publication du défi.
la source
TI-Basic, 21 octets
la source
E
valeur de 2 octets?dc, 21 octets
Cela suppose que la précision a déjà été définie, par exemple avec
20k
. Ajoutez 3 octets si vous ne pouvez pas faire cette hypothèse.Une version plus précise est
à 24 octets.
Les deux sont des transcriptions raisonnablement fidèles de la formule, le seul golf notable étant l'utilisation de
9I16^*
for c².la source
PHP,
4445 octetsFonction anonyme, assez simple.
la source
c^2
dans le dénominateur ... c'est-à-dire,9e16
ou équivalent.En fait, 12 octets
Essayez-le en ligne!
Explication:
la source
Java (JDK) , 24 octets
Essayez-le en ligne!
la source
Forth (gforth) , 39 octets
Essayez-le en ligne!
Explication du code
la source