Saya <3 mengkondisikan


11

Anda akhirnya memiliki banyak persyaratan yang sangat panjang dan tampak membosankan dalam kode Anda:

if flag == 1:

while have != needed:

if type == 7:

Ini dapat diubah menjadi <3rekan kondisional mereka yang jauh lebih menyenangkan :

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

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

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

Tugas

Tugas Anda adalah untuk mengambil syarat dan membuatnya dalam hal <3. Satu-satunya jarak yang penting adalah bahwa tidak ada antara <dan 3.

Conditional akan ada dua ekspresi dipisahkan oleh salah satu ==, !=, >, <, >=atau <=.
Ekspresi hanya akan berisi penjumlahan, pengurangan, negasi unary ( -something), di mana ada satu +atau -sebelum setiap variabel atau angka (kecuali yang pertama yang tidak memiliki atau -sebelum itu).
Angka akan menjadi [0-9]+, dan variabel akan menjadi [a-z]+. Jika jawabannya perlu digunakan |x|(Nilai absolut dari x), gunakan abs()fungsinya. Anda dapat mengasumsikan bahwa semua variabel adalah bilangan bulat, dan semua konstanta angka dalam input adalah <1000.

Outputnya tidak harus dalam bentuk yang paling sederhana. Itu memang perlu kondisional seperti di atas, artinya hanya dua ekspresi saja, dipisahkan oleh satu tanda kondisional, tetapi ia juga bisa menggunakan absfungsi, melampirkan ekspresi yang valid, dan kemudian bertindak seperti variabel, dalam hal validitas.

Jika input tidak memiliki output untuk nilai variabel apa pun, output kondisi yang selalu salah, tetapi masih dalam hal <3.

Sebagian dari tantangannya adalah mencari tahu bagaimana melakukannya, tetapi berikut adalah langkah-langkah untuk hal di have != neededatas:

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

Mencetak gol

Ini adalah kode-golf, jadi kode terpendek yang valid, dalam byte, menang.

Uji kasus

(Catatan, output ini bukan satu-satunya output, tapi saya mencoba menyederhanakannya.)

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

Apakah selalu ada satu spasi di antara token input?
Gagang Pintu

@ Dooorknob No. Akan ada 0 atau 1 spasi.
Artyer

Jawaban:


3

Retina , 95 byte

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

Cobalah online!

Solusi yang agak naif, tetapi saya belum dapat menemukan perbaikan.

Ini hanya serangkaian penggantian:

<=
<1+
>=
>-1+

Singkirkan perbandingan "atau sama dengan" dengan mengganti x <= ydengan x < 1 + y, dan x >= ydengan x > -1 + y.

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

Ganti x == ydengan ==abs(x - y), dan x != ydengan !=abs(x - y).

==
2+
!=
3-

Ganti ==dengan 2+dan !=dengan 3-, sehingga penggantian keseluruhan menjadi x == y2 + abs(x - y)dan x != y3 - abs(x - y).

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

Normalisasi arah ketidaksetaraan yang tersisa, ganti x > ydengan y < x.

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

Ganti x < ydengan x - y + 3.

$
<3

Tambahkan hati ke akhir string.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.