Bạn được cung cấp một danh sách các số L = [17, 5, 9, 17, 59, 14]
, một túi của các nhà khai thác O = {+:7, -:3, *:5, /:1}
và một số N = 569
.
Bài tập
Xuất ra một phương trình sử dụng tất cả các số ở L
phía bên trái và chỉ số N
ở phía bên phải. Nếu điều này là không thể, đầu ra Sai. Giải pháp ví dụ:
59*(17-5)-9*17+14 = 569
Hạn chế và làm rõ
- Bạn không được nối các số (
[13,37]
có thể không được sử dụng như1337
) - Chỉ có số tự nhiên và số không sẽ xuất hiện trong
L
. - Thứ tự
L
không quan trọng. - Bạn phải sử dụng tất cả các số trong
L
. - Chỉ các nhà khai thác
+
,-
,*
,/
sẽ xuất hiện trongO
. O
có thể có nhiều toán tử hơn bạn cần, nhưng ít nhất là các|L|-1
toán tử- Bạn có thể sử dụng mỗi toán tử bất kỳ số lần lên đến giá trị trong
O
. - Tất cả bốn hoạt động trong
O
là các hoạt động toán học tiêu chuẩn; đặc biệt,/
là phân chia bình thường với các phân số chính xác.
Điểm
- Càng ít điểm, càng tốt
- Mỗi ký tự mã của bạn cung cấp cho bạn một điểm
Bạn phải cung cấp một phiên bản không chơi gôn dễ đọc.
Lý lịch
Một câu hỏi tương tự đã được hỏi về Stack Overflow. Tôi nghĩ rằng nó có thể là một thử thách golf-code thú vị.
Độ phức tạp tính toán
Như Peter Taylor đã nói trong các bình luận, bạn có thể giải tổng số tập hợp con bằng cách này:
- Bạn có một thể hiện của tổng tập hợp con (do đó một tập hợp S số nguyên và một số x)
- L: = S + [0, ..., 0] (| S | lần một số không), N: = x, O: = {+: | S | -1, *: | S | - 1, /: 0, -: 0}
- Bây giờ giải quyết trường hợp này của vấn đề của tôi
- Giải pháp cho tổng tập hợp con là số S không được nhân với số không.
Nếu bạn tìm thấy Thuật toán tốt hơn O (2 ^ n), bạn chứng minh rằng P = NP. Vì P vs NP là một vấn đề giải thưởng thiên niên kỷ và do đó trị giá 1.000.000 đô la Mỹ, rất khó có khả năng ai đó tìm ra giải pháp cho vấn đề này. Vì vậy, tôi loại bỏ phần này của bảng xếp hạng.
Các trường hợp thử nghiệm
Sau đây không phải là câu trả lời hợp lệ duy nhất, các giải pháp khác tồn tại và được cho phép:
- (
[17,5,9,17,59,14]
,{+:7, -:3, *:5, /:1}
,569
)
=>59 * (17-5)- 9 * 17 + 14 = 569
- (
[2,2]
,{'+':3, '-':3, '*':3, '/':3}
,1
)
=>2/2 = 1
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,16
)
=>5+10-2*3+7+0+0+0+0+0+0+0 = 16
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,15
)
=>5+10+0*(2+3+7)+0+0+0+0+0+0 = 15
/
≡ div
), chỉ là dấu phẩy động và hy vọng không làm tròn-lỗi, ...?
5+10+2*3+7*0+0...
m = |L|
? Nếu có, làm thế nào bạn có thể mong đợi thời gian chạy không phụ thuộc vào kích thước của danh sách đó? Ví dụ ,[2,2],[+,+,...,+,/],1
. Trong thực tế, vì n là O (m), bạn có thể viết tất cả theo m.