Вызов и происхождение
На 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)); }
kB
(обратите внимание на строчную букву k)999999
и1000000
?160581
Экспонаты округления, поэтому она должна быть1000.0kB
и1.0MB
?Ответы:
TI-BASIC, 44
Был бы правильным инструментом для работы, если бы в TI-BASIC было достаточно приличное манипулирование строками (мне пришлось прибегнуть к перезаписи экспоненты числа, отображаемого в инженерной нотации, с единицей). Как он есть, он округляет и выводит правильно, но это даже не близко к выигрышным записям. Возможно другой язык калькулятора мог победить этот?
Ввод в форме
[number]:[program name]
на рабочем столе.Данные тестовые случаи:
источник
CJam,
3527 байтовСпасибо Денису за удаление 8 байт.
Это не печатается
.0
в онлайн-переводчике . Но, как указал Деннис , он прекрасно работает в интерпретаторе Java.объяснение
источник
ri{_e-3XmO_i}g;o]," kMG"='B
(27 байт)1mO
. Но этот код не работает для1149999
...ri{_e-3_i}g;1mOo]," kMG"='B
должен.999999
становится1000kB
. Читая вопрос еще раз, я не уверен, что1000kB
будет на самом деле неправильно.Pyth,
2927 байтДемонстрация. Тест Жгут.
Объяснение:
источник
CJam, 28
Попробуйте онлайн
Примечание: он не показывает «.0» с онлайн-переводчиком, но делает это с официальным Java-переводчиком .
Объяснение:
источник
Python 2 - 76 байт
Использует Международную Систему Единиц, просто потому, что это проще сделать в голове;)
источник
f=1e3
Powershell, 190
использование
источник
Хаскелл, 119
К сожалению, я не могу найти более короткий путь в Haskell, чтобы обеспечить 1 десятичное место в числах с плавающей запятой, но я публикую пост для потомков.
Использование:
Умеренно менее гольфовая версия:
источник
Java, 106 байт
Это метод, который принимает число и возвращает строку.
источник
1e3
для1000
; вы можете преобразовать этоwhile()
в afor()
и использовать свободные точки с запятой; и я не знаю, работает ли это, потому что кажется, что он отображает все десятичные цифры, а не только одну после десятичной точки.Python 2, 127 байт
Используя ИСУ. Фрагмент объявляет функцию 'C', которая принимает число для преобразования в качестве аргумента.
Некоторый тестовый код:
источник
1e3
вместо1000.0
JavaScript ( ES6 ), 71
Использование единиц СИ - функция, возвращающая запрошенную строку.
Этот более короткий следует правилам, особенно 3 и 4
Увы, таким образом, результаты не соответствуют примерам.
Чтобы соответствовать примерам, вот более длинный, специальный корпус для небольших чисел (82 байта)
Запустите фрагмент для тестирования (будь то EcmaScript 6, только Firefox)
Показать фрагмент кода
источник
Python, 61 байт
Звоните как
f(999)
. Обратите внимание, что1e3
это число с плавающей точкой, поэтому оно работает как с Python 2, так и с Python 3.источник
PHP4.1,
6362 байтаНе лучший гольф, но, конечно, довольно короткий.
Чтобы использовать его, перейдите через POST / GET или установите значение в СЕССИИ на клавише
B
.Оставьте ключ
I
неустановленным!источник
SpecBAS - 100 байт
Используя соглашение ISU.
Я понял, что наличие переменной, установленной на 1e3 (для которой требуется оператор LET), а затем использование этой переменной в разработке, на самом деле использует больше символов, чем просто жесткое кодирование 1e3, где это необходимо.
источник
Рубин, 128 байт
Я сделал это долгий путь, это довольно плохо.
Выход
редактировать
Добавлен ТБ для дополнительных 39 байтов
Выход:
источник
Sed
-r
, 218 + 1Я использую единицы СИ; Я думаю, что выбор бинарных единиц был бы смелой политикой . ;-)
переформатирован:
Выход
вариации
Кажется, что правила подразумевают округление до ближайшего, но я считаю, что округление вниз является приемлемой альтернативой и экономит 123 байта (лучше, чем 50%):
Естественное расширение до более крупных единиц (все еще округляется, 130 + 1 байт):
Вариационный выход:
источник
С
7775Это использует единицы СИ и берет опцию 1000.0kB для округления.
Расширенный код:
Выход
Варианты
Чтобы получить двоичные единицы, измените
1000
на1024
и добавьтеi
к строке формата, если есть множитель. Чтобы избежать 4-значного округления, сравнивайте>=.95
вместо>=1
. Чтобы принять большие единицы, расширьтеu
строку. Комбинируя все эти варианты, мы получаем:Вариант вывода
Тестовая программа
Передайте любое количество входных данных в качестве аргументов командной строки:
источник
Рубин, 91 байт
Я мог бы сделать немного лучше, если бы старался изо всех сил, но вот что у меня получилось.
источник
1024.
вместо1024.0
.Javascript ES5, 69 байт
Это использует другой способ достижения конечной цели, который отвечает @ edc65 .
На самом деле, это довольно близко к моему ответу PHP .
Просто запустите фрагмент стека или вставьте его на консоль.
источник
Рубин, 90 байт
источник