Amaç:
Girdi olarak sayı alan ve bu sayı için çıktı olarak kısa el ile romen rakamı döndüren bir işlev yazın.
Romen Rakamıyla Semboller:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
"Kısa-el romen rakamları" derken ne demek istediğime bir örnek olarak, 1983'ü temsil edecek bir romen rakamı bulmayı düşünelim, çünkü bu benim doğduğum yıl. Bir seçenek bunu normal şekilde yapmaktır (10 harf):
1983 = MCMLXXXIII = (1000 - 100 + 1000 + 50 + 30 + 3)
Diğer seçenek ise kısa yoldan yapmaktır (6 karakter):
1983 = MXVIIM = (1000 - (10 + 10) + 1000 + 3)
Bunun ne anlama geldiğini biliyor musun?!?!!?? Roman olsaydım, her defasında 4 karakter kaydedebilirdim, doğum günümü yazdım! Woot Woot!
Ancak, heyecanlanmadan önce kendime gelmeden önce yazmam gereken bir sorum var, bu yüzden kısa-roman rakamsal kurallarını tanımlamalıyım, böylece hepimiz aynı sayfadayız:
Kısa El Roman Rakam Kuralları:
- Dikkate alınacak başka karakter kalmayıncaya kadar sembolleri daima soldan sağa düşünün.
- Geçerli sembolün sağında daha fazla değerli sembol yoksa:
- Geçerli sembolün değerini bu romen rakamının toplamı ekleyin.
- Sembolün sağında daha değerli semboller varsa, göz önünde bulundurduğunuz:
- Geçerli sembolün sağındaki en yüksek değerli simgeyi bulun
- Bu sembole kadar olan tüm karakterleri tek bir rakam olarak kabul edin.
- Bu adımları kullanarak bu romen rakamının değerini hesaplayın
- Bu rakamın değerini, bu rakamın toplamından çıkarın.
- Az önce düşündüğünüz grubun ardından bir sonraki sembole geçin
- Her Romen rakamının içinde en az 1 sembol olmalıdır.
- Bu kadar! Bu kurallara uyan her şey kabul edilir!
Örnekler:
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 :)
Soru Kuralları:
Tek bir sayıyı girdi olarak alan ve bu sayı için yukarıdaki kuralları kullanarak çıktı olarak romen rakamı döndüren bir işlev yapın. Bu fonksiyonun codeGolfScore'u hesaplayın .
example input: 2011 example possible output: MMXI another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
Kural 1'deki fonksiyonunuzu kullanarak, -1000 (doğru, NEGATİF bin) ile 3000 arasında romen rakamları oluşturun. Ardından totalCharacterCount'unuzu almak için bu romen rakamlarının karakter uzunluğunu toplayın . İşte netleştirmek için bazı sahte kod:
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
finalScore = codeGolfScore + totalCharacterCount
- En düşük finalScore kazanır!
Not: totalCharacter sayısı on bin + 'da olacağından, karakter uzunluğu algoritması öncelikli olmalıdır. Kod-golf puanları, birden fazla kullanıcının birbirine yakın olan en uygun algoritmayı veya algoritmaları bulması durumunda sadece bağlayıcıdır.
İyi şanslar ve yarın akşam MMXII kutlamalarınızda iyi eğlenceler !!!
""
izin verilir VVX
mi yoksa eşdeğer bir şey mi kullanmak zorundayız ?
IXV = -(-1 + 10) + 5 = -4
(en kazananlar) veya IXV = -1 + 10 + 5 = 14
(en yüksek kazananlar)?
DDDDM
duruyor mu-1000
?