Écrivez un programme ou une fonction qui accepte un entier compris entre 1 et 3 999 en entrée et renvoie le nombre de segments de ligne requis pour exprimer cet entier en chiffres romains standard (vous utiliserez donc XL mais pas VM). Exemples:
1 -> 1
4 -> 3
5 -> 2
9 -> 3
10 -> 2
40 -> 4
50 -> 2
90 -> 3
100 -> 1
400 -> 3
500 -> 2
900 -> 5
1000 -> 4
Les fonctions intégrées de conversion des nombres romains sont autorisées, mais vous pouvez résoudre le problème sans elles en soustrayant à plusieurs reprises le plus grand nombre restant de la liste ci-dessus. Exemple: 1234 = 4 + 1 + 1 + 2 + 2 + 2 + 3 = 15.
C'est le code-golf , donc le programme le plus court l'emporte.
Réponses:
Pyth,
927670 octetsEssayez-le ici!
Merci à @FryAmTheEggman pour quelques suggestions d'emballage de chaînes qui m'ont fait économiser quelques octets!
Je me demande toujours s'il existe un moyen mathématique d'encoder cette liste. Va essayer de comprendre quelque chose.
Explication
Cela utilise l'algorithme donné.
K
contient la liste donnée avec les numéros et le nombre correspondant de segments de ligne en alternance. Cette liste est construite en divisant une chaîne compressée, qui est décodée0/0/1/1/4/3/5/2/9/3/10/2/40/4/50/2/90/3/100/1/400/3/500/2/900/5/1000/4
,/
activée et mappée à chaque élément en un entier.la source
C,
148129 caractèresMon premier code-golf: ^). Étant donné que la question indique que je peux utiliser une fonction, j'ai changé main en une fonction pour couper certains caractères (surtout: passez c comme paramètre plutôt scanf)
déballé
la source
Mathematica,
8072 octetsFonction anonyme qui convertit simplement les nombres en chiffres romains, remplace chaque caractère par son nombre de segments et prend le total.
la source
Rétine, 128 octets
Remplacement simple jusqu'à ce qu'il ne reste plus rien à remplacer. Ensuite, les apostrophes sont comptées et c'est notre nombre de segments de ligne.
Si l'entrée et la sortie en unaire sont autorisées, c'est 115 octets (mais qui voudrait en taper 1234?).
Essayez-le en ligne!
Essayez-le en ligne! (IO unaire)
la source
Python 3, 95 octets
La chaîne Unicode se compose des points de code:
la source
e=ord(e);
Java, 152 octets
Parce que, tu sais, Java.
Implémentation littérale simple de l'algorithme donné. Le tableau contient les informations de transformation: les index pairs sont un de moins que le chiffre romain et les index impairs sont le compte de ce chiffre.
C'est un lambda qui prend et retourne un
int
/Integer
. Cela comprendIntUnaryOperator
ouUnaryOperator<Integer>
.la source
JavaScript (ES6), 79 octets
Les chaînes représentent le nombre de segments de ligne pour les unités, les dizaines et les centaines de chiffres. (Des milliers est tout simplement quatre fois le chiffre des milliers.) Cette méthode semble être plus courte que d'autres options telles que l'algorithme suggéré dans la question.
Edit: sauvé 2 octets grâce à @ user81655.
la source
n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4
+
s en-
s me permet de supprimer le début+
, mais le regroupement enregistre un autre octet.