Contexte
Ce challenge est inspiré de ce site internet, qui a publié le schéma suivant:
Ce diagramme nous montre que l'expression du chiffre romain la plus longue sous 250 est celle de 188, ce qui nécessite 9 chiffres pour s'exprimer.
Défi
Les symboles standards utilisés pour exprimer chiffres les plus romains sont les suivantes: { I
, V
, X
, L
, C
, D
, M
}, où les valeurs numériques de caractères sont M
= 1000, D
= 500, C
= 100, L
= 50, X
= 10, V
= 5, I
= 1.
Dans ce défi, votre objectif est de, étant donné un entier positif n , calculer le nombre de représentations de chiffres romains valides qui peuvent être composées en concaténant n des symboles standard.
Ensuite, votre programme doit sortir le résultat de ce calcul!
Entrée : Un entier positif n .
Sortie : Le nombre d'expressions de chiffres romains valides de longueur n .
Règles pour les expressions numériques romaines
Les chiffres romains n'avaient à l'origine qu'un appariement "additif", ce qui signifie que les chiffres étaient toujours écrits dans l'ordre décroissant, et la somme des valeurs de tous les chiffres était la valeur du nombre.
Plus tard, l'appariement soustractif, l'utilisation de placer un plus petit chiffre devant un plus grand afin de soustraire le plus petit du plus grand, est devenu monnaie courante pour raccourcir les expressions du chiffre romain. Paires soustractive ne peuvent être enchaînées, comme dans l'expression non valide suivante: IXL
.
Voici les règles modernes pour l'appariement additif et soustractif.
- Un seul I, X et C peut être utilisé comme premier chiffre dans une partie d'une paire soustractive.
- Je ne peux être placé avant V ou X que dans une paire soustractive.
- X ne peut être placé avant L ou C dans une paire soustractive.
- C ne peut être placé avant D ou M dans une paire soustractive.
- À l'exception des paires soustractives, les chiffres doivent être dans l'ordre décroissant (ce qui signifie que si vous supprimez le chiffre de tête de chaque paire soustractive, les chiffres seront dans l'ordre décroissant).
- M, C et X ne peuvent pas être égalés ou dépassés par des dénominations plus petites.
- D, L et V ne peuvent chacun apparaître qu'une seule fois.
- Seul M peut être répété 4 fois ou plus.
Notes complémentaires
Nous n'utiliserons pas la notation à barres ; nous ajouterons simplement plus de M pour exprimer n'importe quel nombre.
Ce sont les seules règles que nous suivrons pour nos chiffres romains. Cela signifie que les expressions étranges, telles que
IVI
, seront également considérées comme valides dans notre système.Souvenez-vous également que nous ne comptons pas le nombre de nombres qui ont des expressions de longueur n , car certains nombres ont plusieurs expressions. Au lieu de cela, nous comptons uniquement le nombre d'expressions valides.
Cas de test
1
→ 7
2
→ 31
3
→ 105
J'ai vérifié ce qui précède à la main, alors assurez-vous de vérifier les cas de test et d'ajouter plus si vous le pouvez!
Critères gagnants
Il s'agit d'un défi de code-golf , alors amusez-vous! Je n'accepterai que des solutions qui peuvent gérer au moins les entrées de 1 à 9. Plus est bonus!
Éditer
Comme demandé par les commentateurs, trouvez ci-dessous, ou sur ce lien pastebin, les 105 combos que j'ai comptés pour n = 3
III IVI IXI IXV IXX VII XII XIV XIX XVI XXI XXV XXX XLI XLV XLX XCI XCV XCX XCL XCC LII LIV LIX LVI LXI LXV LXX CII CIV CIX CVI CXI CXV CXX CXL CXC CLI CLV CLX CCI CCV CCX CCL CCC CDI CDV CDX CDL CDC CMI CMV CMX CML CMC CMD CMM DII DIV DIX DVI DXI DXV DXX DXL DXC DLI DLV DLX DCI DCV DCX DCL DCC MII MIV MIX MVI MXI MXV MXX MXL MXC MLI MLV MLX MCI MCV MCX MCL MCC MCD MCM MDI MDV MDX MDL MDC MMI MMI MMX MML MMC MMD MMM
Modifier 2:
Utilisez le code non golfé suivant , gracieuseté de Jonathan Allan pour vérifier vos résultats.
Modifier 3:
Je m'excuse pour toutes les erreurs de ce défi. Je ferai en sorte de faire un meilleur travail la prochaine fois!
la source
Réponses:
Rétine , 111 octets
Essayez-le en ligne! Ceci est une réécriture complète car j'ai mal compris la règle 1. pour signifier que vous ne pouvez utiliser qu'un seul soustractif
I
,X
etC
. Explication: La première partie du script développe l'entrée en une chaîne deCM
paires suivie des autres paires soustractives possibles. Chaque paire est facultative et le premier caractère de chaque paire est également facultatif au sein de la paire. La troisième étape étend ensuite la liste des paires en une liste de commandes Retina qui prennent l'entrée et créent trois copies avec l'option du deuxième ou des deux caractères de la paire, puis rognent et dédupliquent les résultats. L'étape finale ajoute ensuite du code pour effectuer les tâches finales: d'abord étendre l'entrée pour éventuellement ajouter une finaleI
, puis de filtrer les résultats de la mauvaise longueur, puis de dédupliquer les résultats, et enfin de compter les résultats. Le script Retina résultant est ensuite évalué.Remarque: En théorie, 15 octets pourraient être enregistrés à la fin de la 4e ligne, mais cela rend le script trop lent pour être démontré sur TIO, même pour
n=1
.la source
Python 2 ,
177 168162 octetsEssayez-le en ligne!
Je suis assez nouveau, aidez-moi à jouer au golf! Ceci vérifie les chiffres romains réels, le regex doit être ajusté pour tenir compte des cas impairs tels que
IVI
-9 octets grâce à @Dead Possum!
-6 octets grâce à @ovs
la source
^M*(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$
93
au lieu de105
JavaScript (ES7), 133 octets
Edit : corrigé pour correspondre aux résultats renvoyés par le code de Jonathan Allan , qui a été donné comme implémentation de référence par l'OP.
Essayez-le en ligne!
Comment?
Désormais, chaque chiffre sera interprété comme un symbole de chiffre romain:
2) Nous remplaçons toutes les paires soustractives valides du formulaire
AB
parB
:Exemples:
XLIXIV
devientLXV
XIIV
devientXIV
, laissant unI
qui fera échouer le prochain testIC
reste inchangé, ce qui laisse également un invalideI
en place3) Nous vérifions que les symboles restants sont dans le bon ordre et n'apparaissent pas plus de fois qu'ils ne sont autorisés à:
la source
C,
150123 octetsJe n'ai pas lu la description assez attentivement, donc cela produit le nombre de chiffres romains standard (où les expressions comme
IVI
ne sont pas comptées). Depuis que j'y ai mis un peu d'effort, j'ai pensé que je partagerais quand même.Original (150 octets):
la source
F(X)
etfor(X=10;X--;)