Có 16 hàm boolean riêng biệt cho hai biến nhị phân A và B:
A B | F0 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | F13 | F14 | F15
-----------------------------------------------------------------------------------------
0 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1
0 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1
1 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1
1 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1
Toán tử nhỏ hơn toán tử <
, thường không được coi là toán tử logic như KHÔNG, AND hoặc OR, trên thực tế là một trong những hàm này (F4) khi được áp dụng cho các giá trị boolean:
A B | A < B
-----------
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 0
Thật thú vị, chúng ta có thể mô phỏng bất kỳ trong số 15 hàm khác bằng các biểu thức chỉ chứa các ký hiệu ()<AB10
. Các biểu thức này được đọc và đánh giá giống như trong các ngôn ngữ lập trình tiêu chuẩn, ví dụ: dấu ngoặc đơn phải khớp và <
phải có đối số ở hai bên của nó.
Cụ thể, các biểu thức này phải tuân thủ ngữ pháp sau (được đưa ra dưới dạng Backus-Naur ):
element ::= A | B | 1 | 0
expression ::= element<element | (expression)<element | element<(expression) | (expression)<(expression)
Điều này có nghĩa là các mệnh đề và biểu thức vô dụng của biểu mẫu A<B<1
không được phép.
Vì vậy, biểu thức A<B
phù hợp với chức năng F4 và A<B<1
phải được thay đổi thành (A<B)<1
hoặc A<(B<1)
.
Để chứng minh rằng tất cả 15 chức năng khác có thể được chuyển thành biểu thức, nó đủ để tạo thành một tập hợp các biểu thức được hoàn thành về mặt chức năng , bởi vì theo định nghĩa, chúng có thể được tạo thành biểu thức cho bất kỳ chức năng nào.
Một tập hợp các biểu thức như vậy là x<1
(where x
is A
hoặc B
), is ¬x
, and (((B<A)<1)<A)<1
, is A → B
. Phủ định ( ¬
) và hàm ý ( →
) được biết là hoàn thành chức năng.
Thử thách
Sử dụng các ký tự ()<AB10
, viết 16 biểu thức theo mẫu được mô tả ở trên tương đương với mỗi trong số 16 hàm boolean riêng biệt.
Mục tiêu là làm cho mỗi biểu thức càng ngắn càng tốt. Điểm của bạn là tổng số lượng ký tự trong mỗi 16 biểu thức của bạn. Điểm thấp nhất sẽ thắng. Tiebreaker đi đến câu trả lời sớm nhất (với điều kiện họ không chỉnh sửa câu trả lời của họ sau đó với các biểu thức ngắn hơn được lấy từ người khác).
Về mặt kỹ thuật, bạn không cần phải viết bất kỳ mã thực sự nào cho cuộc thi này nhưng nếu bạn đã viết bất kỳ chương trình nào để giúp bạn tạo các biểu thức, bạn rất khuyến khích đăng chúng.
Bạn có thể sử dụng Stack Snippet này để kiểm tra xem biểu thức của bạn có làm những gì được mong đợi không: