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)); }
kB
(zwróć uwagę na małą literę k)999999
i1000000
?160581
wykazuje zaokrąglenie, więc powinno być1000.0kB
i1.0MB
?Odpowiedzi:
TI-BASIC, 44
Byłoby właściwym narzędziem do pracy, gdyby TI-BASIC miał w połowie przyzwoitą manipulację ciągiem (musiałem uciekać się do zastąpienia wykładnika liczby, wyświetlanej w notacji inżynierskiej, jednostką). Ponieważ tak jest, zaokrągla i generuje poprawnie, ale nie jest nawet bliski zwycięskich zgłoszeń. Może inny język kalkulatora mógłby wygrać?
Wprowadź formularz
[number]:[program name]
na ekranie głównym.Podane przypadki testowe:
źródło
CJam,
3527 bajtówDzięki Dennis za usunięcie 8 bajtów.
To nie jest drukowane
.0
w tłumaczu online . Ale jak zauważył Dennis , działa dobrze w interpreter Java.Wyjaśnienie
źródło
ri{_e-3XmO_i}g;o]," kMG"='B
(27 bajtów)1mO
. Ale ten kod nie działa dla1149999
...ri{_e-3_i}g;1mOo]," kMG"='B
powinien.999999
staje się1000kB
. Czytając to pytanie jeszcze raz, nie jestem pewien, czy1000kB
rzeczywiście byłoby w błędzie.Pyth,
2927 bajtówDemonstracja. Uprząż testowa.
Wyjaśnienie:
źródło
CJam, 28
Wypróbuj online
Uwaga: nie wyświetla on „.0” z tłumaczem online, ale robi to z oficjalnym tłumaczem Java .
Wyjaśnienie:
źródło
Python 2 - 76 bajtów
Korzysta z międzynarodowego systemu jednostek, po prostu dlatego, że łatwiej to zrobić w twojej głowie;)
źródło
f=1e3
POWERSHELL, 190
stosowanie
źródło
Haskell, 119
Niestety nie mogę znaleźć krótszej drogi w Haskell, aby zapewnić 1 miejsce po przecinku w liczbach zmiennoprzecinkowych, ale wysyłam wiadomość o potomności.
Stosowanie:
Wersja średnio mniej golfowa:
źródło
Java, 106 bajtów
To metoda, która pobiera liczbę i zwraca ciąg znaków.
źródło
1e3
dla1000
; możesz przekonwertować towhile()
na afor()
i użyć wolnych średników; i nie wiem, czy to działa, ponieważ wydaje się, że wyświetla wszystkie cyfry dziesiętne, a nie tylko jedną po przecinku.Python 2, 127 bajtów
Korzystanie z ISU. Fragment deklaruje funkcję „C”, która przyjmuje liczbę do przekonwertowania jako argument.
Niektóre kody testowe:
źródło
1e3
zamiast1000.0
JavaScript ( ES6 ), 71
Korzystanie z jednostek SI - funkcja zwracająca żądany ciąg.
Ten krótszy jest zgodny z zasadami, szczególnie 3 i 4
Niestety, w ten sposób wyniki nie pasują do przykładów.
Aby pasować do przykładów, tutaj jest dłuższy, specjalnie zaprojektowany dla małych liczb (82 bajtów)
Uruchom fragment kodu, aby przetestować (tylko EcmaScript 6, tylko Firefox)
Pokaż fragment kodu
źródło
Python, 61 bajtów
Zadzwoń jak
f(999)
. Zauważ, że1e3
jest to liczba zmiennoprzecinkowa, więc działa to zarówno z Python 2, jak i Python 3.źródło
PHP4.1,
6362 bajtyNie najlepsza gra w golfa, ale na pewno jest dość krótka.
Aby go użyć, uzyskaj dostęp przez POST / GET lub ustaw wartość w SESSION na klawiszu
B
.Pozostaw klucz
I
nieuzbrojony!źródło
SpecBAS - 100 bajtów
Korzystanie z konwencji ISU.
Uświadomiłem sobie, że mając zmienną ustawioną na 1e3 (która wymaga przypisania instrukcji LET), a następnie używając tej zmiennej przy opracowywaniu, faktycznie użyłem więcej znaków niż po prostu zakodowałem 1e3 tam, gdzie było to potrzebne.
źródło
Rubin, 128 bajtów
Zrobiłem to na dłuższą metę, jest całkiem źle.
Wynik
Edytować
Dodano TB dla dodatkowych 39 bajtów
Wynik:
źródło
Sed
-r
, 218 + 1Używam jednostek SI; Myślę, że wybór jednostek binarnych byłby odważną polityką . ;-)
Przeformatowany:
Wynik
Wariacje
Reguły wydają się sugerować zaokrąglanie do najbliższego, ale moim zdaniem zaokrąglanie w dół jest akceptowalną alternatywą i pozwala zaoszczędzić 123 bajty (więcej niż 50%):
Naturalne rozszerzenie do większych jednostek (wciąż zaokrąglające w dół, 130 + 1 bajtów):
Wariacja wyjściowa:
źródło
C,
7775Wykorzystuje jednostki SI i przyjmuje opcję 1000,0 kB do zaokrąglania.
Rozszerzony kod:
Wynik
Warianty
Aby uzyskać jednostki binarne, zmiany
1000
do1024
i dodaći
do tekstu formatu czy jest mnożnikiem. Aby uniknąć zaokrąglania 4 cyfr, porównaj>=.95
zamiast>=1
. Aby zaakceptować większe jednostki, przedłużu
ciąg. Łącząc wszystkie te opcje, otrzymujemy:Wariant wyjściowy
Program testowy
Przekaż dowolną liczbę danych wejściowych jako argumenty wiersza polecenia:
źródło
Ruby, 91 bajtów
Prawdopodobnie mógłbym zrobić trochę lepiej, gdybym spróbował mocniej, ale oto, co mam do tej pory.
źródło
1024.
zamiast1024.0
.JavaScript ES5, 69 bajtów
To używa innego sposobu, aby osiągnąć cel końcowy, którym jest @ edc65 .
W rzeczywistości jest to dość bliskie mojej odpowiedzi na PHP .
Po prostu uruchom fragment kodu lub wklej go na konsoli.
źródło
Rubinowy, 90 bajtów
źródło