挑戦と起源
スタックオーバーフローに関する一般的な質問は、Javaでバイトサイズを人間が読める形式に変換する方法です。最もよく投票された答えにはこれを行うための非常に良い方法がありますが、これはcodegolfであり、私たちはもっとうまくやることができますか?
あなたの課題は、与えられたバイト数を人間が読める正しい形式に変換し、その結果を言語から標準に出力するメソッドまたはプログラムを作成することです。*
*詳細については、ルールを参照してください!
入力
入力は常に最大(2 ^ 31)-1の正のバイト数になります。
出力
出力として国際単位系またはバイナリ表記のどちらを使用するかを選択できます(SI表記はおそらくいくつかのバイトを節約します)。
SI: B, kB, MB, GB
Binary: B, KiB, MiB, GiB
注:入力範囲が制限されているため、GBまたはGiBよりも高いユニットは使用できません。
出力例
国際単位系:
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
バイナリ:
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
ルール
- バイト形式の組み込み関数は許可されていません!
- 出力は常に同じ表記標準である必要があります。SIまたはバイナリを混在させることはできません。
- 出力は常に、可能な限り最大の単位である必要があり、その場合、結果の数値は1以上です。
- 出力には常に1つの10進数が含まれている必要がありますが、結果の出力がバイト(B)である場合は整数を印刷することもできます。
- 数字と単位の間にスペース、タブを追加するか、何も追加しないかを選択できます。
- 入力は、STDINまたは関数パラメーターを介して受信されます。
- 出力はコンソールに出力されるか、文字列(または同様の文字コンテナー)として返されます。
- これはコードゴルフであるため、最短の回答が勝ちます。楽しんで!
編集:さらに明確化
一部の数値には、999950のような興味深い丸め動作があります。ほとんどのコード実装は、1.0 MBではなく1000.0 kBを返します。どうして?999950/1000は999.950に評価されるため、JavaでString.formatを使用する場合(他のほとんどの言語でも)、事実上1000.0に丸められます。このようなケースを処理するには、いくつかの追加チェックが必要です。
この課題では、両方のスタイル、1000.0 kBと1.0 MBが受け入れられますが、最後のスタイルが優先されます。
擬似コード/ 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)); }
999999およびに期待される出力は何1000000ですか?160581展示丸め、それがあるべき1000.0kBと1.0MB?
kB(小文字のkに注意してください)