Objectif:
écrire une fonction qui prend un nombre en entrée et renvoie un chiffre romain abrégé pour ce nombre en sortie.
Symboles des chiffres romains:
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
Pour un exemple de ce que je veux dire quand je dis "chiffres romains à main courte", considérons la recherche d'un chiffre romain pour représenter 1983, car c'est l'année de ma naissance. Une option consiste à le faire de manière normale (10 lettres):
1983 = MCMLXXXIII = (1000 - 100 + 1000 + 50 + 30 + 3)
L'autre option est de le faire de manière abrégée (6 caractères):
1983 = MXVIIM = (1000 - (10 + 10) + 1000 + 3)
Savez-vous ce que cela signifie?!?!!?? Si j'étais romain, j'aurais pu enregistrer 4 caractères à chaque fois que j'écrivais ma date de naissance! Woot Woot !!
Cependant, avant de prendre de l'avance sur moi-même dans l'excitation, j'ai une question à écrire, je devrais donc probablement définir les règles abrégées des chiffres romains afin que nous soyons tous sur la même page:
Règles des chiffres romains à main courte:
- Considérez toujours les symboles de gauche à droite jusqu'à ce qu'il n'y ait plus de caractères à considérer.
- S'il n'y a pas de symboles de valeur supérieure à droite du symbole actuel:
- Ajoutez la valeur du symbole actuel au total cumulé de ce chiffre romain.
- S'il y a des symboles de valeur supérieure à droite du symbole que vous envisagez:
- Localisez le symbole de valeur la plus à droite à droite du symbole actuel
- Considérez tous les caractères jusqu'à ce symbole comme un chiffre romain
- Calculez la valeur de ce chiffre romain en utilisant ces étapes
- Soustrayez la valeur de ce chiffre romain du total cumulé de ce chiffre romain.
- Passez au symbole suivant après le groupe que vous venez de considérer
- Chaque chiffre romain doit contenir au moins 1 symbole.
- C'est ça! Tout ce qui suit ces règles sera accepté!
Exemples:
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 :)
Règles des questions:
Créez une fonction qui prend un seul nombre en entrée et renvoie un chiffre romain pour ce nombre en sortie en utilisant les règles ci-dessus. Calculez le codeGolfScore de cette fonction.
example input: 2011 example possible output: MMXI another possible output: MMVVIVV //(2000 + 10 - 4 + 5)
En utilisant votre fonction de la règle 1, générez les chiffres romains entre -1000 (c'est-à-dire NÉGATIF mille) et 3000. Résumez ensuite la longueur des caractères de ces chiffres romains pour obtenir votre totalCharacterCount . Voici un pseudocode pour clarifier:
totalCharacterCount = 0; for(currentNumber = -1000; currentNumber <= 3000; currentNumber++){ totalCharacterCount += getRomanNumeral(currentNumber).length; } return totalCharacterCount;
finalScore = codeGolfScore + totalCharacterCount
- Le score final le plus bas gagne!
Remarque: Comme le nombre total de caractères sera dans les dix mille +, l'algorithme de longueur de caractère doit être la priorité absolue. Les scores de code-golf ne sont que le bris d'égalité au cas où plusieurs utilisateurs trouveraient l'algorithme optimal ou des algorithmes proches les uns des autres.
Bonne chance et amusez-vous lors de vos célébrations MMXII demain soir !!!
""
autorisé pour zéro ou devons-nous utiliser VVX
ou quelque chose d'équivalent?
IXV = -(-1 + 10) + 5 = -4
(victoires les plus à droite), ou IXV = -1 + 10 + 5 = 14
(victoires les plus appréciées)?
DDDDM
signifie- t-il-1000
?