Thử thách và nguồn gốc
Trên Stack Overflow một câu hỏi phổ biến là: Làm thế nào để chuyển đổi kích thước byte thành định dạng có thể đọc được của con người trong java? Câu trả lời được bình chọn nhiều nhất có một phương pháp khá hay để làm điều này, nhưng đây là codegolf và chúng ta có thể làm tốt hơn, phải không?
Thách thức của bạn là viết một phương thức hoặc chương trình bao phủ số byte đã cho thành định dạng có thể đọc được của con người và in kết quả ra chuẩn theo ngôn ngữ của bạn. *
* Xem các quy tắc để làm rõ hơn!
Đầu vào
Đầu vào sẽ luôn là số byte dương với tối đa là (2 ^ 31) -1.
Đầu ra
Bạn có thể chọn nếu bạn thích Hệ thống đơn vị quốc tế hoặc ký hiệu nhị phân làm đầu ra (ký hiệu SI có thể giúp bạn tiết kiệm một số byte).
SI: B, kB, MB, GB
Binary: B, KiB, MiB, GiB
Lưu ý: Các đơn vị cao hơn GB hoặc GiB không thể nhìn thấy do phạm vi đầu vào bị hạn chế.
Ví dụ đầu ra
Hệ thống đơn vị quốc tế:
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
Nhị phân:
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
Quy tắc
- Các hàm dựng sẵn để định dạng byte không được phép!
- Đầu ra phải luôn ở cùng một tiêu chuẩn ký hiệu, bạn không được trộn lẫn SI hoặc nhị phân;
- Đầu ra phải luôn ở đơn vị lớn nhất có thể trong đó số kết quả vẫn cao hơn hoặc bằng một;
- Đầu ra phải luôn có một số thập phân, nhưng bạn có thể chọn in một số nguyên khi đầu ra kết quả tính bằng byte (B);
- Bạn có thể chọn nếu bạn muốn thêm khoảng trắng, tab hoặc không có gì giữa số và đơn vị;
- Đầu vào được nhận thông qua STDIN hoặc các tham số chức năng;
- Đầu ra được in ra bàn điều khiển hoặc được trả về dưới dạng chuỗi (hoặc thùng chứa ký tự tương tự);
- Đây là mã golf, vì vậy câu trả lời ngắn nhất sẽ thắng. Chúc vui vẻ!
Chỉnh sửa: Làm rõ hơn nữa
Một số số có hành vi làm tròn thú vị như số 999950. Hầu hết các triển khai mã sẽ trả về 1000.0 kB thay vì 1.0 MB. Tại sao? Bởi vì 999950/1000 ước tính thành 999.950, được làm tròn một cách hiệu quả thành 1000.0 khi sử dụng String.format trong Java (trong hầu hết các ngôn ngữ khác). Hench một số kiểm tra thêm là cần thiết để xử lý các trường hợp như thế này.
Đối với thử thách này cả hai kiểu, 1000.0 kB và 1.0 MB được chấp nhận, mặc dù kiểu cuối cùng được ưa thích.
Mã giả / mã kiểm tra 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)); }
999999và là 1000000gì? 160581Triển lãm làm tròn, vậy nó nên 1000.0kBvà 1.0MB?
kB(lưu ý chữ thường k)