Đánh giá một biểu thức của dấu trừ và dấu ngã


16

Đưa ra một biểu thức khớp với biểu thức chính quy /^[-~]*x$/, đánh giá nó theo xvà xuất ra một chuỗi khớp với biểu thức chính quy /^-?x[+-]\d+$/.

Ví dụ, chuỗi -~xước tính x+1, trong khi chuỗi -~-xước tính -x+1và chuỗi -~-~--xước tính x+2.

Chúng tôi bắt đầu từ xvà đánh giá chuỗi từ phải sang trái. -phủ định thuật ngữ, trong khi ~chuyển đổi ythành -y-1.

Testcase:

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

Đây là . Câu trả lời ngắn nhất trong byte thắng.

Các định dạng đầu vào / đầu ra là nghiêm ngặt. Điều "x"này là bắt buộc.


Chúng ta có thể đầu ra x+010thay vì x+10cho -~-~-~-~-~-~-~-~-~-~x? Nó phù hợp với regex thứ hai.

Bạn có thể, mặc dù tôi thấy không có lý do tại sao.
Leaky Nun

3
Dấu ngã có ý nghĩa khác nhau trong các ngôn ngữ khác nhau. Có lẽ bạn nên làm rõ rằng bạn có ý nghĩa Python
Luis Mendo

3
@LuisMendo đọc câu cuối của đoạn thứ ba của tôi
Leaky Nun

1
@LeakyNun Ah, xin lỗi, tôi không thấy điều đó. Dù sao, tôi nghĩ rằng nó nên xuất hiện sớm hơn. Hai đoạn đầu tiên và một phần của cuộc nói chuyện thứ ba ~trong khi nó chưa được xác định
Luis Mendo

Câu trả lời:



7

Võng mạc , 47 44 byte

+`--|~~

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

Hãy thử trực tuyến! Chỉnh sửa: Đã lưu 3 byte nhờ @MartinEnder. Mở rộng:

+`--|~~

Xóa các cặp trùng lặp liền kề.

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

Đếm số lượng ~s cho chúng ta độ lớn của số hạng.

T`+`-`^~.*

Nếu ký tự đầu tiên là một ~thì thuật ngữ nên âm.

~
-
--

Nếu số ~s và -s là số lẻ thì xnên âm.


6

JavaScript, 59 byte

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

Hãy thử trực tuyến!


2
Đánh bại tôi trong 16 giây và 38 byte. Làm tốt.
Lu-ca

Thất bại cho các trường hợp thử nghiệm chứa nhiều -trong một hàng. (tức là --~-~x)
Lu-ca

@Luke. Tôi không chắc ý của bạn là gì. Kịch bản của tôi làm việc cho các trường hợp thử nghiệm quá.

Điều này còn tồn tại trong bản thử nghiệm mới của tôi: D
Leaky Nun

@ThePirateBay: ôi, nvm rồi ...
Luke



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

Chắc chắn có chỗ cho những cải tiến ..

Giải trình:

Hãy thử nó ở đây.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.