Antecedentes
La tarea es simple pero cada programador la ha implementado al menos una vez. Stackoverflow tiene muchas muestras, pero ¿son lo suficientemente cortas como para ganar?
Historia del problema
Eres un programador gruñón al que se le asignó la tarea de implementar la entrada de tamaño de archivo para los usuarios. Como los usuarios no usan bytes, todos ingresarán "1M", "1K", "3G", "3.14M", ¡pero necesita bytes! Entonces escribes un programa para hacer la conversión.
Luego, su gerente le entrega docenas de informes de usuarios con quejas sobre grandes números extraños en la entrada de tamaño de archivo. Parece que también necesitarás codificar la conversión inversa.
¿Qué es lo que hay que hacer?
Aquí está el truco: debe implementar la conversión bidireccional en una sola pieza de código. ¿Se utilizan dos funciones separadas según sea necesario? No, eso es demasiado simple: ¡hagamos uno corto!
Para los propósitos de este desafío, "kilobyte" significa 1024 bytes, "megabyte" significa 1024 * 1024 = 1048576 bytes y "gigabytle" significa 1024 * 1024 * 1024 = 1073741824 bytes.
Datos de prueba
Input -> Output
5 -> 5
1023 -> 1023
1024 -> 1K
1K -> 1024
1.5K -> 1536
1536 -> 1.5K
1048576 -> 1M
1M -> 1048576
Reglas
- El valor de la prueba no excederá 2 * 1024 * 1024 * 1024 o 2G
- Los usuarios utilizan los siguientes postfixes: K para kilobytes, M para megabytes, G para gigabytes
- No se requiere código para trabajar con números negativos
- No utilice bibliotecas externas (por ejemplo,
BCMath
en PHP) además de las agrupadas (por ejemplomath.h
) - Las lagunas estándar no están permitidas
- El código no debe producir nada en stderr
- Su programa puede tomar entradas y producir salidas usando métodos estándar
Respuestas:
Python 2,
204190 bytesEste es mi primer codegolf.
fuente
Pip, 60 bytes
Toma la entrada de la línea de comando (asignada a la
a
variable) y las salidas a stdout.Versión sin golf:
Algoritmo:
i
del 1 al 3:a >= 1024
, este es un valor de byte que debe convertirse en una unidad más grande:a
por 1024x
para ser el valor actual dea
concatenado con la unidad actualx
fue establecido por el paso anterior, envíelo. De lo contrario,a
era inferior a 1024 (con un posible sufijo de unidad), entonces:a
si tiene una deKMG
al final: traduzca la letra a la potencia adecuada de 1024 y multiplique el número por el resultado.fuente
JavaScript,
144106 bytesEsto definitivamente se puede acortar, y lo hará más tarde. Solo quería sacar algo feo por ahí;)
fuente
Python2 199 bytes
Esto es una tontería pero funciona (ignorando la pregunta de precisión decimal) siempre que tenga docenas de gigabytes de RAM. no lo ejecute de otra manera, su máquina podría congelarse y bloquearse. Lo primero que hace es asignar una matriz de enteros de 2 gigabytes.
fuente
C
206183 bytesMe libré de todo lo que pude.
Salida
Explicación
fuente