Sfida e origine
Su Stack Overflow una domanda popolare è: come convertire le dimensioni dei byte in formato leggibile dall'uomo in Java? La risposta più votata ha un metodo abbastanza carino per farlo, ma questo è codegolf e possiamo fare di meglio, no?
La tua sfida è quella di scrivere un metodo o un programma che copra il numero dato di byte nel formato corretto leggibile dall'uomo e stampi il risultato allo standard fuori dalla tua lingua. *
* Vedi le regole per maggiori chiarimenti!
Ingresso
L'input sarà sempre un numero positivo di byte con un massimo di (2 ^ 31) -1.
Produzione
Puoi scegliere se preferisci il Sistema internazionale di unità o la notazione binaria come output (la notazione SI probabilmente ti salva alcuni byte).
SI: B, kB, MB, GB
Binary: B, KiB, MiB, GiB
Nota: unità più alte di GB o GiB non sono possibili a causa del campo di ingresso limitato.
Esempio di output
Sistema internazionale di unità:
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
Binario:
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
Regole
- Le funzioni integrate per la formattazione dei byte non sono consentite!
- L'output dovrebbe essere sempre nello stesso standard di notazione, non è possibile combinare SI o binario;
- L'output dovrebbe essere sempre nell'unità più grande possibile dove il numero risultante è ancora maggiore o uguale a uno;
- L'output deve sempre avere un numero decimale, ma è possibile scegliere di stampare un numero intero quando l'output risultante è in byte (B);
- Puoi scegliere se aggiungere uno spazio, una scheda o nulla tra il numero e l'unità;
- L'ingresso viene ricevuto tramite STDIN o parametri di funzione;
- L'output viene stampato sulla console o restituito come stringa (o contenitore di caratteri simili);
- Questo è il codice golf, quindi vince la risposta più breve. Divertiti!
Modifica: ancora più chiarimenti
Alcuni numeri hanno comportamenti di arrotondamento interessanti come il numero 999950. La maggior parte delle implementazioni di codice restituirebbe 1000,0 kB anziché 1,0 MB. Perché? Perché 999950/1000 restituisce 999.950, che viene effettivamente arrotondato a 1000.0 quando si utilizza String.format in Java (anche nella maggior parte delle altre lingue). Hench alcuni controlli extra sono necessari per gestire casi come questo.
Per questa sfida sono accettati entrambi gli stili, 1000,0 kB e 1,0 MB, sebbene sia preferito l'ultimo stile.
Pseudo codice / codice test 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)); }
999999e 1000000? 160581mostra arrotondamenti, quindi dovrebbe essere 1000.0kBe 1.0MB?
kB(notare il k minuscolo)