Oceń wyrażenie minus i tyldy

16

Biorąc pod uwagę wyrażenie pasujące do wyrażenia regularnego /^[-~]*x$/, oceń je pod względem xi wypisz ciąg pasujący do wyrażenia regularnego /^-?x[+-]\d+$/.

Na przykład ciąg -~xocenia na x+1, podczas gdy ciąg -~-xocenia na -x+1, a ciąg -~-~--xocenia na x+2.

Zaczynamy od xi oceniamy ciąg znaków od prawej do lewej. -neguje termin, a ~konwertuje yna -y-1.

Przypadki testowe:

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

To jest . Najkrótsza odpowiedź w bajtach wygrywa.

Format wejścia / wyjścia jest ścisły. Jest "x"to obowiązkowe.

Leaky Nun
źródło
Możemy wyjście x+010zamiast x+10za -~-~-~-~-~-~-~-~-~-~x? Pasuje do drugiego wyrażenia regularnego.
Możesz, choć nie widzę powodu, dla którego to zrobiłeś.
Leaky Nun
3
Tylda ma różne znaczenie w różnych językach. Prawdopodobnie powinieneś wyjaśnić, że masz na myśli Python
Luis Mendo
3
@LuisMendo przeczytał ostatnie zdanie mojego trzeciego akapitu
Leaky Nun
1
@LeakyNun Ah, przepraszam, nie widziałem tego. W każdym razie myślę, że powinno się to pojawić wcześniej. Pierwsze dwa akapity i część trzeciego mówią o ~tym, jak nie zostało zdefiniowane
Luis Mendo

Odpowiedzi:

7

Retina , 47 44 bajtów

+`--|~~

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

Wypróbuj online! Edycja: Zapisano 3 bajty dzięki @MartinEnder. Wyjaśnienie:

+`--|~~

Usuń pary sąsiadujących duplikatów.

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

Policz liczbę ~s, która daje nam wielkość tego terminu.

T`+`-`^~.*

Jeśli pierwszym znakiem jest a, ~to termin powinien być ujemny.

~
-
--

Jeżeli liczba ~s i -s jest nieparzysta, to xpowinna być ujemna.

Neil
źródło
6

JavaScript, 59 bajtów

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

Wypróbuj online!


źródło
2
Pokonaj mnie o 16 sekund i 38 bajtów. Dobra robota.
Łukasz
Nie -działa w przypadku przypadków testowych zawierających wiele z rzędu. (tj. --~-~x)
Łukasz
@Łukasz. Nie jestem pewien, co masz na myśli. Mój skrypt działa również dla tych przypadków testowych.
To przetrwało moją nową próbę: D
Leaky Nun
@ThePirateBay: ups, nvm następnie ...
Luke
1

Perl 5 , 75 + 1 (-n) = 76 bajtów

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

Wypróbuj online!

Xcali
źródło
0

Java 8, 186 bajtów

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

Zdecydowanie miejsce na ulepszenia ..

Wyjaśnienie:

Wypróbuj tutaj.

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
źródło