(Tôi có thể) Thêm dấu ngoặc đơn để biến điều này thành sự thật


8

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 * 3và 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 / 5và 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ỉ +, -, */. Trình tự vận hành chuẩn ( */, sau đó +-).

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 * 1cho 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ỉ *.


/là phân chia phao, phải không?
Rod

@Rod vâng, đúng vậy.
lập trình

1
Bạn nên có một trường hợp thử nghiệm yêu cầu kết quả trung gian không nguyên được sử dụng.
frageum

Bạn nên thêm một trường hợp thử nghiệm trong đó phép chia cho số 0 có thể xảy ra, như3 / 2 - 1 - 1 and 2 -> 3 / (2 - 1) - 1
mbomb007

Câu trả lời:


3

Python 2, 286 285 282 byte

from fractions import*
P=lambda L:[p+[L[i:]]for i in range(len(L))for p in P(L[:i])]or[L]
x,y=input()
x=x.split()
for p in P(['Fraction(%s)'%e for e in x[::2]]):
 try:print 1/(eval(''.join(sum(zip(eval(`p`.replace("['","'(").replace("']",")'")),x[1::2]+[0]),())[:-1]))==y)
 except:0

Dùng thử trực tuyến

Giải trình:

Phiên bản này sẽ in tất cả các biểu thức làm việc (với các Fractionđối tượng).

from fractions import*
# Sublist Partitions (ref 1)
P=lambda L:[p+[L[i:]]for i in range(len(L))for p in P(L[:i])]or[L]
x,y=input()
x=x.split()
# Convert all numbers to Fractions for division to work
n=['Fraction(%s)'%e for e in x[::2]]
# Operators
o=x[1::2]
# Try each partition
for p in P(n):
    # Move parens to be inside strings
    n=eval(`p`.replace("['","'(").replace("']",")'"))
    # Alternate numbers and operators (ref 2)
    x=''.join(sum(zip(n,o+[0]),())[:-1])
    # Prevent division by zero errors
    try:
        # Evaluate and check equality
        if eval(x)==y:print x
    except:0

Dùng thử trực tuyến

Người giới thiệu:

  1. Chức năng phân vùng

  2. Khóa kéo xen kẽ

Đã lưu 3 byte nhờ Felipe Nardi Batista


1- Bạn có thể sử dụng python3 ( /là phân chia float) và bỏ tất cả các fractionssử dụng không? 2 - Điều gì về sự phân chia bằng 0?
Rod

@Rod Không, bạn không thể. Phân chia nổi là lý do nó được yêu cầu.
mbomb007

Lý do là gì?
Rod

oh, vấn đề làm tròn
Rod

Tôi đã sửa lỗi phân chia bằng không vấn đề. Nó vẫn hoạt động cho bất kỳ ví dụ nào mà giải pháp được đưa ra trước khi chia cho số 0, nhưng tôi đã tìm thấy một trường hợp thử nghiệm đã phá vỡ nó. Đây là trường hợp thử nghiệm cuối cùng trong bộ thử nghiệm của tôi.
mbomb007
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.