चुनौती और मूल
स्टैक ओवरफ्लो पर एक लोकप्रिय प्रश्न है: बाइट का आकार जावा में मानव पठनीय प्रारूप में कैसे बदला जाए? सबसे अधिक वोट किए गए उत्तर के पास ऐसा करने के लिए एक अच्छा तरीका है, लेकिन यह कोडगोल्फ है और हम बेहतर कर सकते हैं, क्या हम नहीं कर सकते?
आपकी चुनौती एक ऐसी विधि या कार्यक्रम लिखना है जो दिए गए बाइट्स की संख्या को सही मानव पठनीय प्रारूप में शामिल करता है और परिणाम को आपकी भाषा के मानक से प्रिंट करता है। *
* अधिक स्पष्टीकरण के लिए नियम देखें!
इनपुट
इनपुट हमेशा अधिकतम (2 ^ 31) -1 के साथ बाइट्स की एक सकारात्मक संख्या होगी।
उत्पादन
आप चुन सकते हैं यदि आप अंतर्राष्ट्रीय प्रणाली इकाइयों या बाइनरी नोटेशन को आउटपुट के रूप में पसंद करते हैं (एसआई नोटेशन शायद आपको कुछ बाइट्स बचाता है)।
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
नियम
- बाइट स्वरूपण के लिए बिल्ड-फ़ंक्शंस की अनुमति नहीं है!
- आउटपुट हमेशा एक ही अंकन मानक में होना चाहिए, आप एसआई या बाइनरी मिश्रण नहीं कर सकते हैं;
- आउटपुट हमेशा सबसे बड़ी इकाई में होना चाहिए जहां परिणामी संख्या अभी भी अधिक या एक के बराबर है;
- आउटपुट में हमेशा एक दशमलव संख्या होनी चाहिए, लेकिन जब परिणाम आउटपुट बाइट्स (बी) में होता है, तो आप एक पूर्णांक संख्या प्रिंट करना चुन सकते हैं;
- आप चुन सकते हैं कि क्या आप संख्या और इकाई के बीच एक स्थान, टैब या कुछ भी जोड़ना चाहते हैं;
- इनपुट STDIN या फ़ंक्शन मापदंडों के माध्यम से प्राप्त होता है;
- आउटपुट कंसोल पर मुद्रित होता है या स्ट्रिंग (या समान वर्ण कंटेनर) के रूप में वापस आ जाता है;
- यह कोड गोल्फ है, इसलिए सबसे छोटा उत्तर जीतता है। मज़े करो!
संपादित करें: और भी अधिक स्पष्टीकरण
कुछ नंबरों में 999950 नंबर की तरह दिलचस्प गोल व्यवहार होता है। अधिकांश कोड कार्यान्वयन 1.0 एमबी के बजाय 1000.0 kB वापस आ जाएंगे। क्यों? क्योंकि 999950/1000 का मूल्यांकन 999.950 है जो जावा में String.format (अधिकांश अन्य भाषाओं में भी) का उपयोग करते समय प्रभावी रूप से 1000.0 तक गोल है। इस तरह के मामलों को संभालने के लिए कुछ अतिरिक्त जाँच की आवश्यकता होती है।
इस चुनौती के लिए दोनों शैलियों, 1000.0 केबी और 1.0 एमबी को स्वीकार किया जाता है, हालांकि अंतिम शैली को पसंद किया जाता है।
छद्म कोड / जावा परीक्षण कोड:
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(नोट लोअरकेस के)