マイナスとチルダの式を評価する


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"必須です。


forのx+010代わりに出力できますか?2番目の正規表現に一致します。x+10-~-~-~-~-~-~-~-~-~-~x

理由はわかりませんが、できます。
リーキー修道女

3
チルダは、言語によって意味が異なります。Pythonの意味を意図していることをおそらく明確にする必要があります
ルイスメンドー

3
@LuisMendoは私の3番目の段落の最後の文を読みました
Nun

1
@LeakyNunああ、すみません、私はそれを見ませんでした。とにかく、私はそれが以前に表示されるはずだと思います。最初の2つの段落と約3分の話の一部~、それが定義されていないながら
ルイスMendo

回答:



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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.