Debe escribir un programa para evaluar una cadena que se ingresaría en una calculadora.
El programa debe aceptar la entrada y salida de la respuesta correcta. Para los idiomas que no tienen funciones estándar de entrada / salida, puede asumir las funciones readLine
y print
.
Requisitos
- No utiliza ningún tipo de funciones "eval"
- Puede manejar coma flotante y números negativos
- Admite al menos los operadores +, -, * y /
- Puede manejar la entrada que contiene uno o más espacios entre los operadores y los números
- Evalúa la expresión de izquierda a derecha.
El programa que es el más corto gana. En caso de empate, el programa que se presentó primero gana.
Puede suponer que la entrada es válida y sigue el formato correcto
Casos de prueba
Entrada
-4 + 5
Salida
1
Entrada
-7.5 / 2.5
Salida
-3
Entrada
-2 + 6 / 2 * 8 - 1 / 2.5 - 18
Salida
-12
code-golf
math
arithmetic
Kevin Brown
fuente
fuente
Respuestas:
Ruby -
74696765 caracteresfuente
b[0],b[1].to_f
se puede reemplazar|b|
con|b,c|
y el usob,c.to_f
a.send(b,c.to_f)
usara.send b,c.to_f
. Se ahorra un char$<
lugar deARGF
Befunge -
37 x 5 = 18538 x 3 = 114 caracteresEsto está limitado a números enteros ya que Befunge no tiene soporte de coma flotante.
Explicación
La mayor característica distintiva de Befunge es que, en lugar de ser un conjunto lineal de instrucciones como la mayoría de los idiomas; Es una cuadrícula 2D de instrucciones de un solo carácter, donde el control puede fluir en cualquier dirección.
El primero
&
simplemente ingresa el primer número. Elv
y>
luego redirige el control a la ruta principal en la segunda fila.Esto ingresa un carácter (
~
), lo duplica (:
), empuja cero a la pila (0
), muestra los dos elementos superiores y determina si el segundo es mayor que el primero (`
me sorprende que no pueda usar `` para obtener código backticks. ), invierte la veracidad del elemento superior (!
), luego va a la derecha si es cero, de lo contrario hacia abajo (#v_
).Básicamente es verificar si la entrada
-1
no representa más entradas.Si la entrada fue
-1
entonces, el valor de entrada duplicado se descarta ($
), la parte superior de la pila se emite como un entero (.
) y el programa se detiene (@
).De lo contrario, se repite un proceso similar para determinar si la entrada es menor o igual que un espacio. Si es un espacio, entonces el control se cae, de lo contrario, los cabezales de control están a la derecha.
Si es un espacio, se redirige a la izquierda (
<
); el programa halt (@
), output (.
) y right redirection (>
) se omiten usando#
; pero el descarte se ejecuta para eliminar el espacio de la pila. Finalmente se redirige para comenzar la próxima ejecución (^
).Si no era un espacio, el mismo proceso se usa para dividir si está dentro
[+, *]
o dentro[-, \]
entrando yendo hacia la derecha y hacia arriba respectivamente.Porque
[+, *]
nuevamente se divide para determinar si es a+
o a*
. Si+
se dirige hacia abajo, el siguiente número es input (&
) y se agregan (+
), el control se envuelve y se redirige a la ruta principal para el siguiente carácter. Si*
luego ingresa (&
) y multiplica (*
), entonces se envuelve directamente.Porque
[-, \]
comienza por la derecha en dirección a la izquierda. Se#
omiten los caracteres después de ellos, por lo que la ruta inicial es la"-"`_
que simplemente determina si es-
o/
. Si es/
así, continúa a la izquierda para ingresar (&
) y dividir (/
). Si es-
así, se dirige hacia la derecha, nuevamente omitiendo caracteres para que se ejecute, lo que da como&"-"$-
resultado que se ingrese el número (&
), el-
carácter se empuje a la pila y luego se descarte ("-"$
) y luego se calcule la resta (-
). El control se redirige a la ruta principal.fuente
Python 3, 105 bytes
Administra las cuatro operaciones básicas, pero solo cuesta 5 caracteres cada una para agregar
^
o agregar%
.La precedencia de las operaciones es de izquierda a derecha.
fuente
Pitón (156)
fuente
C -
168126caracteresfuente
Tcl 8.6,
5748 caracteres.Entrada de argumentos:
De Stdin (
6453 )Debe usar el shell interactivo para ambas soluciones.
Trato a la entrada como lista (Tcl utiliza espacios como delimitador) tomar el primer elemento y asignarlo a
a
, entonces camino sobre el resto, teniendo 2 elementos cada vez, el operador y un segundo número, aplicar el operador de$a
y$b
y asignar el resultado aa
. Al final el resultado está adentroa
.fuente
lmap
lo queforeach
es un buen reemplazo.Haskell:
124114 caracteresUna respuesta bastante directa, que utiliza la coincidencia de patrones y una declaración de caso simple para el trabajo pesado. Uso:
fuente
((case m of{..})(read u)(read b))
que puedas escribir((case m of{..}$read u)$read b)
, 2 caracteres menos.C:
111108caracteresCumple todos los requisitos, uso:
fuente
~scanf
puede reemplazar+1
. Además,c^45
->c%5
yc^42
->c%2
deberían funcionar.C ++ 0x
205203198194 caracteresBien formateado:
fuente
Perl (97)
leer de argumentos
leer de entrada
fuente
PostScript (145)
Otra entrada de PostScript (¡gracias a luser droog por excavar los campos de golf interesantes para PostScript!):
Sin golf:
fuente
Python - 308
Versión legible:
Toma la expresión como argumento de línea de comando, salida en salida estándar.
fuente
Posdata (340)
Y un poco más legible:
fuente
JavaScript (208 caracteres compactados)
Para mayor claridad, este es el código antes de compactarlo ( JS-Fiddle ):
Aquí se compacta hasta 208 caracteres ( JS-Fiddle ):
Como estoy terminando líneas con punto y coma, se ignoraron todos los espacios en blanco extraíbles para el recuento de caracteres, pero se dejaron en claro.
fuente
Haskell - 124
El resultado será envuelto en
Maybe
mónadaTambién requiere importar
<*>
desdeControl.Applicative
, pero las importaciones se pueden hacer fuera del código, así que espero que esté permitido.fuente
C#
(234)(231)(229)(223)(214)fuente
JavaScript (87 caracteres)
fuente
Java 11, 151 (como función lambda)
La función Lambda toma una entrada de cadena y emite un flotante.
Pruébalo en línea.
Java 11, 241 bytes (como programa completo con E / S solicitadas)
Programa completo que toma una línea de cadena a través de STDIN y la envía a STDOUT.
Pruébalo en línea.
Explicación:
fuente
05AB1E , 30 bytes
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Si
eval
se permitiera un incorporado, este podría ser un enfoque alternativo ( 16 bytes ):Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Esto cambiaría
"-2 + 6 / 2 * 8 - 1 / 2.5 - 18"
a"((((((-2)+6)/2)*8)-1)/2.5)-18"
antes de usar eleval
incorporado (usar.E
directamente daría al operador la precedencia de*/
over+-
, de ahí la conversión con paréntesis primero).fuente