Виклик та походження
На стеку Overflow популярним питанням є: як перетворити розмір байтів у читаний для людей формат у Java? Відповідь, яка найбільше голосує, має досить приємний метод зробити це, але це кодовий гольф, і ми можемо зробити краще, чи не так?
Ваше завдання полягає в тому, щоб написати метод або програму, яка покриває задану кількість байтів у правильному для людини форматі і друкує результат у стандарті з вашої мови. *
* Дивіться правила для більш детального роз'яснення!
Вхідні дані
Вхід завжди буде додатною кількістю байтів, максимум (2 ^ 31) -1.
Вихідні дані
Ви можете вибрати, якщо ви віддаєте перевагу Міжнародній системі одиниць або двійковій нотації як вихід (позначення SI, ймовірно, заощаджує вам кілька байт).
SI: B, kB, MB, GB
Binary: B, KiB, MiB, GiB
Примітка: Більш високі одиниці, ніж GB або 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
Двійковий:
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(зверніть увагу на