I <3 condicionales

11

Terminas teniendo muchos condicionales muy largos y aburridos en tu código:

if flag == 1:

while have != needed:

if type == 7:

Estos se pueden transformar en sus <3contrapartes condicionales mucho más adorables :

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

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

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

Tarea

Su tarea es tomar un condicional y hacerlo en términos de <3. El único espacio que importa es que no hay ninguno entre <y 3.

Condicionales serán dos expresiones separadas por cualquiera ==, !=, >, <, >=o <=.
Las expresiones solo contendrán suma, resta, negación unaria ( -something), donde hay una +o -antes de cada variable o número (excepto la primera que no tiene nada o -antes).
Los números serán [0-9]+, y las variables serán [a-z]+. Si la respuesta necesita usar |x|(El valor absoluto de x), use la abs()función. Puede suponer que todas las variables son números enteros y que todas las constantes numéricas en la entrada son <1000.

La salida no necesita estar en su forma más simple. Es necesario que sea un condicional como el anterior, lo que significa que son solo dos expresiones, separadas por un signo condicional, pero también puede usar la absfunción, encerrando una expresión válida, y luego actúa como una variable, en términos de validez.

Si la entrada no tiene una salida para ningún valor de una variable, emite una condición que siempre es falsa, pero aún en términos de <3.

Parte del desafío es descubrir cómo hacerlo, pero aquí están los pasos para lo have != neededanterior:

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

Puntuación

Este es el código de golf, por lo que gana el código válido más corto, en bytes.

Casos de prueba

(Tenga en cuenta que estas salidas no son las únicas salidas, pero intenté simplificarlas).

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
fuente
¿Siempre hay exactamente un espacio entre los tokens de entrada?
Pomo de la puerta
@Doorknob No. Habrá 0 o 1 espacios.
Artyer

Respuestas:

3

Retina , 95 bytes

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

Pruébalo en línea!

Una solución bastante ingenua, pero no he podido encontrar ninguna mejora.

Esto es solo una serie de reemplazos:

<=
<1+
>=
>-1+

Deshágase de las comparaciones "o igual a" reemplazando x <= ycon x < 1 + yy x >= ycon x > -1 + y.

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

Reemplazar x == ycon ==abs(x - y)y x != ycon !=abs(x - y).

==
2+
!=
3-

Reemplace ==con 2+y !=con 3-, de modo que los reemplazos generales se vuelvan x == y2 + abs(x - y)y x != y3 - abs(x - y).

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

Normalice la dirección de las desigualdades restantes, reemplazando x > ycon y < x.

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

Reemplazar x < ycon x - y + 3.

$
<3

Añade un corazón al final de la cadena.

Pomo de la puerta
fuente