De quoi ai-je besoin pour détruire le monde?


19

L' énergie de liaison gravitationnelle d'une planète est la quantité d'énergie requise pour en séparer chaque petit morceau afin qu'aucune pièce n'orbite ou n'entre en collision avec une autre pièce. Pour une sphère uniforme, Wikipedia donne cette formule:

E=3gM25R

Où G est la constante gravitationnelle (6,672e-11 m 3 • kg -1 • s -2 ), M est la masse et R est le rayon.

Je pourrais faire ce défi de simplement calculer cela en Joules (kg • m 2 • s -2 ), mais… ce serait ennuyeux . Et d'ailleurs, tout le monde ne comprend pas les Joules.

Au lieu de cela, convertissons-le dans les unités suivantes:

  • Kilotonnes de TNT (4.184 trillions de joules, sténographie kilotons)
  • Armes nucléaires d'Hiroshima (62,76 trillions de joules, sténographie nukes)
  • Hostess ™ Twinkies (560 000 Joules, sténographie twinkies)
  • Kilowatt-heures (exactement 3,6 millions de Joules, sténographie kWh)
  • Kilogrammes d'énergie de masse (1 kg d'énergie de masse = 299 792 458 2 joules, sténographie kg)

Prenez donc l'entrée suivante:

  • masse en kilogrammes
  • rayon en mètres
  • l'une des six entrées distinctes représentant l'unité à utiliser

Et produire l'énergie de liaison dans les unités spécifiées. Ajoutez l'unité sténographique à la fin de la sortie.

Règles

  • Le raccourci pour Joules est J.
  • Les espaces blancs arbitraires sont autorisés, tant qu'ils ne divisent pas l'unité sténographique ou le nombre.
  • La notation scientifique est autorisée, quel que soit le format utilisé par votre langue.
  • Vous n'avez besoin que de 4 chiffres significatifs. Les points flottants sont fortement recommandés.
  • Blah blah réponse la plus courte en octets.

Cas de test

Généré avec cette feuille de calcul .

Mass (kg)   Radius (m)  J           kilotons    nukes       twinkies    kWh         kg
3.302E+23   2440000     1.789E+30   4.275E+17   2.850E+16   3.194E+24   4.969E+23   1.990E+13
4.869E+24   6052000     1.568E+32   3.748E+19   2.499E+18   2.800E+26   4.356E+25   1.745E+15
5.974E+24   6371000     2.242E+32   5.360E+19   3.573E+18   4.004E+26   6.229E+25   2.495E+15
6.419E+23   3390000     4.866E+30   1.163E+18   7.753E+16   8.689E+24   1.352E+24   5.414E+13
1.899E+27   69911000    2.065E+36   4.935E+23   3.290E+22   3.687E+30   5.736E+29   2.298E+19
5.685E+26   58232000    2.222E+35   5.310E+22   3.540E+21   3.968E+29   6.172E+28   2.472E+18
8.683E+25   25360000    1.190E+34   2.845E+21   1.896E+20   2.125E+28   3.306E+27   1.324E+17
1.024E+26   24620000    1.705E+34   4.075E+21   2.717E+20   3.045E+28   4.736E+27   1.897E+17
1.311E+22   1186000     5.801E+27   1.387E+15   9.244E+13   1.036E+22   1.611E+21   6.455E+10
1.989E+30   696300000   2.274E+41   5.436E+28   3.624E+27   4.062E+35   6.318E+34   2.531E+24
7.350E+22   1737000     1.245E+29   2.976E+16   1.984E+15   2.223E+23   3.458E+22   1.385E+12

Inspiré par Powering the Death Star with Twinkies de Scott Manley.


qu'entendez-vous par «par défaut en joules»? cela signifie-t-il que l'unité de sortie ne sera pas toujours indiquée en entrée?
HyperNeutrino

8
aussi, j'aime la façon dont il y a réellement un nom pour la quantité d'énergie nécessaire pour anéantir complètement une chose: P
HyperNeutrino

pouvons-nous prendre l'unité de sortie comme l'une des 6 entrées distinctes? sinon c'est un format d'E / S encombrant et ceux-ci sont déconseillés
HyperNeutrino

@HyperNeutrino bien sûr, mais vous avez toujours besoin du raccourci dans la sortie.
Nissa

2
@StephenLeppik "l' une des six entrées distinctes représentant l'unité à utiliser " - ces entrées distinctes peuvent-elles être 4.184, 62.76, etc.?
2017

Réponses:


6

05AB1E , 56 54 octets

Prend l'entrée comme unit, radius, mass

6n56•G*•x619+•Oć•4°z)•1¡‡•S°*"Wwigu"I1èkè*2498T>°P/*¹J

Essayez-le en ligne!

Enregistré 2 octets grâce à Erik le joueur de golf (base 255 encoder 4184et 6276).


16

JavaScript (ES6), 78 octets

Prend l'entrée comme 3 variables distinctes (mass, radius, unit).

(m,r,u)=>m*m/r/[8987e9,56,6276e6,,4184e5,1e-4,360][parseInt(u,30)%7]/2498e11+u

Cas de test

L'extrait suivant exécute tous les cas de test dans la feuille de calcul fournie.

Comment?

Ceci est assez similaire à la réponse C de @ ColeraSu , avec une fonction de hachage compatible JS qui fonctionne sur toute la chaîne d'unité.

Unit       | Parsed as (*) | Base-30 -> Dec. | mod 7
-----------+---------------+-----------------+------
"J"        | "j"           | 19              | 5        (*):
"kilotons" | "kilotons"    | 451052545318    | 4          Because we're parsing as Base-30,
"nukes"    | "n"           | 23              | 2          characters [u-z] (and anything
"twinkies" | "t"           | 29              | 1          after them) are simply ignored.
"kWh"      | "k"           | 20              | 6
"kg"       | "kg"          | 616             | 0

7

Gelée , 78 octets

²×⁽LÐ÷ȷ14÷⁴÷5÷⁵ị“¤Fðẏẏż“?A⁺ẏẏż“¬ŀż“8Ƙż“¡uþ³⁾ẉṿÆ“¡’¤;⁵ị“ÞṠlT“¡ṁæ-“;ØḲ“ȧ¹“ṫD“}»¤

Essayez-le en ligne!

Les trucs à faire avec les cordes ne sont pas vraiment le genre de défi de Jelly ...

-7 octets grâce à user202729 (merci de m'avoir aidé à ne pas me faire battre par JavaScript: D)


Ouais, maintenant tu es à égalité avec JS et tu n'es toujours pas au top non plus.
Nissa

@StephenLeppik Au moins, je ne me fais pas battre: D et shush 05AB1E sont intrinsèquement meilleurs aux défis de cordes: P
HyperNeutrino

6

C, 113 octets

Hachez le deuxième caractère en utilisant la fin '\0'de "J". Le tableau en ligne en C est utilisé.

Notez que nous devons multiplier l'avant- Mdernier, sinon il débordera inf.

f(m,r,c)float m,r;char*c;{printf("%e%s",m/r/(float[]){1e-4,360,6276e6,8987e9,56,4184e5}[c[1]%36%7]/2498e11*m,c);}

Essayez-le en ligne!


+1. Pas sûr si possible, mais f (m, r, char * c) float m, r {…} économiserait quelques octets. En outre, le point-virgule après printf est facultatif
xanoetux

@xanoetux Quel compilateur utilisez-vous? Les deux ne fonctionnent pas sur ma machine.
Colera Su

J'utilise GCC. Non testé, mais je suis sûr du dernier point-virgule. (testera plus tard)
xanoetux

4

APL (Dyalog Unicode) , 153 71 69 octets

op←{⍺,⍨40032E¯15÷÷/8987E13 36E5 6276E10 56E4 4184E9 1['gWuw '⍳⊃1↓⍺]⍵⍺⍺⍵}

Essayez-le en ligne!

Merci à @ Adám d'avoir écrasé mon ancienne réponse dans celle-ci. Merci à @ngn pour 2 octets.

Cette «fonction» est en fait un opérateur appelé op. Toutes les valeurs des unités de mesure ont été transformées en notation scientifique.

Comment ça fonctionne:

{⍺,⍨40032E¯15÷÷/8987E13 36E5 6276E10 56E4 4184E9 1['gWuw '⍳⊃1↓⍺]⍵⍺⍺⍵}
                                                             1↓⍺          take the measurement unit without the first letter (because it is ambiguous)
                                                                         picks the first element returned by 
                                                                         Dyadic ota, which finds the index of
                                                  'gWuw '                 each of these characters
                                                 [             ]          square brackets indicate the index
               8987E13 36E5 6276E10 56E4 4184E9 1                         of the element of this vector (1-indexed) which will be used as the divisor for
            ÷/                                                  ⍵⍺⍺⍵      dividing by the left operand (⍺⍺) and the right argument squared.
    40032E¯15÷                                                            then divide this number by the result
 ⍺,⍨                                                                      and append the measurement unit

3

Python 3, 112 106 108 108 101 octets

lambda m,r,u:str(40032e-19*m*m/r/{'':1e-4,'i':4184e5,'u':6276e6,'w':56,'W':360,'g':8987e9}[u[1:2]])+u

Assez simple. Utilise la enotation de Python . Utilise un dict qui distingue l'unité en fonction de la deuxième lettre et divise par la valeur corrosive. u[1:2]est fondamentalement u[1], attendez-vous à ce qu'il retourne ''au lieu d'une erreur (que je viens d'apprendre maintenant). Applique ensuite la formule avec quelques simplifications.

edit: jusqu'à 106 grâce à totalementhuman, de retour à 108 à cause de la nouvelle valeur des armes nucléaires et à 101 grâce à Colera Su.

Essayez-le en ligne!


3

Excel (Office 365), 106 101 97 octets

En supposant que la cellule A1est la masse, A2le rayon et B1l'unité, écrite comme raccourci pour la sortie.

=40032E-19*A1^2/(A2*SWITCH(MID(B1,2,1),"u",6276E6,"w",56,"W",360,"g",89876E8,"i",4184E5,1E-4))&B1

Excel, 130 octets

Excel à l'ancienne n'a pas la SWITCHfonction, vous avez donc

=40032E-15*A1^2/(A2*IF(B1="J",1,IF(B1="nukes",6276E10,IF(B1="twinkies",56E4,IF(B1="kWh",36E5,IF(B1="kg",299792E3^2,4184E9))))))&B1

Vous pouvez enregistrer 2 octets en remplaçant 299792E3^2par 89876E12 (Toujours suffisamment précis pour les exigences de la question.) Divisez toutes les valeurs par 1000enregistre un autre 2:=40032E-19*A1^2/(A2*SWITCH(MID(B1,2,1),"u",6276E6,"w",56,"W",360,"g",89876E8,"i",4184E5,1E-4))&B1
Wernisch

Hé, je veux juste dire que la Switch()fonction est disponible pour les copies de bureau d'Excel et a été introduite avec Office 2016.
Taylor Scott

1

Rubis, 83 82 octets

->m,r,u{"#{40032E-18*m*m/r/[36E2,56,8987E9,1E-3,4184E6,6276E7][u.sum*3%71%6]} "+u}

Utilise un hachage personnalisé pour indexer une LUT pour les unités ( i * k mod mformule). Les nombres ont été trouvés en utilisant la force brute.


0

Excel, 94 octets

Prend la masse de A1, le rayon de B1, l'unité en C1. Regardez 2*Code(Unit) + Length(Unit) modulo 11.

=4.0032E-15*A1^2/B1/CHOOSE(MOD(2*CODE(C1)+LEN(C1),11),,4184E5,,,6276E6,1E-4,89876E8,360,56)

0

Gelée , 59 octets

Je voulais juste essayer une autre méthode bizarre pour convertir les unités. Mais le reste du code est probablement mal joué.

⁵OÆPḄ%9ị[56,4184ȷ5,8987ȷ9,360,0,6276ȷ6,1ȷ-4]
²÷⁴÷2498ȷ11÷¢⁵

Essayez-le en ligne!

Comment?

Nous construisons une «signature» d'une chaîne d'unité à partir de la primauté de ses codes ASCII. Nous l'interprétons comme une valeur binaire et appliquons un modulo pour obtenir l'index final dans la table de recherche.

⁵OÆPḄ%9ị[...]    - helper link to convert the unit to a hardcoded constant
⁵                - the 3rd input        e.g. "kilotons"
 O               - to ASCII codes       --> [107, 105, 108, 111, 116, 111, 110, 115]
  ÆP             - is prime?            --> [1, 0, 0, 0, 0, 0, 0, 0]
    Ḅ            - binary -> decimal    --> 128
     %9          - modulo 9             --> 2
       ị[...]    - get value from table --> 418400000

²÷⁴÷2498ȷ11÷¢⁵   - main link taking the mass, the radius and the unit
²                - square the mass
 ÷⁴              - divide by the radius
   ÷2498ȷ11      - divide by 2498e11
           ÷¢    - divide by the unit constant, invoking the helper link as a nilad
             ⁵   - append the unit

Le lien d'aide donne les indices suivants pour chaque unité:

unit     | ASCII codes                     | is prime?       | bin -> dec | mod 9
---------+---------------------------------+-----------------+------------+------
J        | 74                              | 0               |      0     |   0
kilotons | 107,105,108,111,116,111,110,115 | 1,0,0,0,0,0,0,0 |    128     |   2
nukes    | 110,117,107,101,115             | 0,0,1,1,0       |      6     |   6
twinkies | 116,119,105,110,107,105,101,115 | 0,0,0,0,1,0,1,0 |     10     |   1
kWh      | 107,87,104                      | 1,0,0           |      4     |   4
kg       | 107,103                         | 1,1             |      3     |   3
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.