Evaluar una expresión de menos y tilde

16

Dada una expresión que coincida con la expresión regular /^[-~]*x$/, evalúela en términos de xy genere una cadena que coincida con la expresión regular /^-?x[+-]\d+$/.

Por ejemplo, la cadena se -~xevalúa como x+1, mientras que la cadena se -~-xevalúa como -x+1, y la cadena se -~-~--xevalúa como x+2.

Comenzamos xy evaluamos la cadena de derecha a izquierda. -niega el término, mientras se ~convierte ya -y-1.

Casos de prueba:

    x  x+0
   ~x -x-1
  -~x  x+1
 ~-~x -x-2
-~-~x  x+2
--~~x  x+0
  ~-x  x-1
 -~-x -x+1

Este es el . La respuesta más corta en bytes gana.

El formato de entrada / salida es estricto. El "x"es obligatorio.

Monja permeable
fuente
¿Podemos generar en x+010lugar de x+10para -~-~-~-~-~-~-~-~-~-~x? Coincide con la segunda expresión regular.
Puedes, aunque no veo por qué.
Leaky Nun
3
La tilde tiene un significado diferente en diferentes idiomas. Probablemente debería aclarar que tiene la intención del significado de Python
Luis Mendo
3
@LuisMendo leyó la última oración de mi tercer párrafo
Leaky Nun
1
@LeakyNun Ah, lo siento, no vi eso. De todos modos, creo que debería aparecer antes. Los primeros dos párrafos y parte de la tercera hablan sobre ~cuando no se ha definido
Luis Mendo

Respuestas:

7

Retina , 47 44 bytes

+`--|~~

((~)|-)*x
$&+$#2
T`+`-`^~.*
~
-
--

Pruébalo en línea! Editar: Guardado 3 bytes gracias a @MartinEnder. Expansión:

+`--|~~

Eliminar pares de duplicados adyacentes.

((~)|-)*x
$&+$#2

Cuente el número de ~s que nos da la magnitud del término.

T`+`-`^~.*

Si el primer carácter es un, ~entonces el término debería ser negativo.

~
-
--

Si el número de ~sy- es impar, entonces xdebería ser negativo.

Neil
fuente
6

JavaScript, 59 bytes

x=>['-'[x.length&1]]+'x'+['+'[(x=eval(x.join` `))<0^0]]+~~x

Pruébalo en línea!


fuente
2
Gáneme por 16 segundos y 38 bytes. Bien hecho.
Lucas
Falla para casos de prueba que contienen múltiples -en una fila. (es decir --~-~x)
Lucas
@Luke. No estoy seguro de qué quieres decir. Mi script también funciona para estos casos de prueba.
Esto sobrevive a mi nuevo caso de prueba: D
Leaky Nun
@ThePirateBay: Uy, nvm entonces ...
Lucas
0

Java 8, 186 bytes

s->{s=s.replaceAll("--|~~","");int l,i=(s.length()-(l=(s=s.replaceAll("-~","")).length()))/2,j=l-(s=s.replaceAll("~","")).length();return(j>0?"-"+s+"-"+-~i:s+"+"+i).replaceAll("--","");}

Definitivamente espacio para mejoras.

Explicación:

Pruébalo aquí

s->{                              // Method with String as both parameter and return-type
  s=s.replaceAll("--|~~","");     //  Remove all "--" and "~~"
  int l,                          //  Temp integer to reduce bytes
      i=(s.length()-(l=(s=s.replaceAll("-~","")).length()))/2,
                                 //  Remove all "-~" and save count in `i`
      j=l-(s=s.replaceAll("~","")).length();
                                 //  Remove all remaining "~" and save count in `j`
   return(j>0?                   //  If `j` is larger than 0:
           "-"                   //   Start with a minus sign
           +s                    //   followed by the remaining `s`
           +"-"                  //   followed by another minus sign
           +-~i                  //   followed by `i+1`
          :                      //  Else:
           s                     //   Start with the remaining `s`
           +"+"                  //   followed by a plus sign
           +i                    //   followed by `i`
         ).replaceAll("--","");  //  And then remove all "--"
}                                // End of method
Kevin Cruijssen
fuente