วันหนึ่งครูสอนเคมีของฉันอธิบายให้เราฟังเกี่ยวกับสัญกรณ์วิทยาศาสตร์ (ใช้จำนวนน้อยและคูณด้วยพลังสิบเพื่อแสดงจำนวนมากได้ง่ายขึ้น) ซึ่งทำให้ฉันกลับมาเมื่อสองสามปีก่อนเมื่อฉันเรียนรู้ หลังจากเรียนรู้พื้นฐานแล้วเราได้ทำคำถามคณิตศาสตร์โดยทั่วไปซึ่งบางคำถามมีลักษณะดังต่อไปนี้:
แสดงสิ่งต่อไปนี้ในสัญกรณ์วิทยาศาสตร์:
a) 50000000
b) 120000000000000
c) 90000000000000000000000000000000000000
d) pi ^ e ^ i ^ j ^ k ^ std :: vector
...
z) 200
...
และฉันก็คิดว่า "อะไรเราได้รับการบอกว่ามีการใช้สัญลักษณ์ทางวิทยาศาสตร์เพื่อการเขียนที่มีประสิทธิภาพมากขึ้น แต่บางกรณีก็ไม่ได้มีประสิทธิภาพมากขึ้น!"
พิจารณาจากจำนวน
300
และการเป็นตัวแทนในสัญกรณ์ทางวิทยาศาสตร์:
3x10^2
อะไรที่รุ่นที่มีการจดบันทึกทางวิทยาศาสตร์ใช้พื้นที่มากขึ้นจริงหรือ เราไม่สามารถทำอย่างนั้นตอนนี้เราสามารถ? (พื้นที่หน้าจอมีค่า)
เราสามารถตรวจสอบตัวเองว่ามีพื้นที่มากขึ้นที่มีประสิทธิภาพในการเขียนตัวเลขในสัญกรณ์ทางวิทยาศาสตร์หรือไม่หรือ ...
งาน
โปรแกรมหรือฟังก์ชั่นของคุณควรป้อนข้อมูลให้เป็นขนาดบวกn
ตามอำเภอใจเพียงครั้งเดียว(ขึ้นอยู่กับภาษาที่คุณรองรับ) และส่งออกตัวเลขที่ได้รับการจดบันทึกทางวิทยาศาสตร์
อย่างไรก็ตามหากหมายเลขดั้งเดิมn
หลังจากลบศูนย์ต่อท้ายและจุดทศนิยมทศนิยมต่อท้ายจะมีจำนวนอักขระน้อยกว่าหรือเท่ากันเพื่อแสดงมากกว่ารุ่นที่มีการระบุทางวิทยาศาสตร์คุณต้องส่งออกหมายเลขเดิมn
แทน
รหัสของคุณจะต้องสั้นที่สุดเท่าที่จะเป็นไปได้เนื่องจากผลลัพธ์จะต้องสั้นที่สุดเท่าที่จะเป็นไปได้
ข้อมูลจำเพาะ
สัญกรณ์ทางวิทยาศาสตร์ที่มีประสิทธิภาพถูกกำหนดไว้ดังนี้:
bx10^e
b
คือจำนวนอินพุทที่ถูกหารด้วยกำลัง 10 อย่าง1 <= b < 10
เหมาะสม ตัวเลขนี้จะต้องลบศูนย์ทั้งหมด (และจุดทศนิยมถ้าจำเป็น) ออก แต่ต้องมีความแม่นยำของตัวเลขเดิม (สูงสุดถึงขีด จำกัด จุดทศนิยมในภาษาของคุณแน่นอน) คือ90000
กลายเป็น9
, 13.500
กลายเป็น1.35
, 0.000675
กลายเป็น6.75
ฯลฯ ถ้าจำนวนนี้จบลงด้วยการที่มีตำแหน่งทศนิยมมากกว่าภาษาของคุณสามารถจัดการกับมันควรจะปัดเศษเป็นจำนวนสูงสุดของตำแหน่งทศนิยม
e
คือเลขชี้กำลังซึ่งมีการยกระดับสิบเช่นนั้นn = b x 10^e
(โปรดจำไว้ว่าจำนวนนี้ต้องเป็นค่าลบหากn
น้อยกว่า 1) ตัวเลขนี้ไม่ควรมีศูนย์ใด ๆ ต่อท้ายหรือทศนิยม (ส่วนใหญ่เป็นเพราะถ้าไม่ใช่จำนวนเต็มบางอย่างผิดปกติ ... )
ตัวละครx10^
จะต้องยังคงเป็นอยู่ในสตริงระหว่างและb
e
กรณีทดสอบ
Input -> output
1 -> 1
20 -> 20
3000000 -> 3x10^6
400000 -> 400000
0.008093 -> 0.008093
0.007835000000000 -> 0.007835
0.000003000000 -> 3x10^-6
0.00000065 -> 6.5x10^-7
0 -> 0
เกณฑ์การให้คะแนน
นี่คือcode-golfดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ
กฎและคำชี้แจงอื่น ๆ
- ศูนย์ต่อท้าย (และ / หรือต่อท้ายทศนิยมตำแหน่ง)
n
จะไม่ได้นับจำนวนตัวอักษรของจำนวนการป้อนข้อมูลเดิม พึงระลึกไว้เสมอว่าสำหรับกรณีเช่นกรณีทดสอบ 6 - คุณอาจสมมติว่าถ้าหมายเลขอินพุตน้อยกว่า 1 มันจะเริ่มต้นด้วย 0 แทนตัวเลขหลัก (เช่นในกรณีทดสอบ 5-8)
- หมายเลขอินพุตจะไม่เป็นค่าลบ
- บิวด์อินที่ทำให้ความท้าทายนี้ไม่อนุญาตให้มีช่องโหว่เล็กน้อยและมาตรฐาน
- บรรทัดใหม่ต่อท้ายในผลลัพธ์คือตกลง
แก้ไข
ขอบคุณ user81655 สำหรับการชี้กรณีทดสอบ 7 และ 8 มีพลังไม่ถูกต้องสิบ ตอนนี้ฉันได้แก้ไขแล้วเพื่อให้แน่ใจว่ารหัสของคุณประเมินได้อย่างถูกต้อง
e
: 9000 -> 9e3
(เกือบ9,000 !)
x10^
ซึ่งดูเหมือนว่าจะอยู่กับ และมันจะเป็นการทำงานที่ค่อนข้างยุติธรรมสำหรับคำถามซึ่งฉันไม่คิดว่าเหมาะสมในขณะนี้ที่โพสต์
pi^e^i^j^k^std::vector
จะเป็นอย่างไร