Créez une calculatrice de base pour les chiffres romains.
Exigences
- Supports
+
,-
,*
,/
- L'entrée et la sortie ne doivent s'attendre qu'à un seul préfixe soustracteur par symbole (c.-à-d. 3 ne peut pas l'être
IIV
car il y en a deuxI
avantV
) - Manipulation du principe de soustraction en entrée et doit de sortie au soutien minimum conventions standards modernes, où seuls pouvoirs de dix sont soustraites des chiffres plus importants (par exemple
I
,X
,C
sont nécessaires soustracteurs mais nonV
,L
,D
) et la soustraction est jamais fait à partir d' un nombre plus 10x le soustracteur (par exempleIX
doit être pris en charge maisIC
n'est pas requis). - L'entrée et la sortie doivent être de gauche à droite par ordre de valeur, en commençant par la plus grande (c.-à-d. 19 =
XIX
nonIXX
, 10 est supérieur à 9) - De gauche à droite, aucune priorité d'opérateur, comme si vous utilisiez une calculatrice manuelle.
- Prend en charge les entrées / sorties de nombres positifs entiers entre 1-4999 (pas besoin de V̅)
- Aucune bibliothèque qui effectue la conversion des chiffres romains pour vous
À vous de décider
- Sensibilité à la casse
- Espaces ou aucun espace en entrée
- Que se passe-t-il si vous obtenez une sortie décimale. Tronquer, pas de réponse, erreur, etc.
- Que faire pour une sortie que vous ne pouvez pas gérer. Négatifs ou nombres trop grands à imprimer.
- Que ce soit pour soutenir une utilisation plus libérale du principe de soustraction que l'exigence minimale.
Crédit supplémentaire
- -50 - Poignée jusqu'à 99999 ou plus. Les symboles doivent inclure un vinculum
Exemple d'entrée / sortie
XIX + LXXX (19+80)
XCIX
XCIX + I / L * D + IV (99+1/50*500+4)
MIV
Le code le plus court gagne.
code-golf
roman-numerals
Danny
la source
la source
IM = 999
requise?IM
. Que la sortie soitIM
ouCMXCIX
pour 999 dépend de vous. Les deux répondent aux exigences.Réponses:
JavaScript (ES6), 238
Usage:
Version annotée:
la source
T-SQL, 1974 - 50 = 1924 octets
Je sais que jouer au golf en SQL équivaut à jouer 18 trous avec rien d'autre qu'un coin de sable, mais j'ai savouré le défi de celui-ci, et je pense que j'ai réussi à faire quelques choses intéressantes méthodologiquement.
Cela prend en charge le vinculum pour l'entrée et la sortie. J'ai adopté la convention d'utiliser un tilde de fin pour le représenter, donc V ~ est 5000, X ~ est 10000, etc. Après cela, il effectuera un encodage romain partiellement non standard de tout ce qui se trouve dans la plage prise en charge par INT.
Puisqu'il s'agit uniquement de mathématiques entières, tous les résultats non entiers sont arrondis implicitement.
Je continue de bricoler avec une solution basée sur un ensemble pour remplacer une partie de la boucle WHILE qui pourrait réduire le nombre d'octets et être un exemple plus élégant de SQL idiomatique. Il y a également quelques octets à gagner en réduisant l'utilisation des alias de table au strict minimum. Mais comme il est essentiellement impossible de gagner dans cette langue, je suis surtout ici pour montrer ma tenue Don Quichotte. :)
SELECT @i en haut répète l'entrée:
Et le SELECT à la fin renvoie:
Et vous pouvez le tester vous-même dans ce SQLFiddle
Et je reviendrai pour ajouter quelques commentaires sur la façon dont cela fonctionne, car pourquoi publier une réponse évidemment perdante si vous ne comptez pas l'exploiter à des fins éducatives?
la source
Javascript -
482476 caractèresL'exemple d'entrée / sortie fonctionne:
Il gère également mal les grands nombres:
Et il accepte, mais n'exige pas, les espaces aussi.
Mais, depuis que je jouais au golf, il y a quelques problèmes:
Cette version alternative prend en charge des nombres supérieurs à 5000 jusqu'à 99999, mais elle comprend
600598584 caractères:la source
Javascript
479361348278253303 caractères - 50 pour les numéros de support jusqu'à 1 million, avec prise en charge de vinculum:
Utilisation:
p(text)
par exemple,p('XIX + LXXX')
retoursXCIX
.Code avec commentaires explicatifs:
Cela fonctionne pour les échantillons donnés et pour tous les autres que j'ai essayés. Exemples:
la source
Ruby 2.1,
353 (et de nombreuses autres itérations), 295 - 50 = 245La manipulation du vinculum ajoute ~ 23 caractères.
Cela gère "IL" ou "VM" dans l'entrée, et échoue sans erreur sur les négatifs (va en pouces élevés) ou décimales (tronquées), ou tout espace. Maintenant, gère également un premier nombre négatif (bien que si le total est négatif, il échoue toujours mal). Échoue également mal si vous commencez par * ou / ou si le résultat est supérieur ou égal à 4 millions.
Utilise Object # send pour la fonctionnalité "calculatrice manuelle".
Non golfé:
la source
Python 2 -
427418404401396395392 caractèresLit à partir de l'entrée standard. Il ne gère que les majuscules (pourrait le rendre insensible à la casse au prix de 8 caractères supplémentaires) et nécessite des espaces. Ne fait aucune validation - je n'ai pas testé pour voir comment il se casse dans divers cas. Il gère cependant des nombres comme VC = 95.
Et la version non golfée:
J'ai l'impression que Perl aurait été mieux, mais je n'en sais pas assez. Pour un premier coup au golf de code, cependant, je me sens assez bien à ce sujet.
la source
PHP -
549525524520 octetsRien de trop innovant: normalise les opérateurs pour assurer la priorité de gauche à droite, convertit Roman en décimal, s'exécute
eval
sur l'instruction, par exemple XCIX + I / L * D + IV est converti en quelque chose comme return (((((+90 +9) + (+1)) / (+50)) * (+500)) + (+4)); , puis convertit la décimale en romain.par exemple
la source
Python - 446 octets
Cela pourrait être considérablement amélioré. J'ai senti que je devais faire le premier swing avec Python. Il fait 3 choses au premier passage
x
pour inclure toutes les combinaisons possibles rencontrées (même si elles ne sont pas utilisées). Par exemple, pendant laXIX
lex, les valeurs partielles de"X":10
,"XI":11
et"XIX":19
sont ajoutés à la table des symbolesÀ la fin, il appelle
eval
à la chaîne d'origine (sauf avec des parenthèses ajoutées) et lui donne la table des symboles.Ensuite, je viens de coller dans une solution connue pour convertir un entier en romain, car j'ai travaillé assez longtemps sur cela ... n'hésitez pas à vous améliorer pour que j'apprenne quelque chose de nouveau :)
la source