ความท้าทายและแหล่งกำเนิด
ใน Stack Overflow คำถามยอดนิยมคือ: วิธีการแปลงขนาดไบต์เป็นรูปแบบที่มนุษย์อ่านได้ใน 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
กฎระเบียบ
- ไม่อนุญาตให้ใช้ฟังก์ชั่น Build-in สำหรับการจัดรูปแบบไบต์!
- ผลลัพธ์ควรอยู่ในมาตรฐานสัญกรณ์เดียวกันคุณไม่สามารถผสม SI หรือไบนารีได้
- เอาต์พุตควรอยู่ในหน่วยที่ใหญ่ที่สุดเท่าที่เป็นไปได้โดยที่จำนวนผลลัพธ์ยังคงสูงกว่าหรือเท่ากับหนึ่ง
- ผลลัพธ์ควรมีเลขทศนิยมหนึ่งตัวเสมอ แต่คุณอาจเลือกที่จะพิมพ์ตัวเลขจำนวนเต็มเมื่อผลลัพธ์ที่ได้นั้นเป็นไบต์ (B)
- คุณสามารถเลือกได้ว่าต้องการเพิ่มช่องว่างแท็บหรืออะไรระหว่างตัวเลขกับหน่วย
- รับอินพุตผ่าน STDIN หรือพารามิเตอร์ฟังก์ชัน
- เอาต์พุตถูกพิมพ์ไปยังคอนโซลหรือส่งคืนเป็นสตริง (หรือคอนเทนเนอร์อักขระที่คล้ายกัน);
- นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดชนะ มีความสุข!
แก้ไข: ชี้แจงเพิ่มเติม
ตัวเลขบางตัวมีพฤติกรรมการปัดเศษที่น่าสนใจเช่นหมายเลข 999950 การใช้รหัสส่วนใหญ่จะส่งคืน 1,000.0 kB แทน 1.0 MB ทำไม? เนื่องจาก 999950/1000 ประเมินเป็น 999.950 ซึ่งจะถูกปัดเศษเป็น 1,000.0 อย่างมีประสิทธิภาพเมื่อใช้ String.format ใน Java (ในภาษาอื่น ๆ ส่วนใหญ่เช่นกัน) Hench จำเป็นต้องมีการตรวจสอบเพิ่มเติมเพื่อจัดการกับกรณีเช่นนี้
สำหรับความท้าทายนี้ทั้งสองสไตล์ยอมรับ 1,000.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 ตัวพิมพ์เล็ก)