Mục tiêu:
Viết hàm lấy một số làm đầu vào và trả về một số La Mã tay ngắn cho số đó làm đầu ra.
Biểu tượng số La Mã:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
Để biết ví dụ về ý tôi muốn nói khi tôi nói "chữ số La Mã tay ngắn", hãy xem xét việc tìm một chữ số La Mã để đại diện cho năm 1983, vì đó là năm tôi được sinh ra. Một lựa chọn là làm điều này theo cách thông thường (10 chữ cái):
1983 = MCMLXXXIII = (1000 - 100 + 1000 + 50 + 30 + 3)
Tùy chọn khác là thực hiện theo cách ngắn gọn (6 ký tự):
1983 = MXVIIM = (1000 - (10 + 10) + 1000 + 3)
Bạn có biết nó có nghĩa là gì không?!?!!?? Nếu tôi là người La Mã, tôi có thể đã lưu 4 ký tự mỗi lần tôi viết ngày sinh của mình! Woot Woot !!
Tuy nhiên, trước khi tôi vượt lên chính mình trong sự phấn khích, tôi có một câu hỏi để viết, vì vậy tôi có lẽ nên xác định các quy tắc số La Mã tay ngắn để tất cả chúng ta đều trên cùng một trang:
Quy tắc số La Mã tay ngắn:
- Luôn xem xét các biểu tượng từ trái sang phải cho đến khi không còn ký tự nào nữa.
- Nếu không có biểu tượng có giá trị cao hơn ở bên phải biểu tượng hiện tại:
- Thêm giá trị của biểu tượng hiện tại vào tổng số đang chạy của chữ số La Mã này.
- Nếu có các biểu tượng có giá trị cao hơn ở bên phải của biểu tượng bạn đang xem xét:
- Xác định vị trí biểu tượng có giá trị cao nhất bên phải ở bên phải biểu tượng hiện tại
- Hãy xem tất cả các ký tự cho đến ký hiệu đó là một chữ số La Mã
- Tính giá trị của chữ số La Mã đó bằng các bước sau
- Trừ giá trị của chữ số La Mã đó khỏi tổng số của chữ số La Mã này.
- Di chuyển đến biểu tượng tiếp theo sau nhóm bạn vừa xem xét
- Mỗi chữ số La Mã phải có ít nhất 1 ký hiệu trong đó.
- Đó là nó! Bất cứ điều gì theo các quy tắc này sẽ được chấp nhận!
Ví dụ:
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 :)
Quy tắc câu hỏi:
Tạo một hàm lấy một số duy nhất làm đầu vào và trả về một số La Mã cho số đó làm đầu ra bằng các quy tắc trên. Tính toán mãGolfScore của hàm này.
example input: 2011 example possible output: MMXI another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
Sử dụng chức năng của bạn từ quy tắc 1, tạo các chữ số La Mã trong khoảng -1000 (đúng, NEGECT một nghìn) và 3000. Sau đó, tổng hợp độ dài ký tự của các chữ số La Mã này để lấy TotalCharacterCount của bạn . Đây là một số mã giả để làm rõ:
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
FinalScore = codeGolfScore + TotalCharacterCount
- Chiến thắng chung cuộc thấp nhất !
Lưu ý: Vì tổng số lượng vi khuẩn sẽ ở mức mười nghìn +, thuật toán độ dài ký tự phải là ưu tiên hàng đầu. Điểm số golf-golf chỉ là điểm phá vỡ trong trường hợp nhiều người dùng tìm thấy thuật toán tối ưu hoặc thuật toán gần nhau.
Chúc may mắn và vui chơi tại lễ kỷ niệm MMXII của bạn vào tối mai !!!
""
phép bằng 0 hoặc chúng ta phải sử dụng VVX
hoặc một cái gì đó tương đương?
IXV = -(-1 + 10) + 5 = -4
(chiến thắng ngoài cùng bên phải), hay IXV = -1 + 10 + 5 = 14
(chiến thắng có giá trị cao nhất)?
DDDDM
đứng cho-1000
?