Оцініть вираз мінусу та нахилу


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+10для -~-~-~-~-~-~-~-~-~-~x? Він відповідає другому регексу.

Ви можете, хоча я не бачу причин, чому.
Leaky Nun

3
Тильда має різні значення в різних мовах. Вам, мабуть, варто уточнити, що ви маєте намір значення Python
Луїс Мендо

3
@LuisMendo прочитав останнє речення мого третього абзацу
Leaky Nun

1
@LeakyNun Ах, вибачте, я цього не бачив. У будь-якому випадку, я думаю, це повинно з’явитися раніше. Перші два абзаци та частина третього розповідають, ~поки це не було визначено
Луїс Мендо

Відповіді:



7

Сітківка , 47 44 байт

+`--|~~

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

Спробуйте в Інтернеті! Редагувати: збережено 3 байти завдяки @MartinEnder. Пояснення:

+`--|~~

Видаліть пари сусідніх дублікатів.

((~)|-)*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: oops, nvm then…
Лука



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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.