Evaluar una expresión omnifix dada.
Omnifix es como la notación infija de las matemáticas normales, pero con copias adicionales de cada símbolo que rodea los argumentos. Los símbolos externos toman el lugar de paréntesis y, por lo tanto, no hay necesidad de paréntesis adicionales.
Debe admitir sumas, restas, multiplicaciones, divisiones y números reales positivos (se pueden escribir los negativos -0-n-
) dentro de un rango razonable para su idioma.
Más y menos deben ser +
y -
, pero puede usar *
o ×
por tiempos y / /
o ÷
dividir. Otros símbolos razonables serán permitidos a pedido.
Brownie señala la explicación y características adicionales (como operaciones adicionales, números negativos, cadenas, etc.) Incluso si su respuesta no tiene estas características, no dude en mostrar cómo podría.
Proporcione un enlace para probar su solución si es posible.
Ejemplos
Para mayor claridad, las explicaciones a continuación usan un alto menos ( ¯
) para indicar números negativos. Puede devolver números negativos utilizando cualquier formato razonable.
-5-2-
→ 3
+2+×3×2×+
→ 8
( +2+×3×2×+
→ +2+6+
→ 8
)
-14--3-1--
→ 12
( -4--3-1--
→ -14-2-
→ 12
)
+2.1+×3.5×2.2×+
→ 9.8
( +2.1+×3.5×2.2×+
→ +2.1+7.7+
→ 9.8
)
×3×÷-0-6-÷2÷×
→ -9
( ×3×÷-0-6-÷2÷×
→ ×3×÷¯6÷2÷×
→ ×3ׯ3×
→ ¯9
)
÷4÷-3-÷1÷2÷-÷
→ 1.6
( ÷4÷-3-÷1÷2÷-÷
→ ÷4÷-3-0.5-÷
→ ÷4÷2.5÷
→ 1.6
)
The explanations below use high minus (`¯`) to indicate negative numbers.
Definitivamente te encanta APL.-
s puede confundirse con-
s, mientras que¯
s no puede confundirse con-
s.Respuestas:
C # (.NET Core) ,
198 197188 bytesPruébalo en línea!
Usos
*
y/
.Una función recursiva. Primero intenta analizar la cadena de entrada como a
float
. Si falla, se hace pasar recursivamente como argumentos el primer y segundo operandos y luego realiza la operación seleccionada en los resultados.fuente
IndefOf(f, 1)
puede serIndexOf(f,1)
float
s en su lugar, use los códigos char, cuando los tenga probablemente pueda acortarlos con>
y<
en un par de lugares.i+1,s.Length-i-2
a un byte++i,s.Length+~i
.Python 3,
159158152144136135132 bytesPruébalo en línea!
No permite números negativos (aunque
-0-5-
funciona, por supuesto) y requiere operadores de python.fuente
while~-(l[i]in'+-*/'):i+=1;a=1
y*l,=input()
por 152 bytesif a:l[i]='(';i=t(t(i+1));l[i-1]=')'
conreturn-~i
para 135 bytes: PRetina ,
290287286 bytesPruébalo en línea! Nota: Solo es capaz de aritmética de enteros, por lo que se han eliminado algunos de los casos de prueba. Acepta y devuelve números negativos usando el
¯
prefijo. Editar: Guardado34 bytes gracias a @Cowsquack. Explicación:Necesitaba alguna forma de manejar el cero, así que lo uso
¦
como prefijo de número positivo. Los números se convierten a unario.Pero los números negativos solo necesitan un
¯
prefijo.Citar
+
s se pone feo, así que convierto las sumas en restas.Si el valor absoluto del LHS de una resta es menor que el RHS, cámbielos y niegue ambos lados.
Además, si el LHS de una multiplicación o división es negativo, niegue ambos lados.
Además, si el LHS de una multiplicación es cero, entonces el resultado es cero. Además, dos desventajas hacen una ventaja.
Pero un menos y un más (o viceversa) hacen un menos.
Resta dos números del mismo signo. Haga esto repetidamente hasta que no queden tales restas.
Si todavía hay una resta, los signos deben ser diferentes, así que suma los números. (Pero solo haga esto una vez, ya que esto puede revelar una resta de dos números del mismo signo nuevamente).
Realizar multiplicación por suma repetida.
Realizar división entera. Uno de los pasos anteriores habrá simplificado la expresión, así que retrocede hasta que no queden operaciones.
Convertir de nuevo a decimal.
fuente
+`-(([¯¦])1*)(1*)-\2\3-
,[¯¦]
puede convertirse¯|¦
([×÷])
;)PHP ,
116114109 bytes-5 gracias a Martin Ender
Usos
*
para multiplicación y/
para división. Los números negativos funcionan a pesar de que no hice ningún intento específico para que ese sea el caso.Pruébalo en línea!
Sin golf y explicado
También explicaré la expresión regular porque es un poco mágica:
Primero, queremos igualar cualquiera de los cuatro operadores:
*+/-
Luego, debemos hacer coincidir un número
[\d.]+
u otra expresión omnifix válida(?R)
.Luego, hacemos coincidir el mismo operador que estaba al principio.
Luego hacemos lo mismo que hicimos en el grupo 3: unir un número o una expresión omnifix.
Finalmente, haga coincidir el operador inicial nuevamente.
Lo que coincida con esto se reemplaza con
($2)
. Esto toma la parte dentro de los operadores circundantes y lo pone entre paréntesis, por lo que parece una notación infija normal.fuente
QuadR ,
333227 bytes-1 gracias a Cows Quack . -5 gracias a Erik the Outgolfer .
con el argumento / bandera
≡
Pruébalo en línea!
Esto es equivalente a la solución Dyalog APL de 40 bytes:
Pruébalo en línea!
Explicación
(el texto entre paréntesis se refiere a Dyalog APL en lugar de QuadR)
(
...){2}\2
el siguiente patrón dos veces, y todo el partido dos veces demasiado:(.)
cualquier carácter[
...]+
seguido de uno o más de los siguientes conjunto de caracteres:\d
d igits,¯
alta menos (signo negativo)\.
período(
⎕R
Se R eplaced con :)(
{
...}
el resultado de la siguiente función anónima aplicada al espacio de nombres ⍵ :)⍵M
(⍵.Match
) el texto de M atch¯1↓
suelta el último carácter (el símbolo+
-
×
o÷
)1↓
suelta el primer carácter (símbolo)⍎
ejecutar como código APL(
⍕
stringify)≡
(⍣≡
) repita el reemplazo hasta que no ocurran más cambiosfuente
⍕
⎕R
no puede funcionar con datos numéricos. Gracias.Haskell , 132 caracteres
(134 bytes, porque
×
y÷
toma dos bytes en UTF-8)Pruébalo en línea!
f
analiza la mayor cantidad de entrada posible y produce el resultado, así como la cadena restante (que está vacía en los casos de prueba). Si eso no cumple con las reglas, pele la cadena del resto que no se puede analizar conHaskell , 139 caracteres
fuente
Perl,
6453 bytesIncluir
+1
para-p
Accidentalmente también implementa
,
(desecha el primer argumento) y, a veces.
(agrega los argumentos juntos)..
sin embargo, no funciona de manera muy confiable ya que interfiere con el punto decimal tanto en el nivel de análisis como en el nivel de evaluaciónfuente
Java 8,
205200 bytesPuerto de la respuesta C # de @Charlie .
-5 bytes gracias a @ceilingcat .
Pruébalo en línea.
fuente