I <3 conditionnels

11

Vous finissez par avoir beaucoup de conditions très longues et ennuyeuses dans votre code:

if flag == 1:

while have != needed:

if type == 7:

Ceux-ci peuvent être transformés en leurs <3homologues conditionnels beaucoup plus adorables :

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

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

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

Tâche

Votre tâche consiste à prendre un conditionnel et à le faire en termes de <3. Le seul espacement qui compte est qu'il n'y en a pas entre <et 3.

Conditionals seront deux expressions séparées par une ou l' autre ==, !=, >, <, >=ou <=.
Les expressions ne contiendront que l'addition, la soustraction, la négation unaire ( -something), où il y a une +ou -avant chaque variable ou nombre (sauf la première qui n'a rien ou -avant).
Les nombres le seront [0-9]+et les variables le seront [a-z]+. Si la réponse doit utiliser |x|(La valeur absolue de x), utilisez la abs()fonction. Vous pouvez supposer que toutes les variables sont des entiers et que toutes les constantes numériques de l'entrée sont <1000.

La sortie n'a pas besoin d'être sous sa forme la plus simple. Il doit s'agir d'un conditionnel comme ci-dessus, ce qui signifie qu'il ne s'agit que de deux expressions, séparées par un signe conditionnel, mais il peut également utiliser la absfonction, entourant une expression valide, puis il agit comme une variable, en termes de validité.

Si l'entrée n'a de sortie pour aucune valeur d'une variable, sortez une condition qui est toujours fausse, mais toujours en termes de <3.

Une partie du défi consiste à trouver comment le faire, mais voici les étapes pour ce qui have != neededprécède:

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

Notation

Il s'agit de code-golf, donc le code valide le plus court, en octets, gagne.

Cas de test

(Remarque, ces sorties ne sont pas les seules sorties, mais j'ai essayé de les simplifier.)

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
la source
Y a-t-il toujours exactement un espace entre les jetons d'entrée?
Poignée de porte
@ Doorknob No. Il y aura 0 ou 1 espace.
Artyer

Réponses:

3

Rétine , 95 octets

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

Essayez-le en ligne!

Une solution plutôt naïve, mais je n'ai pu trouver aucune amélioration.

Ce n'est qu'une série de remplacements:

<=
<1+
>=
>-1+

Supprimez les comparaisons "ou égal à" en remplaçant x <= ypar x < 1 + yet x >= ypar x > -1 + y.

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

Remplacez x == ypar ==abs(x - y)et x != ypar !=abs(x - y).

==
2+
!=
3-

Remplacez ==par 2+et !=par 3-, de sorte que les remplacements globaux deviennent x == y2 + abs(x - y)et x != y3 - abs(x - y).

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

Normaliser la direction des inégalités restantes, en remplaçant x > ypar y < x.

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

Remplacez x < ypar x - y + 3.

$
<3

Ajoutez un cœur à la fin de la chaîne.

Poignée de porte
la source