Tôi <3 điều kiện


11

Bạn cuối cùng có rất nhiều điều kiện rất dài, trông nhàm chán trong mã của bạn:

if flag == 1:

while have != needed:

if type == 7:

Chúng có thể được chuyển đổi thành các <3đối tác có điều kiện đáng yêu hơn nhiều của họ:

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

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

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

Bài tập

Nhiệm vụ của bạn là lấy một điều kiện và làm cho nó về mặt <3. Khoảng cách duy nhất quan trọng là không có giữa <3.

Conditionals sẽ có hai biểu thức tách bởi một trong hai ==, !=, >, <, >=hoặc <=.
Biểu thức sẽ chỉ chứa phép cộng, phép trừ, phủ định đơn ( -something), trong đó có một +hoặc -trước mỗi biến hoặc số (ngoại trừ biến đầu tiên không có gì hoặc -trước nó).
Số sẽ là [0-9]+, và biến sẽ là [a-z]+. Nếu câu trả lời cần sử dụng |x|(Giá trị tuyệt đối của x), hãy sử dụng abs()hàm. Bạn có thể giả sử rằng tất cả các biến là số nguyên và tất cả các hằng số trong đầu vào là <1000.

Đầu ra không cần phải ở dạng đơn giản nhất. Nó không cần phải là một điều kiện như trên, nghĩa là nó chỉ có hai biểu thức, được phân tách bằng một dấu hiệu có điều kiện, nhưng nó cũng có thể sử dụng abshàm, kèm theo một biểu thức hợp lệ và sau đó nó hoạt động như một biến, về tính hợp lệ.

Nếu đầu vào không có đầu ra cho bất kỳ giá trị nào của biến, hãy xuất một điều kiện luôn luôn sai, nhưng vẫn còn về mặt <3.

Một phần của thử thách là tìm ra cách thực hiện, nhưng đây là các bước cho phần have != neededtrên:

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

Chấm điểm

Đây là mã golf, vì vậy mã hợp lệ ngắn nhất, tính bằng byte, sẽ thắng.

Các trường hợp thử nghiệm

(Lưu ý, những đầu ra này không phải là đầu ra duy nhất, nhưng tôi đã cố gắng đơn giản hóa chúng.)

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

Có luôn luôn chính xác một không gian giữa các mã thông báo đầu vào không?
Doorknob

@Doorknob Không. Sẽ có 0 hoặc 1 khoảng trắng.
Artyer

Câu trả lời:


3

Võng mạc , 95 byte

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

Hãy thử trực tuyến!

Một giải pháp khá ngây thơ, nhưng tôi không thể tìm thấy bất kỳ cải tiến nào.

Đây chỉ là một loạt các thay thế:

<=
<1+
>=
>-1+

Loại bỏ các so sánh "hoặc bằng" bằng cách thay thế x <= ybằng x < 1 + yx >= ybằng x > -1 + y.

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

Thay thế x == ybằng ==abs(x - y), và x != ybằng !=abs(x - y).

==
2+
!=
3-

Thay thế ==bằng 2+!=bằng 3-, để thay thế tổng thể trở thành x == y2 + abs(x - y)x != y3 - abs(x - y).

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

Bình thường hóa hướng của các bất đẳng thức còn lại, thay thế x > ybằng y < x.

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

Thay thế x < ybằng x - y + 3.

$
<3

Nối một trái tim vào cuối chuỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.