Défi
Étant donné une chaîne d'entrée, renvoyez une valeur véridique si elle représente un chiffre romain correct entre 1 (= I
) et 3999 (= MMMCMXCIX
), et une valeur falsey sinon.
Détails
- L'entrée est une chaîne non vide qui ne comprend que les caractères
IVXLCDM
. - Les chiffres romains (que nous utilisons ici dans ce défi) sont définis comme suit:
Nous utilisons uniquement les symboles suivants:
Symbol I V X L C D M
Value 1 5 10 50 100 500 1000
Pour définir quelles chaînes sont réellement des chiffres romains valides, il est probablement plus facile de fournir la règle de conversation: pour écrire un nombre décimal a3 a2 a1 a0
(où chacun ai
représente un chiffre. Donc, par exemple, pour représenter 792
nous avons a3=0, a2=7, a1=9, a0=2
.) Comme un chiffre romain, nous le décomposons dans la puissance de dizaines. Les différents pouvoirs de dix peuvent s'écrire comme suit:
1-9: I, II, III, IV, V, VI, VII, VIII, IX
10-90: X, XX, XXX, XL, L, LX, LXX, LXXX, XC
100-900: C, CC, CCC, CD, D, DC, DCC, DCCC, CM
1000-3000: M, MM, MMM
En commençant à gauche par le chiffre le plus significatif de la, nous pouvons convertir le nombre que chaque chiffre représente séparément et les concaténer. Ainsi, pour l'exemple ci-dessus, cela ressemblerait à ceci:
Digit a3 a2 a1 a0
Decimal 0 7 9 2
Roman DCC XC II
Par conséquent, le chiffre romain de 792
est DCCXCII
. Voici une liste complète de tous les chiffres romains pertinents pour ce défi: OEIS a006968.txt
Exemples
Truthy
MCCXXXIV (1234)
CMLXXXVIII (988)
DXIV (514)
CI (101)
Falsey
MMIXVIII
IVX
IXV
MMMM
XXXVX
IVI
VIV
MMMM
invalide? Y a-t-il une lettre pour 5000 qui devrait être utilisée à la place pour M <letter>?I,V,X,L,C,D,M
.Réponses:
Verbose , 1362 octets
Les sorties
I
pour les chiffres romains valides dans la plageI-MMMCMXCIX
etNULLA
(0) ou informe que l'entrée utilisateur n'est pas un chiffre romain valide sinon.la source
C # (Visual C # Interactive Compiler) ,
79109 octetsCela semble être un défi Regex, je suis sûr qu'une solution plus courte peut être trouvée ...
Essayez-le en ligne!
la source
{0,3}
à{,3}
?{5,}
travail, mais pas{,5}
./u:System.Text.RegularExpressions.Regex
, comme cette réponse :)^M?M?M?(C[MD]|D?C?C?C?)(X[CL]|L?X?X?X?)(I[XV]|V?I?I?I?)$
. Même longueur, mais semble plus étrange (quel est le but, non?)Wolfram Language (Mathematica) , 35 octets
Essayez-le en ligne!
5 octets enregistrés grâce à @attinat
la limitation
[1,3999]
malheureuse coûte 7 octets ...voici le code pour tout nombre romain
Wolfram Language (Mathematica) , 28 octets
Essayez-le en ligne!
le code ci-dessus fonctionne pour n'importe quel nombre, pas seulement [1,3999]
la source
IVXLCDM
."Boole
est également plus court (d'un octet) que l'utilisationIf
de cette manière.Ensemble CP-1610 ( Intellivision ),
52 ... 4847 DECLEs 1 = 59 octetsEssayons ceci sur un système qui précède Perl de 7 bonnes années. :-)
Prend un pointeur sur une chaîne terminée par null dans R4 . Définit l' indicateur Zero si l'entrée est un chiffre romain valide, ou l'efface autrement.
Comment?
L'expression régulière peut être réécrite en 4 groupes avec la même structure, à condition que
#
tout caractère invalide garanti ne soit pas présent dans la chaîne d'entrée.Notre routine tente d'analyser la chaîne d'entrée caractère par caractère en fonction de ces modèles et vérifie éventuellement si la fin de la chaîne est atteinte.
Production
capture d'écran de jzIntv
1. Un opcode CP-1610 est codé avec une valeur de 10 bits, connue sous le nom de «DECLE». Cette routine dure 47 DECLEs, commençant à 4876 $ et se terminant à 48A4 $ (inclus).
la source
Java 8, 70 octets
Port de la réponse C # @ Innat3 , alors assurez-vous de lui donner un vote positif!
Essayez-le en ligne.
Explication:
la source
R ,
747156 octetsMerci à @RobinRyder, @Giuseppe et @MickyT pour leurs suggestions sur l'utilisation efficace de grep avec les R intégrés
as.roman
.Essayez-le en ligne!
la source
as.roman
ne fonctionnera pas de toute façon, car cela ne fonctionne que3899
pour une raison quelconque.as.roman
: supprimez d'abord l'initialeM
s'il y en a un, puis vérifiez si le résultat est entréas.roman(1:2999)
. Cela nécessite une gestion spéciale du cas où l'entrée estM
.romans
serait une chose utile à mettre dans R ??? Il a été ajouté en 2.5.0 (avril 2007) ...Wolfram Language (Mathematica) , 32 octets
Essayez-le en ligne!
la source
Gelée ,
48 47 4644 octets-1 merci à Nick Kennedy
IVXLCDM
1
0
Essayez-le en ligne! Ou consultez la suite de tests .
Comment?
la source
Perl 5 (
-p
), 57 octetsTIO
{0,3}
quantificateur a été modifié par*
&!/(.)\1{3}/
pour garantir que le même personnage ne puisse pas apparaître 4 fois de suite.-/(.)\1{3}/
car donnerait-1
pourIIIIVI
par exemplela source
Python 2 , 81 octets
Essayez-le en ligne!
Regardons la dernière partie de l'expression régulière, qui correspond aux chiffres romains jusqu'à 9 (y compris la chaîne vide)
Cela a deux alternatives séparées par
|
:V?I{,3}
: Une optionV
suivie de 3 au maximumI
. Cela correspond à la chaîne videI
,II
,III
,V
,VI
,VII
,VIII
.I[VX]
: UnI
suivi d'unV
ouX
. Cela correspondIV
etIX
.Les mêmes choses avec l'
X,L,C
appariement des dizaines, avec l'C,D,M
appariement des centaines, et enfin^M{,3}
permet jusqu'à 3M
(milliers) au début.J'ai essayé de générer le modèle pour chaque trio de personnages plutôt que de l'écrire 3 fois, mais c'était beaucoup plus long.
la source
^
ancre au début;match
implique déjà qu'il correspond au début de la chaîne.^
.f=
n'est pas inclus dans le code car les fonctions anonynomeuses sont autorisées. C'est juste pour TIO.lambda
s sont légaux, donc les méthodes liées non affectées de l'expression régulière compilée devraient également être bonnes.Rétine ,
5651 octetsPort de la réponse Perl 5 de @NahuelFouilleul , alors assurez-vous de voter pour lui!
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
05AB1E ,
6198 octetsÉnorme-52 octets grâce à @Adnan , car apparemment le code romain de 05AB1E n'a pas été documenté, haha .. xD
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Voir cette astuce 05AB1E (section Comment compresser les grands nombres entiers? ) Pour comprendre pourquoi
ŽF¯
est3999
.Réponse originale de 61 octets:
Essayez-le en ligne ouvérifiez tous les cas de test .
Explication:
Voir cette astuce 05AB1E de mes (sections Comment les chaînes Compresser ne fait pas partie du dictionnaire? , Comment compresser les grands entiers? , Et comment les listes entières Compresser? ) Pour comprendre pourquoi:
•1∞Γ'иÛnuÞ\₂…•
est397940501547566186191992778
Ž8в
est2112
•1∞Γ'иÛnuÞ\₂…•Ž8вв
est[1,11,111,12,2,21,211,2111,10]
.•6#&‘нδ•
est"xivcxlmcd"
la source
.X
n'est pas documenté, mais je pense que cela devrait fonctionner:3999L.XQO
3999
. :)perl -MRegexp :: Common -pe, 34 octets
La
&!/(.)\1{3}/
partie est nécessaire, carRegexp::Common
permet quatre (mais pas cinq) des mêmes caractères d'affilée. De cette façon, il correspond aux nombres romains utilisés sur les cadrans d'horloge, où ilIIII
est souvent utilisé pour 4.la source
Python 3 ,
116113109107105106 octetsEssayez-le en ligne!
-1 octet grâce à ShadowRanger
la source
^
n'est pas nécessaire car ilmatch
ne correspond déjà qu'au début d'une chaîne.$
est nécessaire (fullmatch
implique seulement des ancres aux deux extrémités, et cela coûterait évidemment plus qu'un$
).Ruby , (
-n
) 56 octetsEssayez-le en ligne!
Sorties 0 (vrai) ou nul (faux).
la source