Я <3 условия

11

В конечном итоге в вашем коде много очень длинных, скучных условий:

if flag == 1:

while have != needed:

if type == 7:

Они могут быть преобразованы в их гораздо более привлекательных <3аналогов:

if abs(flag - 1) + 2 <3:

while 3 - abs(have - needed) <3:

if 2 + abs(type - 7) <3:

задача

Ваша задача взять условное и сделать это с точки зрения <3. Единственный интервал, который имеет значение, заключается в том, что между <и 3.

Conditionals будет два выражения разделенным либо ==, !=, >, <, >=или <=.
Выражения будут содержать только сложение, вычитание, унарное отрицание ( -something), где есть одна +или -перед каждой переменной или числом (кроме первой, в которой ничего нет или -перед ней).
Числа будут [0-9]+, а переменные будут [a-z]+. Если ответ необходимо использовать |x|(Абсолютное значение x), используйте abs()функцию. Можно предположить, что все переменные являются целыми числами, а все числовые константы на входе <1000.

Вывод не обязательно должен быть в самой простой форме. Он должен быть условным, как указано выше, это означает, что это только два выражения, разделенных одним условным знаком, но он также может использовать absфункцию, заключающую в себе допустимое выражение, и затем он действует как переменная в терминах достоверности.

Если на входе нет вывода для какого-либо значения переменной, выведите условие, которое всегда ложно, но все еще в терминах <3.

Часть проблемы состоит в том, чтобы выяснить, как это сделать, но вот шаги для have != neededвышеупомянутого:

have != needed
have - needed != 0
abs(have - needed) > 0
-abs(have - needed) < 0
3 - abs(have - needed) <3

счет

Это код-гольф, поэтому выигрывает самый короткий действительный код в байтах.

Контрольные примеры

(Обратите внимание, что эти выводы не единственные, но я попытался их упростить.)

flag == 1
abs(flag - 1) + 2 <3

have != needed
3 - abs(have - needed) <3

type == 7
2 + abs(type - 7) <3

x > y
3 - x + y <3

x + 5 < -y
x + 8 + y <3

x + 6 <= y
x + 8 - y <3

-x >= y + 3
x + y + 5 <3

x < x
3 <3
# Unsimplified; both would be valid outputs.
x - x + 3 <3
Artyer
источник
Всегда ли между входными токенами ровно один пробел?
Дверная ручка
@ Doorknob Нет. Там будет 0 или 1 пробел.
Artyer

Ответы:

3

Сетчатка , 95 байт

<=
<1+
>=
>-1+
(.*)(.=)(.*)
$2abs($1-($3))
==
2+
!=
3-
(.*)>(.*)
$2<$1
(.*)<(.*)
$1-($2)+3
$
<3

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

Довольно наивное решение, но я не смог найти никаких улучшений.

Это всего лишь серия замен:

<=
<1+
>=
>-1+

Избавиться от «или равно» сравнения путем замены x <= yс x < 1 + y, и x >= yс x > -1 + y.

(.*)(.=)(.*)
$2abs($1-($3))

Заменить x == yна ==abs(x - y), и x != yна !=abs(x - y).

==
2+
!=
3-

Заменить ==с 2+и !=с 3-тем, чтобы общие замены стали x == y2 + abs(x - y)и x != y3 - abs(x - y).

(.*)>(.*)
$2<$1

Нормализовать направление оставшихся неравенств, заменив x > yна y < x.

(.*)<(.*)
$1-($2)+3

Заменить x < yна x - y + 3.

$
<3

Добавьте сердце к концу строки.

Дверная ручка
источник