Вызов и происхождение
На Stack Overflow популярный вопрос: как преобразовать размер байта в читабельный формат в Java? Ответ с наибольшим количеством голосов имеет довольно хороший способ сделать это, но это Codegolf, и мы можем сделать лучше, не так ли?
Ваша задача состоит в том, чтобы написать метод или программу, которая покрывает заданное количество байтов в правильном читабельном формате и выводит результат на стандартный язык из вашего языка. *
* Ознакомьтесь с правилами для уточнения!
вход
Ввод всегда будет положительным числом байтов с максимумом (2 ^ 31) -1.
Выход
Вы можете выбрать, предпочитаете ли вы Международную систему единиц или двоичную нотацию в качестве выходных данных (нотация SI, вероятно, экономит вам несколько байтов).
SI: B, kB, MB, GB
Binary: B, KiB, MiB, GiB
Примечание: единицы измерения выше, чем в ГБ или ГиБ, невозможны из-за ограниченного входного диапазона.
Пример вывода
Международная система единиц:
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
Binary:
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
правила
- Встроенные функции для форматирования байтов не допускаются!
- Выходные данные всегда должны быть в одном стандарте обозначений, вы не можете смешивать SI или двоичный код;
- Выходные данные всегда должны быть в максимально возможной единице, где результирующее число все еще больше или равно единице;
- Выходные данные всегда должны иметь одно десятичное число, но вы можете распечатать целое число, если результирующий вывод представлен в байтах (B);
- Вы можете выбрать, хотите ли вы добавить пробел, табуляцию или ничего между числом и единицей;
- Ввод принимается через STDIN или параметры функции;
- Вывод выводится на консоль или возвращается в виде строки (или аналогичного символьного контейнера);
- Это код гольф, поэтому самый короткий ответ выигрывает. Веселиться!
Изменить: еще больше уточнений
Некоторые числа имеют интересное поведение округления, например, число 999950. Большинство реализаций кода возвращает 1000,0 кБ вместо 1,0 МБ. Почему? Потому что 999950/1000 оценивается до 999.950, который фактически округляется до 1000.0 при использовании String.format в Java (в большинстве других языков тоже). Хенч требует дополнительных проверок для обработки подобных случаев.
Для этой задачи принимаются оба стиля: 1000,0 кБ и 1,0 МБ, хотя последний стиль является предпочтительным.
Псевдокод / тестовый код 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)); }
999999
и 1000000
? 160581
Экспонаты округления, поэтому она должна быть 1000.0kB
и 1.0MB
?
kB
(обратите внимание на строчную букву k)