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 !!!
la source
DDDDM
signifie- t-il-1000
?""
autorisé pour zéro ou devons-nous utiliserVVX
ou quelque chose d'équivalent?IXV = -(-1 + 10) + 5 = -4
(victoires les plus à droite), ouIXV = -1 + 10 + 5 = 14
(victoires les plus appréciées)?Réponses:
Haskell, 25637 (= 268 + 25369)
26045 (= 222 + 25823)à utiliser par exemple
Vous pouvez évaluer la somme de la longueur avec le simple
Ce qui prend quelque chose en une minute.
la source
C ++, 345 caractères de code, 25021 chiffres romains = 25366
désobfusqué un peu, avec un pilote:
V
calcule la valeur numérique d'une chaîne numériques
de longueur donnéeL
. Les chaînes sont codées en base 7 (le premier chiffre est s% 7, le deuxième chiffre est s / 7% 7, ...). Chaque chiffre est codé avec I = 0, V = 1, ..., M = 6.f
effectue une énumération par force brute des chaînes de chiffres romains possibles pour en trouver une quiV
évaluen
.Le nombre total de chiffres romains est optimal. Le chiffre romain le plus long requis pour [-1000,3000] est de 11 chiffres (par exemple -827 = CMDDMLXXIII), ce qui prend environ 5 minutes sur ma machine.
la source
LMCLXXIII
comme réponse à-777
. Je lirais cela comme-50+1000-100+50+10+10+3 = 923 ≠ -777
, seulement avec "le plus haut à droite " au lieu de "le plus élevé "-777
. Mais c'est exactement ce que vous avez demandé dans les commentaires!VVVXI
pour-4
quandIXVX
est en fait plus court, comme je viens de le remarquer) - mais c'est parfaitement légal.Rubis, 25987 (= 164 + 25823)
Vous pouvez appeler
r
directement pour obtenir les résultats. La somme sur la plage spécifiée donnequi est la somme optimale comme pour les autres solutions.
la source
C # 23537 (639 caractères de code + 22898 caractères de sortie)
Calculer:
Enumerable.Range(-1000, 3000).Sum(i => M.R(i).Length);
la source