评估减号和波浪号的表达


16

给定一个与正则表达式匹配的表达式/^[-~]*x$/,请根据对它进行求值x并输出与正则表达式匹配的字符串/^-?x[+-]\d+$/

例如,字符串的-~x计算结果为x+1,而字符串的-~-x计算结果为-x+1,而字符串的-~-~--x计算结果为x+2

我们从头开始x并从右到左评估字符串。-对词取反,而~转换y-y-1

测试用例:

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

这是。以字节为单位的最短答案将获胜。

输入/输出格式严格。该"x"是强制性的。


我们可以输出x+010而不是x+10for -~-~-~-~-~-~-~-~-~-~x吗?它匹配第二个正则表达式。

您可以,尽管我没有理由。
Leaky Nun

3
代字号在不同的语言中具有不同的含义。您可能应该阐明您打算使用Python的含义
Luis Mendo

3
@LuisMendo阅读了我的第三段的最后一句话
Leaky Nun

1
@LeakyNun啊,对不起,我没有看到。无论如何,我认为它应该早些出现。前两段和第三段的一部分讨论了~尚未定义的问题
Luis Mendo

Answers:



7

视网膜47 44字节

+`--|~~

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

在线尝试!编辑:感谢@MartinEnder,节省了3个字节。扩充内容:

+`--|~~

删除成对的相邻重复项。

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

数出~s 的个数,这给了我们该项的大小。

T`+`-`^~.*

如果第一个字符是a,~则该术语应为负。

~
-
--

如果~s和-s 的数目为奇数,则x应当为负。


6

JavaScript,59个字节

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

在线尝试!


2
击败我16秒38字节。做得好。
路加福音

连续包含多个测试用例失败-。(即--~-~x
路加福音

@卢克 我不确定你是什么意思。我的脚本也适用于这些测试用例。

这在我的新测试用例中仍然有效:D
Leaky Nun

@ThePirateBay:哎呀,然后是nvm ...
卢克



0

Java 8,186字节

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

绝对有改进的余地。

说明:

在这里尝试。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.