Une version simpliste de la calculatrice numérique anglaise
Tâche
Écrivez un programme qui prend une chaîne en entrée et génère le résultat de l'expression.
Règles
La chaîne d'entrée sera libellée et non numérique.
Il n'y aura pas de parenthèses.
L'ordre de calcul sera diviser, multiplier, soustraire puis ajouter.
Pour les mêmes opérations, les calculs doivent être effectués de gauche à droite.
Tous les nombres entrés seront des entiers de -999 à 999 (les deux inclus)
La sortie sera un entier de n'importe quelle plage.
La division sera toujours parfaitement divisible et zéro ne sera jamais un dénominateur.
La restriction de cas pour l'entrée est facultative. Vous n'avez pas à vérifier la validité de l'entrée.
Format de nombre
0 to 20 -> zero,one,two...nineteen,twenty
21 to 99 -> twenty one,twenty two.....ninety eight,ninety nine
100 to 999 -> one hundred, one hundred one, one hundred two...one hundred ten....two hundred fifty....nine hundred ninety eight,nine hundred ninety nine
Pour les nombres négatifs: ajouter minus
à son équivalent positif
Format d'opération
Addition: one plus two
Subtraction: one minus two
Multiplication: one time two #Note that for one on the left of multiplication, it is one time and not times.
two times one hundred
Division: forty divided by two
Exemples:
o/p <- input
20 four times five
35 twenty plus fifteen
70 fifty plus five times four
-90 minus one time ninety
25 twenty one minus minus four
45 ninety divided by two
700 one time seven hundred
555 one hundred eleven times two plus three hundred thirty three
99 one hundred plus minus one
45 forty five plus two hundred times zero
4 four
-3 three minus three minus three
C'est le code-golf donc le code le plus court gagne
one times two
. Utilisetime
normal?Réponses:
JavaScript (ES6),
257252249235 octetsEnregistré 3 octets grâce à @Shaggy
Essayez-le en ligne!
Comment?
Nombres
Les opérateurs
Interprétation
la source
Perl 6 ,
170 139 139 129 128 124122 octets-13 octets grâce à nwellnhof!
Essayez-le en ligne!
unival
à la rescousse! Cela bat (actuellement) même des langues de golf comme05AB1E
!Explication:
la source
Python 2 ,
333...284277275 octetsEssayez-le en ligne!
la source
Langue Wolfram
95 9482 octets#
représente l'entrée pour la fonction pure.Si nécessaire,
StringReplace
remplace "time" par times "," plus moins "par" moins "(through"me "->"mes "
,"plus m"->"m
", respectivement). Les formulaires de remplacement raccourcis, suggérés parlirtosiast
, ont permis d'économiser 12 octets.Interpreter["SemanticExpression"]
fait tout le reste.la source
"time "->"times "
vers"me"->"mes"
et"plus minus"->"minus"
vers"plus m"->"m"
?05AB1E ,
166147141139135 octetsBeaucoup trop longtemps .. J'essaierai de jouer au golf d'ici.
-4 octets grâce à @Emigna .
-2 octets grâce à @JoKing .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Voir cette astuce de mes 05AB1E (sections Comment utiliser le dictionnaire? , Comment les chaînes Compresser ne fait pas partie du dictionnaire? Et Comment compresser les grands entiers? ) Pour comprendre comment
“¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š—¿áÓÁÏ“
,'…§
,'°¡
,.•4º»Ÿć'Rþн•
,Ž9o
et“‰´Øè„Æ€ººß“
le travail.Exemple étape par étape:
two hundred twenty two divided by two times minus fifty seven plus three hundred eighteen minus minus ten
two hundred twenty two divided two times minus fifty seven plus three hundred eighteen minus minus ten
2 hundred twenty 2 divided 2 times minus fifty 7 plus 3 hundred 8een minus minus 10
2 hundred weny 2 divided 2 imes minus fify 7 plus 3 hundred 8een minus minus 10
2 hundred weny 2 divided 2 imes minus fify 7 plus 3 hundred 8+10 minus minus 10
2 *100 weny 2 divided 2 imes minus fify 7 plus 3 *100 8+10 minus minus 10
2 *100 2y 2 divided 2 imes minus 5y 7 plus 3 *100 8+10 minus minus 10
2 *100 2 *10 2 divided 2 imes minus 5 *10 7 plus 3 *100 8+10 minus minus 10
["2 *100 2 *10 2 "," 2 "," "," 5 *10 7 "," 3 *100 8+10 "," "," 10"]
[["2","","*100","2","*10","2",""],["","","2",""],["",""],["","5","*10","7",""],["","3","","*100","8+10",""],["",""],["","10"]]
[["2","*100","2","*10","2"],["2"],[],["5","*10","7"],["3","*100","8+10"],[],["10"]]
[["2*100","2*10","2"],["2"],"",["5*10","7"],["3*100","8+10"],"",["10"]]
eval
chacun:[[200,20,2],[2],"",[50,7],[300,18],"",[10]]
[222,2,"",57,318,"",10]
dividedimesminusplusminusminus
[" /"," *"," -"," +"," -"," -"]
222 /2 * -57 +318 - -10
eval
la chaîne, et sortie implicitement:-5999.0
la source
sfk ,
572449423 octetsCela pourrait être une seule ligne, mais pour les lire, j'ai utilisé des sauts de ligne au lieu d'espaces.
Essayez-le en ligne!
la source