Tantangan dan asal
Pada Stack Overflow, pertanyaan populer adalah: Bagaimana mengubah ukuran byte menjadi format yang dapat dibaca manusia di java? Jawaban terpilih memiliki metode yang cukup bagus untuk melakukan ini, tetapi ini adalah codegolf dan kita bisa melakukan yang lebih baik, bukan?
Tantangan Anda adalah menulis metode atau program yang mencakup jumlah byte yang diberikan ke format yang dapat dibaca manusia dan mencetak hasilnya dengan standar dari bahasa Anda. *
* Lihat aturan untuk klarifikasi lebih lanjut!
Memasukkan
Input akan selalu berupa jumlah positif byte dengan maksimum (2 ^ 31) -1.
Keluaran
Anda dapat memilih jika Anda lebih suka Sistem Satuan Internasional atau notasi biner sebagai output (notasi SI mungkin menghemat beberapa byte).
SI: B, kB, MB, GB
Binary: B, KiB, MiB, GiB
Catatan: Unit yang lebih tinggi dari GB atau GiB tidak dapat dilakukan karena rentang input yang dibatasi.
Contoh output
Sistem Satuan Internasional:
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
Biner:
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
Aturan
- Fungsi bawaan untuk pemformatan byte tidak diizinkan!
- Outputnya harus selalu dalam standar notasi yang sama, Anda tidak boleh mencampur SI atau biner;
- Output harus selalu dalam unit terbesar yang mungkin di mana jumlah yang dihasilkan masih lebih tinggi atau sama dengan satu;
- Output harus selalu memiliki satu angka desimal, tetapi Anda dapat memilih untuk mencetak angka integer ketika output yang dihasilkan dalam byte (B);
- Anda dapat memilih apakah Anda ingin menambahkan spasi, tab atau tidak sama sekali antara angka dan unit;
- Input diterima melalui STDIN atau parameter fungsi;
- Output dicetak ke konsol atau dikembalikan sebagai string (atau wadah karakter serupa);
- Ini kode golf, jadi jawaban tersingkat menang. Selamat bersenang-senang!
Sunting: Klarifikasi lebih lanjut
Beberapa angka memiliki perilaku pembulatan yang menarik seperti angka 999950. Sebagian besar implementasi kode akan mengembalikan 1000,0 kB, bukan 1,0 MB. Mengapa? Karena 999950/1000 bernilai 999.950 yang secara efektif dibulatkan menjadi 1000.0 saat menggunakan String.format di Java (dalam sebagian besar bahasa lain juga). Hench diperlukan beberapa pemeriksaan tambahan untuk menangani kasus-kasus seperti ini.
Untuk tantangan ini, kedua gaya, 1000.0 kB dan 1.0 MB diterima, meskipun gaya terakhir lebih disukai.
Kode semu / kode uji 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)); }
999999dan 1000000? 160581pameran pembulatan, sehingga harus itu 1000.0kBdan 1.0MB?
kB(perhatikan huruf kecil k)