I <3 condizionali


11

Finisci per avere un sacco di condizionali molto lunghi e noiosi nel tuo codice:

if flag == 1:

while have != needed:

if type == 7:

Questi possono essere trasformati nelle loro <3controparti condizionali molto più amabili :

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

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

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

Compito

Il tuo compito è quello di prendere un condizionale e farlo in termini di <3. L'unica spaziatura che conta è che non c'è nessuno tra <e 3.

Condizionali saranno due espressioni separati da entrambi ==, !=, >, <, >=o <=.
Le espressioni conterranno solo addizione, sottrazione, negazione unaria ( -something), dove esiste una +o -prima di ogni variabile o numero (tranne la prima che non ha nulla o -prima di essa).
I numeri saranno [0-9]+e le variabili lo saranno [a-z]+. Se è necessario utilizzare la risposta |x|(Il valore assoluto di x), utilizzare la abs()funzione. Si può presumere che tutte le variabili siano numeri interi e che tutte le costanti numeriche nell'input siano <1000.

L'output non deve necessariamente essere nella sua forma più semplice. Deve essere un condizionale come sopra, nel senso che sono solo due espressioni, separate da un segno condizionale, ma può anche usare la absfunzione, racchiudendo un'espressione valida, e quindi si comporta come una variabile, in termini di validità.

Se l'input non ha un output per nessun valore di una variabile, genera una condizione che è sempre falsa, ma comunque in termini di <3.

Parte della sfida è capire come farlo, ma ecco i passaggi per quanto have != neededsopra:

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

punteggio

Questo è code-golf, quindi vince il codice valido più breve, in byte.

Casi test

(Nota, queste uscite non sono le uniche uscite, ma ho provato a semplificarle.)

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

Esiste sempre esattamente uno spazio tra i token di input?
Maniglia della porta

@Doorknob No. Ci saranno 0 o 1 spazi.
Artyer,

Risposte:


3

Retina , 95 byte

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

Provalo online!

Una soluzione piuttosto ingenua, ma non sono stato in grado di trovare alcun miglioramento.

Questa è solo una serie di sostituzioni:

<=
<1+
>=
>-1+

Elimina i confronti "o uguali a" sostituendoli x <= yconx < 1 + y e x >= ycon x > -1 + y.

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

Sostituire x == ycon ==abs(x - y)ex != y con !=abs(x - y).

==
2+
!=
3-

Sostituisci ==con 2+e !=con 3-, in modo che le sostituzioni complessive diventino x == y2 + abs(x - y)ex != y3 - abs(x - y).

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

Normalizza la direzione delle disuguaglianze rimanenti, sostituendo x > y con y < x.

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

Sostituire x < y con x - y + 3.

$
<3

Aggiungi un cuore alla fine della stringa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.