Mengevaluasi ekspresi minus dan tilde

16

Mengingat ekspresi pencocokan regex /^[-~]*x$/, mengevaluasinya dalam hal xdan output string yang cocok regex /^-?x[+-]\d+$/.

Sebagai contoh, string -~xmengevaluasi x+1, sedangkan string -~-xmengevaluasi -x+1, dan string -~-~--xmengevaluasi x+2.

Kami mulai dari xdan mengevaluasi string dari kanan ke kiri. -meniadakan istilah, sementara ~mengkonversi yke -y-1.

Testcases:

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

Ini adalah . Jawabannya terpendek dalam byte menang.

Format input / output sangat ketat. Ini "x"wajib.

bocor Nun
sumber
Bisakah kita menghasilkan x+010bukan x+10untuk -~-~-~-~-~-~-~-~-~-~x? Ini cocok dengan regex kedua.
Anda bisa, meskipun saya tidak melihat alasan mengapa.
Leaky Nun
3
Tilde memiliki arti berbeda dalam bahasa yang berbeda. Anda mungkin harus mengklarifikasi bahwa Anda bermaksud arti Python
Luis Mendo
3
@LuisMendo membaca kalimat terakhir paragraf ketiga saya
Leaky Nun
1
@ LeakyNun Ah, maaf, saya tidak melihat itu. Bagaimanapun, saya pikir itu akan muncul lebih awal. Dua paragraf pertama dan bagian dari pembicaraan ketiga tentang ~sementara belum didefinisikan
Luis Mendo

Jawaban:

7

Retina , 47 44 byte

+`--|~~

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

Cobalah online! Sunting: Disimpan 3 byte berkat @MartinEnder. Perluasan:

+`--|~~

Hapus pasangan duplikat yang berdekatan.

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

Hitung jumlah ~s yang memberi kita besarnya istilah.

T`+`-`^~.*

Jika karakter pertama adalah a ~maka istilah tersebut harus negatif.

~
-
--

Jika jumlah ~s dan -s ganjil maka xharus negatif.

Neil
sumber
6

JavaScript, 59 byte

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

Cobalah online!


sumber
2
Kalahkan saya dengan 16 detik dan 38 byte. Sudah selesai dilakukan dengan baik.
Luke
Gagal untuk kasus uji yang mengandung banyak -sekaligus. (yaitu --~-~x)
Luke
@ Lukas Saya tidak yakin apa maksud Anda. Skrip saya juga berfungsi untuk kasus uji ini.
Ini selamat dari ruang ujian saya yang baru: D
Leaky Nun
@ThePirateBay: oops, nvm then ...
Luke
1

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

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

Cobalah online!

Xcali
sumber
1

C (gcc) , 69 byte

a;s;f(char*p){for(a=s=0;*p;a-=*p++%5*~-s)s^=2;printf("-x%+d"+!!s,a);}

Cobalah online!

-1 byte terima kasih kepada @ThePirateBay

nwellnhof
sumber
0

Java 8, 186 byte

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

Pasti kamar untuk perbaikan ..

Penjelasan:

Coba di sini.

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
sumber