Meydan okuma ve köken
Stack Overflow'da popüler bir soru şudur: Bayt boyutunu java'da okunabilir biçime nasıl dönüştürebilirim? En çok oylanan cevabın bunu yapmak için oldukça güzel bir yöntemi var, ancak bu kodgolf ve daha iyisini yapabiliriz, değil mi?
Zorluğunuz, verilen bayt sayısını doğru okunabilir formata dönüştüren ve sonucu kendi dilinizden standart olarak basan bir yöntem veya program yazmaktır. *
* Daha fazla açıklama için kurallara bakınız!
Giriş
Giriş her zaman en fazla (2 ^ 31) -1 ile pozitif bir bayt sayısı olacaktır.
Çıktı
Çıktı olarak Uluslararası Birimler Sistemini mi yoksa ikili gösterimi mi tercih edeceğinizi seçebilirsiniz (SI notasyonu muhtemelen size bazı bayt kazandırır).
SI: B, kB, MB, GB
Binary: B, KiB, MiB, GiB
Not: Kısıtlı giriş aralığı nedeniyle GB veya GiB'den daha yüksek birimler mümkün değildir.
Örnek çıktı
Uluslararası Birimler Sistemi:
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
İkili:
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
kurallar
- Bayt biçimlendirmesi için yerleşik işlevlere izin verilmez!
- Çıktı her zaman aynı gösterim standardında olmalıdır, SI veya ikili karıştırılamaz;
- Çıktı her zaman elde edilen sayı hala bir veya daha yüksek olduğunda mümkün olan en büyük birimde olmalıdır;
- Çıktının her zaman bir ondalık sayı olması gerekir, ancak sonuçta elde edilen çıktı bayt (B) cinsindeyken bir tam sayı yazdırmayı seçebilirsiniz;
- Sayı ve birim arasına boşluk, sekme veya hiçbir şey eklemek isteyip istemediğinizi seçebilirsiniz;
- Giriş STDIN veya fonksiyon parametreleri aracılığıyla alınır;
- Çıktı konsola yazdırılır veya dize (veya benzer karakter kabı) olarak döndürülür;
- Bu kod golf, bu yüzden en kısa cevap kazanır. İyi eğlenceler!
Düzenleme: Daha fazla açıklama
Bazı sayılar 999950 sayısı gibi ilginç yuvarlama davranışlarına sahiptir. Çoğu kod uygulaması 1,0 MB yerine 1000,0 kB döndürür. Neden? Çünkü 999950/1000, Java'da String.format kullanırken (diğer birçok dilde) etkili bir şekilde 1000.0'a yuvarlanan 999.950 olarak değerlendirilir. Hench, bu gibi davaları ele almak için bazı ekstra kontrollere ihtiyaç vardır.
Bu meydan okuma için her iki stil de 1000.0 kB ve 1.0 MB kabul edilir, ancak son stil tercih edilir.
Sahte kod / java test kodu:
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
ve 1000000
? 160581
yuvarlama sergiler, öyle olmalı 1000.0kB
ve 1.0MB
?
kB
(küçük harf k'ye dikkat edin)