I <3 Bedingungen

11

Sie haben am Ende viele sehr lange, langweilig aussehende Bedingungen in Ihrem Code:

if flag == 1:

while have != needed:

if type == 7:

Diese können in ihre viel liebenswerteren <3Gegenstücke umgewandelt werden:

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

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

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

Aufgabe

Ihre Aufgabe ist es, eine Bedingung zu nehmen und sie in Bezug auf zu machen <3. Der einzige Abstand, der zählt, ist, dass es keinen zwischen <und gibt 3.

Conditionals werden zwei Ausdrücke , die durch entweder getrennt sein ==, !=, >, <, >=oder <=.
Ausdrücke enthalten nur Addition, Subtraktion und unäre Negation ( -something), wenn es eine +oder -vor jeder Variablen oder Zahl gibt (außer der ersten, die nichts oder -davor hat).
Zahlen werden sein [0-9]+und Variablen werden sein [a-z]+. Wenn die Antwort verwendet werden muss |x|(Der absolute Wert von x), verwenden Sie die abs()Funktion. Sie können davon ausgehen, dass alle Variablen Ganzzahlen sind und alle Zahlenkonstanten in der Eingabe <1000 sind.

Die Ausgabe muss nicht in der einfachsten Form vorliegen. Es muss eine Bedingung wie oben sein, was bedeutet, dass es sich nur um zwei Ausdrücke handelt, die durch ein Bedingungszeichen getrennt sind. Es kann jedoch auch die absFunktion verwenden, die einen gültigen Ausdruck einschließt, und sich dann in Bezug auf die Gültigkeit wie eine Variable verhalten.

Wenn die Eingabe keine Ausgabe für einen Wert einer Variablen hat, geben Sie eine Bedingung aus, die immer falsch ist, aber immer noch in Bezug auf <3.

Ein Teil der Herausforderung besteht darin, herauszufinden, wie es geht, aber hier sind die Schritte für die have != neededoben genannten:

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

Wertung

Dies ist Code-Golf, also gewinnt der kürzeste gültige Code in Bytes.

Testfälle

(Beachten Sie, dass diese Ausgaben nicht die einzigen Ausgaben sind, aber ich habe versucht, sie zu vereinfachen.)

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
quelle
Gibt es immer genau ein Leerzeichen zwischen den Eingabetoken?
Türknauf
@ Doorknob Nein. Es werden 0 oder 1 Leerzeichen vorhanden sein.
Artyer

Antworten:

3

Netzhaut , 95 Bytes

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

Probieren Sie es online aus!

Eine eher naive Lösung, aber ich konnte keine Verbesserungen finden.

Dies ist nur eine Reihe von Ersetzungen:

<=
<1+
>=
>-1+

Befreien Sie sich von „oder gleich“ Vergleiche durch den Austausch x <= ymit x < 1 + yund x >= ymit x > -1 + y.

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

Ersetzen x == ydurch ==abs(x - y)und x != ymit !=abs(x - y).

==
2+
!=
3-

Ersetzen Sie ==durch 2+und !=mit 3-, so dass die gesamten Ersetzungen x == y2 + abs(x - y)und x != y→ werden 3 - abs(x - y).

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

Normalisieren Sie die Richtung der verbleibenden Ungleichungen und ersetzen Sie sie x > ydurch y < x.

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

Ersetzen x < ydurch x - y + 3.

$
<3

Hängen Sie ein Herz an das Ende der Zeichenfolge an.

Türknauf
quelle