Tôi thấy câu hỏi khó hiểu gần đây:
Thêm dấu ngoặc đơn để làm cho điều này đúng
Và thấy rằng một câu trả lời đã sử dụng tập lệnh Python để thử tất cả các khả năng .
Thách thức của bạn là, đưa ra một biểu thức (dưới dạng một chuỗi) và một số nguyên, là tạo ra một chương trình có thể cho biết liệu bạn có thể thêm parens để làm cho biểu thức bằng số nguyên hay không.
Ví dụ: nếu biểu thức là 1 + 2 * 3
và số nguyên là 9
, hơn bạn có thể thêm parens like (1 + 2) * 3
, bằng 9, vì vậy đầu ra phải là sự thật. Nhưng nếu biểu thức là 1 + 2 - 3 * 4 / 5
và số nguyên là 9999999999999
, bạn không thể thêm bất kỳ số lượng parens nào để làm cho số đó bằng nhau 9999999999999
, vì vậy đầu ra phải là falsey.
Lưu ý rằng đầu vào số nguyên có thể là dương hoặc âm, nhưng biểu thức sẽ chỉ chứa các số nguyên dương. Trong thực tế, biểu thức sẽ luôn luôn khớp (\d+ [+*/-] )+ \d
(regex). Nói cách khác, không có dấu ngoặc, không có mũ, chỉ +
, -
, *
và /
. Trình tự vận hành chuẩn ( *
và /
, sau đó +
và -
).
Nhiều trường hợp thử nghiệm:
1 + 2 - 3 * 4 / 9 and -1 -> truthy, ((1 + 2) - (3 * 4)) / 9
10 - 9 * 8 - 7 * 6 - 5 * 4 - 3 * 2 - 2 * 1 and 1, falsey, see linked question
10 + 9 - 8 * 7 + 6 - 5 * 4 + 3 - 2 * 1 and 82 -> truthy, (10 + (9 - 8)) * 7 + (6 - 5) * 4 + 3 - 2 * 1
34 + 3 and 15 -> falsey
1 + 2 + 5 + 7 and 36 -> falsey
1 / 10 * 3 + 3 / 10 * 10 and 6 -> truthy, (1/10*3+3/10)*10
Có câu hỏi nào không?
Bạn có thể xuất biểu thức với dấu ngoặc đơn nếu có thể, ví dụ (10 + (9 - 8)) * 7 + (6 - 5) * 4 + 3 - 2 * 1
cho trường hợp thử nghiệm cuối cùng. Tôi thích điều này hơn chỉ là một giá trị trung thực, nhưng nó là tùy thuộc vào bạn. Sử dụng 2(5)
cho phép nhân không được phép, chỉ *
.
3 / 2 - 1 - 1 and 2 -> 3 / (2 - 1) - 1
/
là phân chia phao, phải không?