Bewerten Sie einen Ausdruck von Minus und Tilde

16

/^[-~]*x$/Bewerten Sie einen Ausdruck, der mit dem regulären Ausdruck übereinstimmt , xund geben Sie einen String aus, der mit dem regulären Ausdruck übereinstimmt /^-?x[+-]\d+$/.

Beispielsweise wird die Zeichenfolge als -~xausgewertet x+1, während die Zeichenfolge als -~-xausgewertet -x+1wird und die Zeichenfolge als -~-~--xausgewertet wird x+2.

Wir beginnen xmit der Zeichenfolge und werten sie von rechts nach links aus. -negiert den Ausdruck und ~konvertiert yin -y-1.

Testfälle:

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

Das ist . Kürzeste Antwort in Bytes gewinnt.

Das Eingabe- / Ausgabeformat ist streng. Das "x"ist obligatorisch.

Undichte Nonne
quelle
Können wir x+010statt x+10für ausgeben -~-~-~-~-~-~-~-~-~-~x? Es entspricht dem zweiten regulären Ausdruck.
Sie können, obwohl ich keinen Grund sehe, warum.
Undichte Nonne
3
Die Tilde hat in verschiedenen Sprachen unterschiedliche Bedeutungen. Sie sollten wahrscheinlich klarstellen, dass Sie die Python-Bedeutung beabsichtigen
Luis Mendo
3
@ LuisMendo las den letzten Satz meines dritten Absatzes
Leaky Nun
1
@LeakyNun Ah, sorry, das habe ich nicht gesehen. Sowieso denke ich, dass es früher erscheinen sollte. Die ersten beiden Absätze und ein Teil des dritten Vortrags, über den ~noch nichts bekannt ist
Luis Mendo

Antworten:

7

Netzhaut , 47 44 Bytes

+`--|~~

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

Probieren Sie es online! Bearbeiten: 3 Bytes dank @MartinEnder gespeichert. Erweiterung:

+`--|~~

Löschen Sie Paare benachbarter Duplikate.

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

Zählen Sie die Anzahl von ~s, die uns die Größe des Terms gibt.

T`+`-`^~.*

Wenn das erste Zeichen ein ~ist, sollte der Begriff negativ sein.

~
-
--

Wenn die Anzahl von ~s und -s ungerade ist, xsollte das negativ sein.

Neil
quelle
6

JavaScript, 59 Bytes

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

Probieren Sie es online!


quelle
2
Schlage mich mit 16 Sekunden und 38 Bytes. Gut gemacht.
Luke
Schlägt für Testfälle fehl, die mehrere -in einer Reihe enthalten. (ie --~-~x)
Luke
@ Luke. Ich bin mir nicht sicher, was du meinst. Mein Skript funktioniert auch für diese Testfälle.
Das überlebt meinen neuen Testfall: D
Leaky Nun
@ThePirateBay: Hoppla, nvm dann ...
Luke
1

Perl 5 , 75 + 1 (-n) = 76 Bytes

map{$y=-$y;$y--if/~/}reverse/-|~/g;printf"%sx%+d",((-1)**y/-~//)=~s/1//r,$y

Probieren Sie es online!

Xcali
quelle
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("--","");}

Auf jeden Fall Raum für Verbesserungen.

Erläuterung:

Probieren Sie es hier aus.

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
quelle