Una versión simplista de la calculadora numérica inglesa
Tarea
Escriba un programa que tome una cadena como entrada y genere el resultado de la expresión.
Reglas
La cadena de entrada estará redactada y no será numérica.
No habrá paréntesis.
El orden de cálculo será dividir, multiplicar, restar y luego sumar.
Para las mismas operaciones, los cálculos deben hacerse de izquierda a derecha.
Todos los números de entrada serán enteros de -999 a 999 (ambos incluidos)
La salida será un número entero de cualquier rango.
La división siempre será perfectamente divisible y cero nunca será un denominador.
La restricción de mayúsculas y minúsculas para la entrada es opcional. No tiene que verificar la validez de la entrada.
Formato numérico
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
Para números negativos: agregue minus
a su equivalente positivo
Formato de operación
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
Ejemplos:
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
Este es el código de golf, por lo que el código más corto gana
one times two
. ¿Está usandotime
normal?Respuestas:
JavaScript (ES6),
257252249235 bytesGuardado 3 bytes gracias a @Shaggy
Pruébalo en línea!
¿Cómo?
Números
Operadores
Interpretación
fuente
Perl 6 ,
170 139 129 128 124122 bytes-13 bytes gracias a nwellnhof!
Pruébalo en línea!
unival
al rescate otra vez! Esto (actualmente) incluso supera a los idiomas de golf como05AB1E
!Explicación:
fuente
Python 2 ,
333...284277275 bytesPruébalo en línea!
fuente
Wolfram Language
95 9482 bytes#
representa la entrada para la función pura.Si es necesario,
StringReplace
sustituye a "tiempo" con los tiempos " 'más menos' con 'menos' (a través de"me "->"mes "
,"plus m"->"m
", respectivamente). Los formularios de reemplazo acortados, sugeridos porlirtosiast
, guardaron 12 bytes.Interpreter["SemanticExpression"]
hace todo el restofuente
"time "->"times "
a"me"->"mes"
y"plus minus"->"minus"
a"plus m"->"m"
?05AB1E ,
166147141139135 bytesDemasiado tiempo. Intentaré jugar golf desde aquí.
-4 bytes gracias a @Emigna .
-2 bytes gracias a @JoKing .
Pruébalo en línea o verifique todos los casos de prueba .
Explicación:
Ver este consejo 05AB1E mío (secciones cómo utilizar el diccionario? , ¿Cómo comprimir cadenas que no forman parte del diccionario? Y Cómo comprimir grandes números enteros? ) Para entender cómo
“¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š—¿áÓÁÏ“
,'…§
,'°¡
,.•4º»Ÿć'Rþн•
,Ž9o
, y“‰´Øè„Æ€ººß“
el trabajo.Ejemplo paso a paso:
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
cada uno:[[200,20,2],[2],"",[50,7],[300,18],"",[10]]
[222,2,"",57,318,"",10]
dividedimesminusplusminusminus
[" /"," *"," -"," +"," -"," -"]
222 /2 * -57 +318 - -10
eval
la cadena, y salida implícitamente:-5999.0
fuente
sfk ,
572449423 bytesTodo esto podría ser una línea, pero para leerlo utilicé nuevas líneas en lugar de espacios.
Pruébalo en línea!
fuente