Wyzwanie i pochodzenie
W przypadku przepełnienia stosu popularne pytanie brzmi: jak przekonwertować rozmiar bajtu na format czytelny dla ludzi w Javie? Najwyżej głosowana odpowiedź ma całkiem niezłą metodę na zrobienie tego, ale jest to codegolf i możemy to zrobić lepiej, prawda?
Wyzwanie polega na napisaniu metody lub programu, który pokryje podaną liczbę bajtów w poprawnym formacie czytelnym dla człowieka i wydrukuje wynik na standardowym z twojego języka. *
* Zobacz zasady, aby uzyskać więcej wyjaśnień!
Wejście
Dane wejściowe zawsze będą dodatnią liczbą bajtów z maksymalną wartością (2 ^ 31) -1.
Wynik
Możesz wybrać, czy wolisz Międzynarodowy System Jednostek, czy zapis binarny jako wynik (notacja SI prawdopodobnie oszczędza ci trochę bajtów).
SI: B, kB, MB, GB
Binary: B, KiB, MiB, GiB
Uwaga: Jednostki wyższe niż GB lub GiB nie są możliwe ze względu na ograniczony zakres wejściowy.
Przykładowe dane wyjściowe
Międzynarodowy system jednostek:
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
Dwójkowy:
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
Zasady
- Wbudowane funkcje formatowania bajtów są niedozwolone!
- Dane wyjściowe powinny zawsze mieć ten sam standard notacji, nie można mieszać SI ani binarnych;
- Wyjście powinno zawsze być w największej możliwej jednostce, gdzie wynikowa liczba jest wciąż wyższa lub równa jeden;
- Dane wyjściowe powinny zawsze mieć jedną liczbę dziesiętną, ale możesz wybrać wydrukowanie liczby całkowitej, jeśli wynik jest w bajtach (B);
- Możesz wybrać, czy chcesz dodać spację, tabulator lub nic między liczbą a jednostką;
- Wejście jest odbierane przez STDIN lub parametry funkcji;
- Dane wyjściowe są drukowane na konsoli lub zwracane jako ciąg znaków (lub podobny kontener znaków);
- To jest golf golfowy, więc wygrywa najkrótsza odpowiedź. Baw się dobrze!
Edycja: jeszcze więcej wyjaśnień
Niektóre liczby mają ciekawe zachowania zaokrąglania, takie jak liczba 999950. Większość implementacji kodu zwróciłoby 1000,0 kB zamiast 1,0 MB. Dlaczego? Ponieważ 999950/1000 ocenia na 999,950, który jest efektywnie zaokrąglany do 1000,0 przy użyciu String.format w Javie (także w większości innych języków). Konieczne są dodatkowe kontrole do obsługi takich przypadków.
W przypadku tego wyzwania akceptowane są oba style, 1000,0 kB i 1,0 MB, chociaż preferowany jest ostatni styl.
Pseudo kod / kod testowy 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)); }
999999i 1000000? 160581wykazuje zaokrąglenie, więc powinno być 1000.0kBi 1.0MB?
kB(zwróć uwagę na małą literę k)