চ্যালেঞ্জ এবং উত্স
স্ট্যাক ওভারফ্লোতে একটি জনপ্রিয় প্রশ্ন হ'ল জাভাতে কীভাবে বাইট আকারকে মানব পাঠযোগ্য বিন্যাসে রূপান্তর করতে? সর্বাধিক ভোট দেওয়া উত্তরের কাছে এটি করার জন্য একটি দুর্দান্ত পদ্ধতি রয়েছে তবে এটি কোডগল্ফ এবং আমরা আরও ভাল করতে পারি, তাই না?
আপনার চ্যালেঞ্জটি হ'ল এমন একটি পদ্ধতি বা প্রোগ্রাম লিখুন যা প্রদত্ত সংখ্যক বাইটকে সঠিক মানব পাঠযোগ্য বিন্যাসে কভার করে এবং ফলাফলটি আপনার ভাষার বাইরে মানকে প্রিন্ট করে *
* আরও স্পষ্টতার জন্য বিধিগুলি দেখুন!
ইনপুট
ইনপুট সর্বদা সর্বাধিক (2 ^ 31) -1 সহ একটি ধনাত্মক সংখ্যক বাইট হবে।
আউটপুট
আপনি যদি আন্তর্জাতিক ইউনিটগুলির সিস্টেম বা বাইনারি স্বরলিপিটিকে আউটপুট হিসাবে পছন্দ করেন তবে আপনি চয়ন করতে পারেন (এসআই স্বরলিপি সম্ভবত আপনাকে কিছু বাইট সংরক্ষণ করে)।
SI: B, kB, MB, GB
Binary: B, KiB, MiB, 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
বিধি
- বাইট ফর্ম্যাটিংয়ের জন্য বিল্ড-ইন ফাংশনগুলি অনুমোদিত নয়!
- আউটপুট সর্বদা একই স্বরলিপি মান হিসাবে হওয়া উচিত, আপনি এসআই বা বাইনারি মিশ্রিত করতে পারবেন না;
- ফলাফল সর্বদা বৃহত্তর ইউনিটে হওয়া উচিত যেখানে ফলস্বরূপ সংখ্যাটি এখনও একের বেশি বা সমান;
- আউটপুটটিতে সর্বদা একটি দশমিক সংখ্যা থাকা উচিত তবে ফলস্বরূপ আউটপুট বাইটস (বি) এ থাকা অবস্থায় আপনি একটি পূর্ণসংখ্যার সংখ্যা মুদ্রণ করতে বেছে নিতে পারেন;
- আপনি নম্বর এবং ইউনিটের মধ্যে কোনও স্থান, ট্যাব বা কিছুই যুক্ত করতে চান কিনা তা চয়ন করতে পারেন;
- এসটিডিআইএন বা ফাংশন পরামিতিগুলির মাধ্যমে ইনপুট প্রাপ্ত হয়;
- আউটপুট কনসোলে মুদ্রিত হয় বা স্ট্রিং (বা অনুরূপ অক্ষরের ধারক) হিসাবে ফিরে আসে;
- এটি কোড গল্ফ, তাই সংক্ষিপ্ত উত্তরটি জেতে। আনন্দ কর!
সম্পাদনা: আরও স্পষ্টতা
কিছু সংখ্যার 999950 নম্বরের মতো আকর্ষণীয় গোলাকার আচরণ রয়েছে Most বেশিরভাগ কোড বাস্তবায়ন 1.0 এমবি এর পরিবর্তে 1000.0 কেবি ফিরে আসবে। কেন? কারণ 999950/1000 999.950 এ মূল্যায়ন করে যা জাভাতে স্ট্রিং.ফর্ম্যাট ব্যবহার করার সময় কার্যকরভাবে 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(লোকেস কে কে নোট করুন)