Giới thiệu
Nhiệm vụ của bạn trong cuộc sống rất đơn giản: Chứng minh người sai trên internet!
Để làm điều này, bạn thường cẩn thận phân tích các tuyên bố của họ và chỉ ra mâu thuẫn trong đó.
Đã đến lúc tự động hóa việc này, nhưng vì chúng ta lười biếng, chúng tôi muốn chứng minh rằng mọi người đã sai với nỗ lực ít nhất (đọc: mã ngắn nhất) có thể.
Đặc điểm kỹ thuật
Đầu vào
Đầu vào của bạn sẽ là một công thức ở dạng kết hợp bình thường . Đối với định dạng, bạn có thể sử dụng định dạng bên dưới hoặc xác định định dạng của riêng bạn, theo nhu cầu của ngôn ngữ của bạn (mặc dù bạn không thể mã hóa nhiều hơn ở định dạng so với CNF thuần túy). Tuy nhiên, các trường hợp thử nghiệm (ở đây) được cung cấp ở định dạng bên dưới (mặc dù nó sẽ không quá khó để tạo riêng cho bạn).
Đầu vào của bạn sẽ là một danh sách danh sách các danh sách các biến (bạn cũng có thể đọc nó dưới dạng chuỗi / chuỗi yêu cầu). Đầu vào là một công thức ở dạng kết hợp thông thường (CNF) được viết dưới dạng một tập các mệnh đề, mỗi mệnh đề là một danh sách gồm hai danh sách. Danh sách đầu tiên trong mệnh đề mã hóa các ký tự dương (biến), danh sách thứ hai mã hóa các ký tự phủ định (phủ định) (biến). Mọi biến trong mệnh đề được OR'ed với nhau và tất cả các mệnh đề được AND'ed với nhau.
Để làm cho nó rõ ràng hơn: [[[A,B],[C]],[[C,A],[B]],[[B],[A]]]
có thể được đọc là:
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))
Đầu ra
Đầu ra là boolean, ví dụ hoặc một số giá trị trung thực hoặc một số giá trị giả.
Phải làm sao
Thật đơn giản: Kiểm tra xem công thức đưa ra có phù hợp hay không, ví dụ: liệu có tồn tại một số phép gán đúng và sai cho tất cả các biến sao cho công thức tổng thể mang lại "đúng" hay không. Đầu ra của bạn sẽ là "true" nếu công thức là satiesfible và "false" nếu nó không phải.
Fun-Fact: Đây là một vấn đề NP-đầy đủ trong trường hợp chung.
Lưu ý: Tạo bảng chân lý và kiểm tra xem bất kỳ mục kết quả nào là đúng, đều được phép.
Góc trường hợp
Nếu bạn nhận được một danh sách cấp 3 trống, thì không có biến (dương / âm) nào trong mệnh đề đó - một đầu vào hợp lệ.
Bạn có thể để các trường hợp góc khác không xác định nếu bạn muốn.
Bạn cũng có thể trả về true theo công thức trống (danh sách cấp 1) và sai theo mệnh đề trống (danh sách cấp 2).
Ai thắng?
Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!
Quy tắc tiêu chuẩn áp dụng tất nhiên.
Các trường hợp thử nghiệm
[[[P],[Q,R]],[[Q,R],[P]],[[Q],[P,R]]] -> true
[[[],[P]],[[S],[]],[[R],[P]],[[U],[Q]],[[X],[R]],[[Q],[S]],[[],[P,U]],[[W],[Q,U]]] -> true
[[[],[P,Q]],[[Q,P],[]],[[P],[Q]],[[Q],[P]]] -> false
[[[P],[]],[[],[P,S]],[[P,T],[]],[[Q],[R]],[[],[R,S]],[[],[P,Q,R]],[[],[P]]] -> false
optional behavior (not mandatory, may be left undefined):
[] -> true (empty formula)
[[]] -> false (empty clause)
[[[],[]]] -> false (empty clause)
{{P,Q},{P,!Q},{!P,Q},{!P,!Q}}
(không theo thứ tự này) có thể dễ dàng hiển thị là một mâu thuẫn. Đối với 4): Đây là một mâu thuẫn tầm thường bởi vì nó P AND ... AND (NOT P)
rõ ràng không bao giờ đúng với bất kỳ giá trị nào của P.
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))
?