Desafío y origen
En Stack Overflow, una pregunta popular es: ¿Cómo convertir el tamaño de byte en formato legible para humanos en Java? La respuesta más votada tiene un método bastante bueno para hacer esto, pero esto es codegolf y podemos hacerlo mejor, ¿no?
Su desafío es escribir un método o programa que convierta el número dado de bytes al formato legible por humanos correcto e imprima el resultado al estándar de su idioma. *
* ¡Vea las reglas para más aclaraciones!
Entrada
La entrada siempre será un número positivo de bytes con un máximo de (2 ^ 31) -1.
Salida
Puede elegir si prefiere el Sistema internacional de unidades o la notación binaria como salida (la notación SI probablemente le ahorre algunos bytes).
SI: B, kB, MB, GB
Binary: B, KiB, MiB, GiB
Nota: Las unidades superiores a GB o GiB no son posibles debido al rango de entrada restringido.
Salida de ejemplo
Sistema Internacional de Unidades:
Input Output
0 0.0 B
999 999.0 B
1000 1.0 kB
1023 1.0 kB
1024 1.0 kB
1601 1.6 kB
160581 160.6 kB
4066888 4.1 MB
634000000 634.0 MB
2147483647 2.1 GB
Binario:
Input Output
0 0.0 B
999 999.0 B
1000 1000.0 B
1023 1023.0 B
1024 1.0 KiB
1601 1.6 KiB
160581 156.8 KiB
4066888 3.9 MiB
634000000 604.6 MiB
2147483647 2.0 GiB
Reglas
- ¡Las funciones incorporadas para el formato de bytes no están permitidas!
- La salida siempre debe estar en el mismo estándar de notación, no puede mezclar SI o binario;
- La salida siempre debe estar en la unidad más grande posible donde el número resultante sea aún mayor o igual a uno;
- La salida siempre debe tener un número decimal, pero puede elegir imprimir un número entero cuando la salida resultante esté en bytes (B);
- Puede elegir si desea agregar un espacio, tabulación o nada entre el número y la unidad;
- La entrada se recibe a través de STDIN o parámetros de función;
- La salida se imprime en la consola o se devuelve como una cadena (o un contenedor de caracteres similar);
- Este es el código de golf, por lo que gana la respuesta más corta. ¡Que te diviertas!
Editar: incluso más aclaraciones
Algunos números tienen comportamientos de redondeo interesantes como el número 999950. La mayoría de las implementaciones de código devolverían 1000.0 kB en lugar de 1.0 MB. ¿Por qué? Porque 999950/1000 se evalúa como 999.950, que se redondea efectivamente a 1000.0 cuando se utiliza String.format en Java (en la mayoría de los otros idiomas también). Hench necesita algunos controles adicionales para manejar casos como este.
Para este desafío, se aceptan ambos estilos, 1000.0 kB y 1.0 MB, aunque se prefiere el último estilo.
Pseudocódigo / código de prueba de Java:
public static String bytesToSI(long bytes){ if (bytes < 1000){ return bytes + ".0 B"; } //Without this rounding check: //999950 would be 1000.0 kB instead of 1.0 MB //999950000 would be 1000.0 MB instead of 1.0 GB int p = (int) Math.ceil(Math.log(bytes) / Math.log(1000)); if(bytes/Math.pow(1000, p) < 0.99995){ p--; } //Format return String.format("%.1f %sB", bytes/Math.pow(1000, p), "kMGTPE".charAt(p-1)); }
999999y 1000000? 160581exhibe redondeo, entonces debería ser 1000.0kBy 1.0MB?
kB(tenga en cuenta la minúscula k)