Nhiệm vụ là viết mã có thể tìm các công thức logic nhỏ cho các tổng bit.
Thử thách chung là mã của bạn tìm ra công thức logic mệnh đề nhỏ nhất có thể để kiểm tra xem tổng của các biến nhị phân y 0/1 có bằng một số giá trị x hay không. Hãy để chúng tôi gọi các biến x1, x2, x3, x4, vv Biểu thức của bạn phải tương đương với tổng. Đó là, công thức logic nên đúng khi và chỉ khi tổng bằng x.
Đây là một cách ngây thơ để làm điều đó để bắt đầu. Nói y = 15 và x = 5. Chọn tất cả 3003 cách khác nhau để chọn 5 biến và mỗi biến tạo một mệnh đề mới với AND của các biến đó VÀ AND của phủ định của các biến còn lại. Bạn kết thúc với 3003 mệnh đề mỗi chiều dài chính xác 15 với tổng chi phí 45054.
Câu trả lời của bạn nên là một biểu thức logic của loại đó có thể được dán vào python, để tôi có thể kiểm tra nó. Nếu hai người có cùng biểu thức kích thước, mã chạy nhanh nhất sẽ thắng.
Bạn được phép giới thiệu các biến mới vào giải pháp của mình. Vì vậy, trong trường hợp này, công thức logic của bạn bao gồm các biến nhị phân y, x và một số biến mới. Toàn bộ công thức sẽ thỏa đáng khi và chỉ khi tổng các biến y bằng x.
Khi bắt đầu bài tập, một số người có thể muốn bắt đầu với y = 5 biến thêm vào x = 2. Phương pháp ngây thơ sau đó sẽ cho chi phí là 50.
Mã phải lấy hai giá trị y và x làm đầu vào và xuất công thức và kích thước của nó làm đầu ra. Chi phí của một giải pháp chỉ là số lượng thô của các biến trong đầu ra của nó. Vì vậy, (a or b) and (!a or c)
tính là 4. Các toán tử được phép duy nhất là and
, or
và not
.
Cập nhật Hóa ra có một phương pháp thông minh để giải quyết vấn đề này khi x = 1, ít nhất là trên lý thuyết.
z[0] = y[0] and y[1]
, làm thế nào để bạn muốn chỉ định này?
z[0]
đại diện y[0] or y[1]
thì tôi chỉ cần đưa ra một mệnh đề giống như (y[0] or y[1]) or not z[0]
(hoặc bất kỳ câu lệnh tương đương nào sử dụng 3 toán tử được phép).