เป้าหมาย:
เขียนฟังก์ชันที่ใช้ตัวเลขเป็นอินพุตและส่งกลับตัวเลขโรมันแบบสั้นสำหรับหมายเลขนั้นเป็นเอาต์พุต
สัญลักษณ์ตัวเลขโรมัน:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
สำหรับตัวอย่างของสิ่งที่ฉันหมายถึงเมื่อฉันพูดว่า "เลขโรมันสั้น ๆ " ลองพิจารณาหาตัวเลขโรมันเพื่อเป็นตัวแทนปี 1983 เพราะนั่นคือปีที่ฉันเกิด ทางเลือกหนึ่งคือทำตามวิธีปกติ (10 ตัวอักษร):
1983 = MCMLXXXIII = (1,000 - 100 + 1000 + 50 + 30 + 3)
อีกทางเลือกหนึ่งคือทำด้วยวิธีทางลัด (6 ตัวอักษร):
1983 = MXVIIM = (1,000 - (10 + 10) + 1000 + 3)
คุณรู้ไหมว่าสิ่งนี้หมายความว่าอย่างไร!? !!? ?? ถ้าฉันเป็นโรมันฉันสามารถบันทึกตัวละครได้ 4 ตัวทุกครั้งที่ฉันเขียนวันเกิด! วุ้ยวุ้ย !!
อย่างไรก็ตามก่อนที่ฉันจะก้าวไปข้างหน้าด้วยความตื่นเต้นฉันมีคำถามที่ต้องเขียนดังนั้นฉันจึงควรกำหนดกฎเลขโรมันสั้น ๆ เพื่อให้เราทุกคนอยู่ในหน้าเดียวกัน:
กฎเลขโรมันระยะสั้น:
- พิจารณาสัญลักษณ์จากซ้ายไปขวาเสมอจนกว่าจะไม่มีตัวอักษรอื่น ๆ ให้พิจารณาอีก
- หากไม่มีสัญลักษณ์ที่มีมูลค่าสูงกว่าทางด้านขวาของสัญลักษณ์ปัจจุบัน:
- เพิ่มค่าของสัญลักษณ์ปัจจุบันให้กับผลรวมการทำงานของตัวเลขโรมันนี้
- หากมีสัญลักษณ์ที่มีมูลค่าสูงกว่าทางด้านขวาของสัญลักษณ์ที่คุณกำลังพิจารณา:
- ค้นหาสัญลักษณ์ที่มีค่าสูงสุดขวาสุดทางด้านขวาของสัญลักษณ์ปัจจุบัน
- พิจารณาตัวละครทุกตัวจนถึงสัญลักษณ์นั้นเป็นเลขโรมันตัวเดียว
- คำนวณค่าของเลขโรมันนั้นโดยใช้ขั้นตอนเหล่านี้
- ลบค่าของเลขโรมันนั้นจากผลรวมสะสมของเลขโรมันนี้
- ย้ายไปที่สัญลักษณ์ถัดไปหลังจากกลุ่มที่คุณเพิ่งพิจารณา
- ตัวเลขโรมันแต่ละตัวจะต้องมีสัญลักษณ์อย่างน้อย 1 ตัว
- แค่นั้นแหละ! ทุกสิ่งที่ปฏิบัติตามกฎเหล่านี้จะได้รับการยอมรับ!
ตัวอย่าง:
IIIIV = (-(1+1+1+1)+5) = 1 //Don't ask me why you'd want to do this!
VVX = (-(5+5) + 10) = 0 //Who said you couldn't represent 0 with roman numerals?!!?
VVXM = (-(-(5+5) + 10) + 1000) = 1000 //Again...don't ask me why you'd want to do this!
MXIIXMI = (1000-(10-(1+1)+10)+1000+1) = 1983 //Ahhh...such a great year :)
กฎคำถาม:
สร้างฟังก์ชั่นที่รับหมายเลขเดียวเป็นอินพุตและส่งกลับตัวเลขโรมันสำหรับตัวเลขนั้นเป็นเอาต์พุตโดยใช้กฎด้านบน คำนวณcodeGolfScoreของฟังก์ชั่นนี้
example input: 2011 example possible output: MMXI another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
การใช้ฟังก์ชั่นของคุณจากการปกครองที่ 1 สร้างเลขโรมันระหว่าง -1000 (ที่เหมาะสมลบหนึ่งหมื่นบาทถ้วน) และ 3000 แล้วสรุปความยาวลักษณะของเลขโรมันเหล่านี้จะได้รับของคุณtotalCharacterCount นี่คือรหัสเทียมบางส่วนเพื่อชี้แจง:
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
finalScore = codeGolfScore + totalCharacterCount
- รอบชิงชนะเลิศต่ำสุดคะแนนชนะ!
หมายเหตุ: เนื่องจากจำนวน totalCharacter จะอยู่ในหลักหมื่น + อัลกอริทึมที่มีความยาวอักขระควรเป็นลำดับความสำคัญสูงสุด คะแนนการเล่นกอล์ฟเป็นเพียงตัวผูกไท่ในกรณีที่ผู้ใช้หลายคนค้นหาอัลกอริธึมหรืออัลกอริธึมที่เหมาะสมที่สุดซึ่งอยู่ใกล้กัน
ขอให้โชคดีและสนุกกับการฉลอง MMXII ของคุณในคืนพรุ่งนี้ !!!
""
อนุญาตให้เป็นศูนย์หรือเราต้องใช้VVX
หรืออะไรที่เทียบเท่า?
IXV = -(-1 + 10) + 5 = -4
(Right Right ชนะ) หรือIXV = -1 + 10 + 5 = 14
(Win-Values)
DDDDM
ยืนหยัดเพื่อ-1000
?