เขียนอัลกอริทึมเพื่อตีความลำดับของตัวอักษรเป็นตัวเลขโรมัน (ดูกฎเลขโรมันด้านล่าง)
แต่ละตัวอักษรที่แตกต่างมีค่าทศนิยมอารบิกที่ตรงกันไม่เกิน แต่คุณไม่มีกุญแจไว้ล่วงหน้าการ{A=10, I=1, X=5, ... Z=1000000}
ตัดสินใจของคุณจะถูกตีความ
ท้าทาย
- อ่านอินพุตผ่าน
STDIN
หรือเทียบเท่าและเขียนเอาต์พุตผ่านSTDOUT
หรือเทียบเท่า - อินพุตที่ถูกต้องคือการรวมกันของตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กเช่นการจับคู่
\[a-zA-Z]+\
- อินพุตควรได้รับการตรวจสอบเพื่อดูว่าลำดับตัวอักษรสามารถตีความได้ว่าเป็นเลขโรมันที่ถูกต้องหรือไม่
- หากอินพุตผ่านการตรวจสอบผลลัพธ์ที่ถูกต้องควรเป็นการตีความเลขฐานสิบแบบอาหรับที่ต่ำที่สุดและคีย์ที่ใช้คือ
Aa
ถูกตีความว่า4 {a=5, A=1}
ไม่ใช่6 {A=5, a=1}
หรือ9 {a=10, a=1}
กฎเลขโรมัน
มีเพียงตัวอักษรที่เป็นตัวแทนของพลังสิบสามารถทำซ้ำได้สูงสุดสามครั้งติดต่อกันและรวมสี่ครั้งเช่น
II
III
XXXIX
หากวางจดหมายหนึ่งฉบับหรือมากกว่าหลังจากตัวอักษรที่มีมูลค่ามากกว่าให้เพิ่มจำนวนนั้น
AAaa => 22 {A=10, a=1} (20 + 2 = 22) bbAAaa => 222 {b=100, A=10, a=1} (200 + 20 + 2 = 222)
หากวางจดหมายไว้หน้าตัวอักษรอื่นที่มีมูลค่ามากกว่าให้ลบจำนวนนั้น
Aa => 4 {a=5, A=1} (5 – 1 = 4) AaA => 19 {A=10, a=1} (10 + 10 – 1 = 19) BbBaA => 194 {B=100, b=10, A=5, a=1} (100 + 100 - 10 + 5 - 1 = 194)
มีกฎหลายข้อสำหรับการลบจำนวนเงินออกจากตัวเลขโรมัน:
- ลบเฉพาะกำลังสิบเท่านั้น
1, 10, 100...
ไม่ใช่5, 50, 500...
- ไม่มีการลบคู่จึง
18
เขียนเป็นXVIII
ไม่ได้IIXX (10 + 10 - 1 - 1)
- อย่าลบตัวเลขจากตัวเลขที่มากกว่าสิบครั้ง
คุณสามารถลบ1
จาก5
หรือ10
แต่ไม่ได้จาก50, 100, 500...
- ลบเฉพาะกำลังสิบเท่านั้น
ตัวอย่าง
Input:
Aa
BAa
CCCXLVII
MMMCDVII
ABADDF
XVVX
FAASGSH
DXCCDA
AaBbcDEf
Output:
4 {a=5, A=1}
14 {B=10, a=5, A=1}
347 {C=100, L=50, X=10, V=5, I=1}
347 {M=100, D=50, C=10, V=5, I=1}
1921 {A=1000, B=100, D=10, F=1}
'XVVX' failed Roman numeral test
7191 {F=5000, A=1000, S=100, G=10, H=1}
'DXCCDA' failed Roman numeral test
4444 {a=5000, A=1000, b=500, B=100, D=50, c=10, f=5, E=1}
3
@IamOgbz สิ่งนี้ได้กลายเป็นคำถามที่ยอดเยี่ยม แต่ดึงดูดคำถามจำนวนมากในความคิดเห็นไปพร้อมกัน ตอนนี้คุณมีชื่อเสียงพอผมขอแนะนำให้Sandbox ฉันพบว่ามันมีประโยชน์มากสำหรับการรับคำถามก่อนโพสต์
—
trichoplax
CCCLXVII จะไม่ถูกตีความเป็น CCCXLVII ซึ่งให้ 347 หรือไม่
—
Skyler
@Skyler คุณพูดถูกจะอัปเดตทันที! ขอบคุณ
—
iamogbz
ฉันไม่เห็นข้อ จำกัด ใด ๆ เกี่ยวกับค่าที่ตัวอักษรแต่ละตัวมี (และแน่นอนคุณพูดถึง 20 ซึ่งไม่ใช่ค่าของเลขโรมันมาตรฐาน) คุณหมายถึงจะบอกว่าเลขจำนวนเต็มบวกใด ๆสามารถแทนด้วยเลขโรมันได้หรือไม่? ในกรณีนั้น
—
msh210
Aa
มีค่า 1 (A = 1, a = 2)
@ msh210 เป็นตัวอักษรที่สามารถตีความได้ว่าเป็นตัวเลขโรมันมันตามมาว่าค่าตัวอักษรแต่ละตัวสามารถเป็นพลังของ 10 หรือ 5 เท่าพลังของ 10 10. 20 ถูกกล่าวถึงเฉพาะในการรวมสองตัวเลขโรมัน (และเน้นที่ IXX = 19 ไม่ใช่การลบที่ถูกต้อง) หวังว่าจะล้างมันให้คุณ
—
iamogbz