Digamos que tengo una expresión:
9 * 8 + 1 - 4
Esta expresión se puede interpretar de seis maneras diferentes, dependiendo de la precedencia del operador:
(((9 * 8) + 1) - 4) = 69 (* + -)
((9 * 8) + (1 - 4)) = 69 (* - +)
((9 * (8 + 1)) - 4) = 77 (+ * -)
(9 * ((8 + 1) - 4)) = 45 (+ - *)
((9 * 8) + (1 - 4)) = 69 (- * +)
(9 * (8 + (1 - 4))) = 45 (- + *)
Digamos que soy un desarrollador, y no tengo ganas de memorizar tablas de precedencia, etc., así que solo voy a adivinar.
En este caso, el mayor margen de error sería 45-77, que es una diferencia de 32. Esto significa que mi suposición solo se desactivará en un máximo de 32.
El reto
Dada una expresión que consiste en los números y +
, -
, *
, /
(división entera) y%
, la producción de la diferencia absoluta de la más grande y el más pequeño valor posible para que la expresión, en base a la precedencia de operadores.
Especificaciones
- La expresión de entrada no contendrá paréntesis y cada operador es asociativo a la izquierda.
- La expresión de entrada solo contendrá enteros no negativos. Sin embargo, las subexpresiones pueden evaluar negativas (p
1 - 4
. Ej .). - Puede tomar la expresión en cualquier formato razonable. Por ejemplo:
"9 * 8 + 1 - 4"
"9*8+1-4"
[9, "*", 8, "+", 1, "-", 4]
[9, 8, 1, 4], ["*", "+", "-"]
- La entrada contendrá al menos 1 y como máximo 10 operadores.
- Cualquier expresión que contenga una división o módulo por 0 debe ignorarse.
- Puede suponer que el módulo no recibirá operandos negativos.
Casos de prueba
9 * 8 + 1 - 4 32
1 + 3 * 4 3
1 + 1 0
8 - 6 + 1 * 0 8
60 / 8 % 8 * 6 % 4 * 5 63
code-golf
number
arithmetic
expression-building
Fruta Esolanging
fuente
fuente
%
como si tuvieras dos precedentes diferentes en tu segundo ejemplo.%
funciona el operador en números negativos? ¿Como C o Python o algo más?Respuestas:
Python 2 ,
171156 bytesPruébalo en línea!
Cómo funciona
Rodeamos a cada operador con un número diferente de pares de paréntesis hacia afuera para simular diferentes precedencias (en todas las formas posibles), y envolvemos suficientes pares de paréntesis hacia adentro alrededor de toda la cadena, para obtener una expresión que podamos
eval
. Por ejemplo, con+
↦)+(
*
↦))*((
-
↦)))-(((
obtenemos
9 * 8 + 1 - 4
↦(((9 ))*(( 8 )+( 1 )))-((( 4)))
=77
.fuente
or
exteriorsum
para eliminar una capa de corchetes: ensum([...],[])or[eval(a)]
lugar desum([...]or[[eval(a)]],[])
sum
puede estar vacío sin que su argumento esté vacío; sin embargo, en realidad está bien porqueeval
debe fallar en ese caso. Gracias.Jalea , 126 bytes
"¿Precedencia del operador? Paréntesis? Pah, ¿quién necesita eso?" - desafíos de usar Jelly para un desafío de precedencia del operador.
Pruébalo en línea!
La entrada se toma como una cadena, por ejemplo, "1 + 2_3 × 4: 5% 6". Tenga en cuenta que la multiplicación usa "×" en lugar de "*", la división usa ":" en lugar de "/", y la resta usa "_" en lugar de "-".
Cómo funciona El programa se divide en tres partes: genera todas las expresiones de precedencia de operadores diferentes, las evalúa y devuelve la diferencia entre el máximo y el mínimo.
Todas las expresiones se generan con el código:
Los enlaces se evalúan con esto (probablemente podría mejorar con una estructura diferente):
La diferencia entre el máximo y el mínimo se calcula con el código en el enlace (5):
fuente
Python 2 ,
235234233226 bytes-1 byte (y una solución) gracias a Anders Kaseorg !
-7 bytes gracias a Step Hen !
Pruébalo en línea!
fuente
a
sea una tupla en lugar de una lista, e incluso guardar 1 byte al hacerlo (a=()
,a+=eval(*l),
).Haskell 582 bytes
Esto no fue tan bien como esperaba ...
¡Pruébelo en línea!
Intentar jugar golf en un programa largo solo me hace escribir un código incorrecto :(
Traté de usar el algoritmo de Anders en Haskell, pero se salió de mi control
La función e es como un caso específico de eval. (#) toma una lista de cadenas que representan enteros y una cadena de operadores y devuelve la diferencia entre los valores máximos y mínimos posibles. p.ej
fuente
#
##
e
(#)
(n#s)(x:a)=...
r=read;j=zipWith;o=map
y luego reemplace esas funciones con los alias de letras.Pyth, 45 bytes
Estoy seguro de que se puede hacer mucha más optimización, pero hasta ahora me gusta.
Toma de entrada de la siguiente manera:
[9, 8, 1, 4], ["*", "+", "-"]
.Pruébalo en línea!
fuente
Mathematica,
186164159 bytes\[Function]
Toma 3 bytes.Algunas alternativas (mantiene el bytecount igual)
#2-#&@MinMax[...]
para reemplazarMax@#-Min@#&[...]
Head@#2
para reemplazar#2[[0]]
Pruébelo en línea en http://sandbox.open.wolframcloud.com : ingrese
( .... )[{60, "/", 8, "%", 8, "*", 6, "%", 4, "*", 5}]
con el....
código reemplazado por el anterior para el caso de prueba60 / 8 % 8 * 6 % 4 * 5
. PresioneShift + enter
para evaluar.fuente
Javascript, 280 bytes
Nota : La división de enteros se redondea utilizando la función de piso, lo que significa que los números negativos se redondean desde cero.
Esta solución se basa en esta respuesta .
Fragmento de código de ejemplo:
fuente
a/b|0
detiene la comprobación de error de división / módulo 0, peroMath.floor(a/b)
funcionóHaskell , 254 bytes
Pruébalo en línea!
La entrada es una cadena completa, como 4 + 5 * 2. Genera todas las permutaciones de operaciones, y para cada permutación divide la cadena de forma recursiva. Filtra las divisiones por 0 con la lista mónada.
fuente
(%)
es operador de módulo. Es el resto de una operación de división entre el argumento izquierdo y el argumento derecho.Python 2 ,
262256254 bytesPruébalo en línea!
fuente
in [
ain[
(no se necesita espacio)PHP , 316 bytes
Pruébalo en línea!
fuente
Python 3 , 284 bytes
Editar: parece que algo está mal al evaluar el último ejemplo. Lo investigaré mañana.
Otra respuesta de Python. No podía superar a todos los demás, pero pasé demasiado tiempo en esto para no soportarlo.
Pruébalo en línea!
fuente
while(p)
puede convertirsewhile p
por un byte guardado.Clojure (+ combinatoria),
342377 + 41 = 418 bytes+35 bytes debido a un error.
Pruébalo en línea!
Para que esta función funcione, debe acceder a
use
laclojure.math.combinatorics
biblioteca (41 bytes):Matices:
Esta función es anónima, lo que significa que debe hacer esto para usarla:
Además, estoy usando la palabra en
quot
lugar de/
(ya que Clojure hace la división de fracciones por defecto) y enmod
lugar de%
.Programa sin golf:
fuente
use
declaración.The characters used to import the library will likely be counted
codegolf.meta.stackexchange.com/questions/10225/…require
necesidades deben incluirse en el código y su longitud debe agregarse al recuento de bytes.JavaScript (ES6), 210 bytes
Ingresar como un conjunto de números y operadores
Menos golf
Prueba
fuente