I <3 condicionais

11

Você acaba tendo muitos condicionais longos e chatos no seu código:

if flag == 1:

while have != needed:

if type == 7:

Eles podem ser transformados em seus <3equivalentes de condicionais muito mais amáveis :

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

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

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

Tarefa

Sua tarefa é levar um condicional e torná-lo em termos de <3. O único espaçamento que importa é que não há entre <e 3.

Condicionais serão duas expressões separadas por um ou outro ==, !=, >, <, >=ou <=.
As expressões conterão apenas adição, subtração, negação unária ( -something), onde houver uma +ou -antes de cada variável ou número (exceto a primeira que não tem nada ou -antes dela).
Os números serão [0-9]+e as variáveis ​​serão [a-z]+. Se a resposta precisar usar |x|(O valor absoluto de x), use a abs()função Você pode assumir que todas as variáveis ​​são números inteiros e todas as constantes numéricas na entrada são <1000.

A saída não precisa estar na sua forma mais simples. Ele precisa ser uma condicional como acima, o que significa que são apenas duas expressões, separadas por um sinal condicional, mas também pode usar a absfunção, incluindo uma expressão válida, e depois age como uma variável, em termos de validade.

Se a entrada não tiver uma saída para qualquer valor de uma variável, imprima uma condição que é sempre falsa, mas ainda em termos de <3.

Parte do desafio é descobrir como fazê-lo, mas aqui estão as etapas para o have != neededacima:

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

Pontuação

Isso é código-golfe, então o código válido mais curto, em bytes, vence.

Casos de teste

(Observe que essas saídas não são as únicas, mas tentei simplificá-las.)

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
fonte
Sempre existe exatamente um espaço entre os tokens de entrada?
Maçaneta
@ Doorknob No. Haverá 0 ou 1 espaços.
Artyer

Respostas:

3

Retina , 95 bytes

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

Experimente online!

Uma solução bastante ingênua, mas não consegui encontrar nenhuma melhoria.

Esta é apenas uma série de substituições:

<=
<1+
>=
>-1+

Livre-se das comparações "ou iguais a" substituindo x <= ypor x < 1 + ye x >= ypor x > -1 + y.

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

Substitua x == ypor ==abs(x - y)e x != ycom !=abs(x - y).

==
2+
!=
3-

Substitua ==por 2+e !=com 3-, para que as substituições gerais se tornem x == y2 + abs(x - y)e x != y3 - abs(x - y).

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

Normalize a direção das desigualdades restantes, substituindo x > ypor y < x.

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

Substitua x < ypor x - y + 3.

$
<3

Coloque um coração no final da corda.

Maçaneta da porta
fonte