Оценить выражение минус и тильда

16

Учитывая выражение, соответствующее регулярному выражению /^[-~]*x$/, оцените его с точки зрения xи выведите строку, соответствующую регулярному выражению /^-?x[+-]\d+$/.

Например, строка -~xоценивается как x+1, а строка -~-x- как -x+1, а строка -~-~--x- как x+2.

Мы начинаем с xи оцениваем строку справа налево. -отрицает термин, в то время как ~преобразует yв -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

Это . Кратчайший ответ в байтах побеждает.

Формат ввода / вывода строгий. Это "x"обязательно.

Пропитанная монахиня
источник
Может мы выводим x+010вместо x+10для -~-~-~-~-~-~-~-~-~-~x? Это соответствует второму регулярному выражению.
Вы можете, хотя я не вижу причин, почему.
Утренняя монахиня
3
Тильда имеет разное значение на разных языках. Вы, вероятно, должны уточнить, что вы имеете в виду значение Python
Луис Мендо
3
@LuisMendo прочитайте последнее предложение моего третьего абзаца
Leaky Nun
1
@ LeakyNun Ах, прости, я этого не видел. Во всяком случае, я думаю, что это должно появиться раньше. Первые два абзаца и часть третьего говорят о том, что ~пока оно не определено
Луис Мендо

Ответы:

7

Сетчатка , 47 44 байта

+`--|~~

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

Попробуйте онлайн! Редактировать: 3 байта сохранены благодаря @MartinEnder. Expanation:

+`--|~~

Удалить пары соседних дубликатов.

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

Подсчитать количество ~ s, которое дает нам величину термина.

T`+`-`^~.*

Если первый символ ~ тогда, термин должен быть отрицательным.

~
-
--

Если число ~s и -s нечетно, то xдолжно быть отрицательным.

Нил
источник
6

JavaScript, 59 байт

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

Попробуйте онлайн!


источник
2
Ударь меня на 16 секунд и 38 байтов. Отлично сработано.
Люк
Сбой для тестовых случаев, содержащих несколько -строк подряд. (то есть --~-~x)
Люк
@Luke. Я не уверен, что ты имеешь в виду. Мой скрипт работает и для этих тестовых случаев.
Это переживает мой новый тест: 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
Кевин Круйссен
источник