El otro día, mi profesor de química nos estaba explicando acerca de la notación científica (usando un número pequeño y multiplicándolo por potencias de diez para expresar números grandes con mayor facilidad), lo que me llevó unos años a cuando lo aprendí por primera vez. Después de aprender los conceptos básicos, hicimos un montón de preguntas típicas de matemáticas, algunas de las cuales fueron las siguientes:
Representa lo siguiente en notación científica:
a) 50000000
b) 120000000000000
c) 90000000000000000000000000000000000000
d) pi ^ e ^ i ^ j ^ k ^ std :: vector
...
z) 200
...
Y pensé: "¿Qué? ¡Nos dijeron que la notación científica se usaba para que la escritura de grandes números fuera más eficiente, pero algunos casos no son más eficientes en absoluto!"
Considera el número
300
y su representación en notación científica:
3x10^2
¿Qué, la versión científicamente notada realmente ocupa más espacio? No podemos tener eso ahora, ¿verdad? (El espacio en la pantalla es precioso.)
Podríamos determinar si es más eficiente el espacio para escribir un número en notación científica o no, o ...
Tarea
Su programa o función debe tomar como entrada un único número positivo n
de tamaño arbitrario (hasta lo que admite su idioma) y generar la versión del número con notación científica.
Sin embargo, si el número original n
, después de eliminar los ceros al final y el lugar decimal al final, toma menos o la misma cantidad de caracteres para mostrar que su versión notada científicamente, debe generar ese número original n
.
Su código debe ser lo más corto posible porque la salida también debe ser lo más corta posible.
Especificaciones
La notación científica eficiente se define de la siguiente manera:
bx10^e
b
es el número de entrada apropiadamente dividida por potencias de 10 de tal manera que 1 <= b < 10
. Este número debe tener todos los ceros finales (y el punto decimal si es necesario) eliminado, pero debe tener la precisión del número original (hasta el límite del punto decimal en su idioma, por supuesto). Es decir, 90000
se vuelve 9
, 13.500
vuelve 1.35
, 0.000675
vuelve 6.75
, etc Si este número hasta extremos que contiene más lugares decimales de la lengua puede manejar, que deben redondearse a ese número máximo de cifras decimales.
e
es el exponente al que se eleva diez de tal manera n = b x 10^e
(recuerde que este número debe ser negativo si n
es menor que 1). Este número no debe tener ceros a la izquierda o un lugar decimal (principalmente porque si no es un entero, algo está mal ...).
Los caracteres x10^
deben permanecer como están en la cadena entre b
y e
.
Casos de prueba
Input -> output
1 -> 1
20 -> 20
3000000 -> 3x10^6
400000 -> 400000
0.008093 -> 0.008093
0.007835000000000 -> 0.007835
0.000003000000 -> 3x10^-6
0.00000065 -> 6.5x10^-7
0 -> 0
Puntuación
Este es el código de golf , por lo que gana el código más corto en bytes.
Otras reglas y aclaraciones
- Los ceros finales (y / o el lugar decimal final) no se cuentan para el recuento de caracteres del número de entrada original
n
. Tenga esto en cuenta para casos como el caso de prueba 6 - Puede suponer que si el número de entrada es menor que 1, siempre comenzará con un 0 en lugar de los dígitos (como en los casos de prueba 5-8).
- El número de entrada nunca será negativo
- Las incorporaciones que hacen que este desafío sea trivial y las lagunas estándar no están permitidas
- Una nueva línea final en la salida está bien
EDITAR
Gracias a user81655 por señalar que los casos de prueba 7 y 8 tenían potencias incorrectas de diez. Ahora los he arreglado, así que asegúrese de que su código los evalúe correctamente.
pi^e^i^j^k^std::vector
?e
:9000 -> 9e3
(¡casi más de 9,000 !)x10^
. Y sería un poco de revisión de la cuestión, lo cual no creo que sea apropiado ahora que se publicóRespuestas:
ES6,
8381 bytesProbablemente falla en algunos casos
toString
extremos donde insiste en el formato exponencial.Editar: Guardado 2 bytes gracias a @ user81655.
fuente
/
al final de la expresión regular.x=>(e=s=>s.replace(/e\+?/,'x10^'),z=e(x.toExponential()),y=e(''+x))[z.length]?z:y
Python 3,
346342319302 bytesProbablemente jugaron al golf horriblemente, pero bueno, este es mi primer intento en algo como esto. Es difícil de leer, por lo que debe ser bueno.
Hasta donde sé, debería funcionar en todos los casos, incluso con la tendencia de Python de convertir automáticamente los números más allá de cualquier umbral en notación científica (excepto con esa 'e' genial y elegante). No recuerdo exactamente cómo hice para poder devolver números de formulario estándar, pero lo hace.
fuente
Perl 6,
9690 bytesSiento que esto podría ser más corto, pero esto es lo mejor por ahora
uso : Asigne esto a una variable
Aquí está ungolfed con algunos malos comentarios:
fuente
$_ <1
con1>$_
y1 <=* <10
con10>*>=1
TI BASIC (nspire): 112 bytes
Explicación
Convierte la entrada a notación científica con la función de formato si ya no está en ese formato, ya que los decimales pequeños se convierten automáticamente.
Encuentra la posición de la fantasía E que denota exponentes y la reemplaza con "x10 ^".
Comprueba qué salida es más grande y devuelve la óptima. A menos que sea un decimal pequeño, que son más pequeños por defecto.
fuente
Python (3.5) 177 bytes
Una solución usando expresión regular
Explicación
Importación del módulo regexp
Definición de la función lambda para reemplazar
e
porx10^
Conversión de la cadena en notación científica.
Eliminar 0 relleno en la cadena original
comparar longitud
Resultados
fuente