Vous travaillez pour une entreprise qui souhaite créer une calculatrice conviviale, et vous avez donc été chargé d'ajouter la possibilité pour les utilisateurs d'utiliser des "raccourcis numériques", c'est-à-dire des lettres qui représentent des valeurs numériques, comme k
pour 1000
. Parce que votre entreprise souhaite économiser de l'argent sur le stockage dans ces calculatrices, vous devez minimiser votre code autant que possible pour réduire le coût du stockage.
Ta tâche
Vous devez créer une fonction qui lit une expression en entrée de STDIN ou la prend comme paramètre et renvoie son évaluation ou l'imprime dans STDOUT.
Quelques clarifications
Permettez-moi de faire quelques définitions. Tout d'abord, nous avons l'entrée, que j'appelle une expression. Cela peut ressembler à ceci:
x + y / z
Au sein de cette expression , nous avons trois chiffres: x
, y
et z
, séparés par les opérateurs ( +
et /
). Ces nombres ne sont pas nécessairement des entiers positifs (ni même des entiers). Ce qui complique les choses, c'est quand nous devons évaluer les raccourcis contenus dans les chiffres. Par exemple, avec
2k15
à des fins d'évaluation, nous avons divisé ce en trois chiffres: 2
, 1000
(qui est k
), et 15
. Ensuite, selon les règles, nous les combinons pour obtenir
2*1000 + 15 = 2015
Espérons que cela facilite un peu la compréhension des règles suivantes.
Règles
NB Sauf indication contraire, vous pouvez interpréter le mot "nombres" ou ses synonymes pour inclure des raccourcis.
Ce qui suit constitue la sténographies numérique votre fonction doit être capable de traiter:
k, m, b, t, and e
.k, m, b, and t
correspondent1000, 1000000, 1000000000, and 1000000000000
respectivement aux valeurs (mille, un million, un milliard et un billion). Lae
sténographie sera toujours suivie d'un autre nombren
,, et représente10^n
. Vous devez permettre aux raccourcis numériques d'être présentsn
et présents avante
. Par exemple,kek
évalue à1000*10^1000
.Par souci de simplicité, si un nombre contient la sténographie
e
, il ne sera utilisé qu'une seule fois.Tout nombre ( raccourcis inclus ) avant qu'un raccourci soit multiplié par celui-ci. par exemple
120kk
serait évalué comme120 * 1000 * 1000
. S'il n'y a pas de nombre avant, vous devez supposer que le nombre est 1 (comme la façon dont vous pourriez, en mathématiques, traiterx
implicitement une variable comme1x
). par exemple,e10
évalue10^10
. Autre exemple:2m2k
évalue à2*1000000*2*1000
(rien n'y est ajouté).Tout numéro (les raccourcis ne s'appliquent pas) suivant le dernier raccourci d'un numéro contenant un raccourci y est ajouté. par exemple
2k12
serait évalué comme2*1000 + 12
. L'exception à cette règle est si le raccourcie
est utilisé, auquel cas le nombre ( raccourcis inclus ) suivante
sera traitén
et évalué comme10^n
(voir la première règle).Votre fonction doit être capable de traiter les opérateurs
+, -, *, and /
qui sont respectivement l'addition, la soustraction, la multiplication et la division. Il peut en traiter davantage, si vous le souhaitez.Les opérations sont évaluées selon l' ordre des opérations.
Les nombres en sténographie ne sont pas uniquement des entiers.
3.5b1.2
est valide et doit être évalué comme3.5*1000000000 + 1.2 = 3500000001.2
Les fonctions intégrées ne sont pas autorisées, si elles existent pour ce genre de chose. L'exception que j'ajouterai serait si votre langue convertit automatiquement les grands nombres en notation scientifique, auquel cas cela est admissible pour votre sortie.
Le code le plus court en octets gagne, les failles standard s'appliquent.
Contribution
L'entrée sera une expression avec chaque nombre et opérateur séparés par des espaces. Les nombres peuvent contenir ou non un raccourci. Un exemple est présenté ci-dessous:
10 + 1b - 2k
Production
Votre fonction doit générer l'évaluation de l'expression sous forme de nombre. Il est admissible d'utiliser la notation scientifique si la sortie est trop grande pour être affichée. Vous devez avoir au moins trois décimales si le nombre n'est pas un entier. Il est admissible si vous conservez ces décimales si le nombre est un entier.
Cas de test
Contribution
t
Production
1000000000000
Contribution
1 + 4b / 10k11
Production
399561.483
Contribution
e2 + k2ke-1 - b12
Production
-999799912
ou
-999799912.000
Contribution
142ek12
Production
142e1012
ou
142.000e1012
Contribution:
1.2m5.25
Production:
1200005.25
Notes finales
C'est mon premier défi publié (avec l'aide des utilisateurs sur le bac à sable). Si quelque chose n'est pas clair, faites-le moi savoir et je ferai de mon mieux pour clarifier.
1000 + 2000 * 10 ^ -1
, mais cela a donné une réponse finale de-999998712
. (De plus, mon interprétation ne semble pas concorder avec le " dernier raccourci " de la règle 4 , mais je ne sais pas comment comprendre la séquence autrementk2k
.) Pouvez-vous expliquer les étapes de son évaluation?2m2k
devrait être ajouté à la discussion de la règle 3. En outre, il pourrait être préférable d'utiliser un terme différent - peut-être "entier" - pour les nombres littéraux comme123
celui-ci ne sont pas des raccourcis. Le mot «nombre» a environ 3 définitions différentes ici, tel qu'il se présente actuellement.Réponses:
Python 2, 553 octets
Cette question semblait un peu mal aimée et semblait amusante, alors je lui ai donné un coup de feu. Je n'ai jamais fait de golf de code auparavant, donc il y a probablement beaucoup de choses qui peuvent être améliorées, mais je l'ai fait de mon mieux en fonction de ma connaissance de la langue. Une solution équivalente est possible en Python 3 au prix d'un octet supplémentaire:
print repr(z[0])
->print(repr(z[0]))
.L'utilisation est quelque chose dans le sens de
c'est à dire
les sorties
Des commentaires sur la façon d'améliorer cela seraient très appréciés. S'il y a suffisamment d'intérêt, je peux dé-golfer et commenter le programme, mais la plupart sont déjà assez lisibles (un fait inquiétant dans le code golf).
Il est à noter que le programme rompt avec l'exemple
142ek12
car cette valeur est ridiculement grande et le programme déborde.Pour compenser, ce qui suit est légèrement plus long, mais peut théoriquement gérer tout ce qui est lancé en raison de l'utilisation de la bibliothèque de précision arbitraire intégrée. La syntaxe est identique.
Python 2,
589588 octets (précision arbitraire)la source