¿Qué necesito para destruir el mundo?

19

La energía de unión gravitacional de un planeta es la cantidad de energía requerida para separar cada pequeño trozo de este, de modo que ningún trozo orbite o choque con otro trozo. Para una esfera uniforme, Wikipedia da esta fórmula:

mi=3solMETRO25 5R

Donde G es la constante gravitacional (6.672e-11 m 3 • kg -1 • s -2 ), M es masa y R es el radio.

Yo podría hacer que este desafío sobre el cálculo de este meramente en Julios (kg • m 2 • s -2 ), pero ... que sería aburrido . Y además, no todos entienden a Joules.

Entonces, en cambio, convirtámoslo en las siguientes unidades:

  • Kilotones de TNT (4.184 billones de julios, taquigrafía kilotons)
  • Armas nucleares de Hiroshima (62,76 billones de julios, taquigrafía nukes)
  • Hostess ™ Twinkies (560,000 julios, taquigrafía twinkies)
  • Kilovatios-hora (exactamente 3,6 millones de julios, taquigrafía kWh)
  • Kilogramos de energía de masa (1 kg de energía de masa = 299,792,458 2 julios, taquigrafía kg)

Entonces, tome la siguiente entrada:

  • masa en kilogramos
  • radio en metros
  • Una de las seis entradas distintas que representan la unidad a utilizar

Y genera la energía de enlace en las unidades especificadas. Agregue la unidad de taquigrafía al final de la salida.

Reglas

  • La abreviatura de Joules es J.
  • Se permite un espacio en blanco arbitrario, siempre que no divida la unidad de taquigrafía o el número.
  • Se permite la notación científica, en cualquier formato que utilice su idioma.
  • Solo necesitas 4 cifras significativas. Los puntos flotantes son muy recomendables.
  • Bla, bla, la respuesta más corta en bytes.

Casos de prueba

Generado con esta hoja de cálculo .

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

Inspirado en Powering the Death Star with Twinkies de Scott Manley.

Nissa
fuente
¿Qué quieres decir con "predeterminado a julios"? ¿eso significa que la unidad de salida no siempre se dará en la entrada?
HyperNeutrino
8
Además, me encanta cómo en realidad hay un nombre para la cantidad de energía necesaria para aniquilar completamente una cosa: P
HyperNeutrino
¿Podemos tomar la unidad de salida como cualquiera de las 6 entradas distintas? de lo contrario, es un formato de E / S engorroso y se desalientan
HyperNeutrino
@HyperNeutrino seguro, pero aún necesita la taquigrafía en la salida.
Nissa
2
@StephenLeppik " una de las seis entradas distintas que representan la unidad que se va a usar ": ¿pueden esas entradas distintas ser 4.184, 62.76, etc.?
ngn

Respuestas:

6

05AB1E , 56 54 bytes

Toma entrada como unit, radius, mass

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

Pruébalo en línea!

Ahorró 2 bytes gracias a Erik el outgolfer (codificación base 255 4184y 6276).

Emigna
fuente
16

JavaScript (ES6), 78 bytes

Toma la entrada como 3 variables distintas (mass, radius, unit).

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

Casos de prueba

El siguiente fragmento ejecuta todos los casos de prueba en la hoja de cálculo proporcionada.

¿Cómo?

Esto es bastante similar a la respuesta C de @ ColeraSu , con una función hash compatible con JS que funciona en toda la cadena de la unidad.

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
Arnauld
fuente
7

Gelatina , 78 bytes

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

Pruébalo en línea!

Las cosas relacionadas con las cuerdas no son realmente el tipo de desafío de Jelly ...

-7 bytes gracias a user202729 (gracias por ayudarme a no ser golpeado por JavaScript: D)

Hiperneutrino
fuente
Sí, ahora estás empatado con JS y aún no estás en la cima tampoco.
Nissa
@StephenLeppik Al menos no me están golpeando: D y callar 05AB1E es inherentemente mejor en los desafíos de cuerdas: P
HyperNeutrino
6

C, 113 bytes

Hash el segundo personaje, usando el seguimiento '\0'de "J". Se utiliza una matriz en línea en C.

Tenga en cuenta que debemos multiplicar el Mpenúltimo, o se desbordará 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);}

Pruébalo en línea!

Colera Su
fuente
+1. No estoy seguro si es posible, pero f (m, r, char * c) float m, r {...} ahorraría algunos bytes. Además, el punto y coma después de printf es opcional
xanoetux el
@xanoetux ¿Qué compilador usas? Sin embargo, ambos no funcionan en mi máquina.
Colera Su
Estoy usando GCC. No probado, pero estoy bastante seguro sobre el último punto y coma. (probará más tarde)
xanoetux
4

APL (Dyalog Unicode) , 153 71 69 bytes

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

Pruébalo en línea!

Gracias a @ Adám por aplastar absolutamente mi vieja respuesta en esta. Gracias a @ngn por 2 bytes.

Esta 'función' es en realidad un operador llamado op. Todos los valores para las unidades de medida se transformaron en notación científica.

Cómo funciona:

{⍺,⍨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
J. Sallé
fuente
3

Python 3, 112 106 108 101 Bytes

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

Muy claro. Utiliza la enotación de Python . Utiliza un dict que distingue la unidad basada en la segunda letra y divide por el valor de corrosponding. u[1:2]es básicamente u[1], esperar que regrese en ''lugar de un error (que solo aprendí ahora). Luego aplica la fórmula con algunas simplificaciones.

editar: hasta 106 gracias a totalmente humano, de nuevo a 108 debido al nuevo valor de las armas nucleares y hasta 101 gracias a Colera Su.

Pruébalo en línea!

PattuX
fuente
3

Excel (Oficina 365), 106 101 97 bytes

Suponiendo que la celda A1es la masa, A2es el radio y B1es la unidad, escrita como la abreviatura de la salida.

=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 bytes

Excel antiguo no tiene la SWITCHfunción, así que tienes

=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
KSmarts
fuente
Puede guardar 2 bytes sustituyendo 299792E3^2con 89876E12 (Aún lo suficientemente preciso para los requisitos de la pregunta). Divida todos los valores entre 1000otros 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
Oye, solo quiero decir que la Switch()función está disponible para copias de escritorio de Excel, y se introdujo con Office 2016.
Taylor Scott,
1

Ruby, 83 82 bytes

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

Utiliza un hash personalizado para indexar una LUT para las unidades ( i * k mod mfórmula). Los números fueron encontrados usando la fuerza bruta.

Peter Lenkefi
fuente
0

Excel, 94 bytes

Toma masa de A1, radio de B1, unidad en C1. Mira hacia arriba 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)
Wernisch
fuente
0

Jalea , 59 bytes

Solo quería probar otro método extraño para convertir las unidades. Pero el resto del código probablemente esté mal jugado.

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

Pruébalo en línea!

¿Cómo?

Construimos una 'firma' de una cadena de unidades a partir de la originalidad de sus códigos ASCII. Lo interpretamos como un valor binario y aplicamos un módulo para obtener el índice final en la tabla de búsqueda.

⁵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

El enlace auxiliar proporciona los siguientes índices para cada unidad:

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
Arnauld
fuente