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)); }
kB
(perhatikan huruf kecil k)999999
dan1000000
?160581
pameran pembulatan, sehingga harus itu1000.0kB
dan1.0MB
?Jawaban:
TI-BASIC, 44
Akan menjadi alat yang tepat untuk pekerjaan itu jika TI-BASIC memiliki setengah manipulasi string yang layak (saya harus resor untuk menimpa eksponen nomor, ditampilkan dalam notasi teknik, dengan unit). Seperti itu putaran dan keluaran dengan benar, tetapi bahkan tidak dekat dengan entri pemenang. Mungkin bahasa kalkulator lain bisa memenangkan yang ini?
Masukan dalam formulir
[number]:[program name]
di homescreen.Kasus uji yang diberikan:
sumber
CJam,
3527 byteTerima kasih Dennis untuk menghapus 8 byte.
Ini tidak mencetak
.0
dalam juru bahasa online . Tapi seperti yang ditunjukkan Dennis , ini berfungsi dengan baik dalam interpreter Java.Penjelasan
sumber
ri{_e-3XmO_i}g;o]," kMG"='B
(27 byte)1mO
. Tetapi kode ini tidak berfungsi untuk1149999
...ri{_e-3_i}g;1mOo]," kMG"='B
Sebaiknya.999999
menjadi1000kB
. Membaca pertanyaan itu lagi, saya tidak yakin apakah1000kB
benar-benar salah.Pyth,
2927 byteDemonstrasi. Uji Harness.
Penjelasan:
sumber
CJam, 28
Cobalah online
Catatan: ini tidak menunjukkan ".0" dengan penerjemah online, tetapi melakukannya dengan pejabat penerjemah java .
Penjelasan:
sumber
Python 2 - 76 byte
Menggunakan Sistem Unit Internasional, hanya karena lebih mudah dilakukan di kepala Anda;)
sumber
f=1e3
POWERSHELL, 190
pemakaian
sumber
Haskell, 119
Sayangnya saya tidak dapat menemukan cara yang lebih pendek di Haskell untuk memastikan 1 desimal di mengapung, tapi saya memposting untuk anak cucu.
Pemakaian:
Versi yang tidak terlalu golf:
sumber
Java, 106 byte
Ini adalah metode yang mengambil angka dan mengembalikan string.
sumber
1e3
untuk1000
; Anda dapat mengonversinyawhile()
menjadi afor()
dan menggunakan titik koma gratis; dan saya tidak tahu apakah ini berhasil karena tampaknya menampilkan semua angka desimal, bukan hanya satu yang melewati tempat desimal.Python 2, 127 byte
Menggunakan ISU. Cuplikan menyatakan fungsi 'C' yang mengambil nomor untuk dikonversi sebagai argumen.
Beberapa kode uji:
sumber
1e3
sebagai gantinya1000.0
JavaScript ( ES6 ), 71
Menggunakan unit SI - Fungsi mengembalikan string yang diminta.
Yang lebih pendek ini mengikuti aturan, terutama 3 dan 4
Sayangnya, dengan cara ini, hasilnya tidak cocok dengan contoh.
Untuk mencocokkan contoh, di sini adalah yang lebih panjang, casing khusus untuk jumlah kecil (82 byte)
Jalankan cuplikan untuk menguji (menjadi EcmaScript 6, hanya Firefox)
Tampilkan cuplikan kode
sumber
Python, 61 byte
Sebut seperti
f(999)
. Perhatikan bahwa itu1e3
adalah float, jadi ini berfungsi baik dengan Python 2 dan Python 3.sumber
PHP4.1,
6362 byteBukan golf terbaik, tapi tentu saja cukup pendek.
Untuk menggunakannya, akses melalui POST / GET atau tetapkan nilai dalam SESI, pada tombol
B
.Biarkan kunci
I
tidak disetel!sumber
SpecBAS - 100 byte
Menggunakan konvensi ISU.
Saya menyadari bahwa memiliki set variabel ke 1e3 (yang membutuhkan pernyataan LET untuk menetapkannya), dan kemudian menggunakan variabel itu dalam bekerja, benar-benar menggunakan lebih banyak karakter daripada hanya hardcoding 1e3 di mana itu diperlukan.
sumber
Ruby, 128 byte
Saya melakukannya dengan cara yang lama, ini sangat buruk.
Keluaran
Edit
Menambahkan TB untuk 39 byte tambahan
Keluaran:
sumber
Sed
-r
, 218 + 1Saya menggunakan unit SI; Saya pikir bahwa memilih unit biner akan menjadi kebijakan yang berani . ;-)
Dipformat ulang:
Keluaran
Variasi
Aturan tampaknya menyiratkan round-to-terdekat, tetapi untuk tampilan manusia, saya percaya pembulatan ke bawah adalah alternatif yang dapat diterima, dan menghemat 123 byte (lebih baik dari 50%):
Ekstensi alami ke unit yang lebih besar (masih dibulatkan, 130 + 1 byte):
Output variasi:
sumber
C,
7775Ini menggunakan unit SI dan mengambil opsi 1000.0kB untuk pembulatan.
Kode yang diperluas:
Keluaran
Varian
Untuk mendapatkan unit biner, ubah
1000
menjadi1024
, dan tambahkani
ke string format jika ada pengganda. Untuk menghindari 4-digit pembulatan, membandingkan>=.95
bukan>=1
. Untuk menerima unit yang lebih besar, perpanjangu
string. Menggabungkan semua opsi ini, kita dapatkan:Output varian
Program uji
Lewati sejumlah input sebagai argumen baris perintah:
sumber
Ruby, 91 byte
Saya mungkin bisa melakukan sedikit lebih baik jika saya berusaha lebih keras tetapi inilah yang saya dapatkan sejauh ini.
sumber
1024.
sebagai ganti1024.0
.Javascript ES5, 69 byte
Ini menggunakan cara berbeda untuk mencapai tujuan akhir yang dijawab @ edc65 .
Sebenarnya, ini cukup dekat dengan jawaban PHP saya .
Cukup jalankan snippet stack atau rekatkan ini di konsol Anda.
sumber
Ruby, 90 byte
sumber