Đây là môn đánh gôn .
Trong thử thách này, chúng tôi sẽ viết các chương trình / chức năng giải câu đố " Hiệp sĩ và Knaves ".
Lý lịch
Bạn thấy mình ở trên một hòn đảo ... vv ... mỗi người trên đảo ngoại trừ bạn là một hiệp sĩ hoặc một tay đấm .
Hiệp sĩ chỉ có thể đưa ra tuyên bố đúng .
Knaves chỉ có thể đưa ra tuyên bố sai .
Tôi không muốn định nghĩa chặt chẽ "tuyên bố", nhưng chúng tôi sẽ nói rằng một tuyên bố là bất cứ điều gì là "đúng" hoặc "sai". Lưu ý rằng điều này không bao gồm các câu nghịch lý.
Với mục đích của thử thách này, bạn sẽ bắt gặp những nhóm người dân đảo; họ sẽ tuyên bố với bạn
Nhiệm vụ của bạn là xác định ai là Hiệp sĩ và ai là Knave.
Đầu vào:
Bạn sẽ được cung cấp (ở bất kỳ định dạng hợp lý nào) các thông tin sau:
Một danh sách những người có mặt. Chúng sẽ được đặt tên bằng các ký tự chữ cái in hoa "AZ". Giới hạn về số lượng người áp đặt bởi điều này sẽ không được vượt quá.
Những tuyên bố mà mỗi người đưa ra. Xem bên dưới để biết chi tiết quan trọng về điều này.
Đầu ra
Sau đó, bạn sẽ xuất (ở bất kỳ định dạng hợp lý) mỗi người là gì. Ví dụ: nếu có người chơi A B C Dvà Alà hiệp sĩ, nhưng phần còn lại là nô lệ, bạn có thể xuất
A: 1
B: 0
C: 0
D: 0
Chi tiết quan trọng:
Ký tự chữ cái chữ hoa AZ đề cập đến người dân đảo.
Các ký tự
0(không) và1(một) tương ứng là "Knave" và "Knight". (Bạn có thể có bất kỳ hai ký tự không phải AZ nào khác, miễn là bạn chỉ định)Mỗi người dân đảo có thể đưa ra bất kỳ số lượng tuyên bố tự nhiên nào, hoặc có thể chọn không nói gì.
Các toán tử logic thông thường có thể được sử dụng trong các câu lệnh ( IS *, AND, OR, NOT ). Trên hết, Luật và Điều kiện của De Morgan có thể được sử dụng. Sau đây là những ví dụ về cách chúng có thể được trình bày trong một câu đố nói tiếp theo là cách chúng có thể được đưa vào chương trình của bạn.
(* trên một ghi chú kỹ thuật hơn. Toán tử "IS" thực sự được sử dụng như ngăn chặn (không phải là toán tử logic). Hiệp sĩ ". Toán tử thực sự được sử dụng sẽ là ''. Để đơn giản, thay vào đó chúng tôi sẽ sử dụng '='.)
Tôi sử dụng như sau (bạn có thể sử dụng bất cứ điều gì, miễn là hợp lý và nhất quán):
^VÀvHOẶC LÀ=LÀ~KHÔNG PHẢI=>HÌNH ẢNHX:Người X tuyên bố rằng ...
Người Z có thể thực hiện bất kỳ kết hợp nào của bất kỳ loại câu lệnh nào sau đây:
Người Z nói rằng ...
Người A là một Hiệp sĩ.
Z: A = 1Người Q là một Knave.
Z: Q = 0Tôi là một Hiệp sĩ.
Z: Z = 1Người A là Hiệp sĩ HOẶC Người B là Hiệp sĩ.
Z: ( A = 1 ) v ( B = 1)Người C là một Hiệp sĩ VÀ Tôi là một Knave.
Z: ( C = 1 ) ^ ( Z = 0 )Người R KHÔNG phải là Hiệp sĩ.
Z: ~( R = 1 )
Trên hết, đầu vào cũng có thể sử dụng Luật của De Morgan
Không đúng khi cả người A và người B đều là người biết
Z: ~( ( A = 0 ) ^ ( B = 0 ) )Đó là sai khi một trong hai người A hoặc người B là một Hiệp sĩ
Z: ~( ( A = 1 ) v ( B = 1) )
Cuối cùng, điều kiện và phủ định của chúng có thể được sử dụng
Nếu tôi là Hiệp sĩ, thì người B là Knave
Z: ( Z = 1 ) => ( B = 0 )Không đúng nếu người B là Hiệp sĩ, thì Người C là Knave.
Z: ~( ( B = 1 ) => ( C = 0 ) )
Ghi chú về điều kiện
Kiểm tra wikipedia để biết thêm.
Một câu lệnh có điều kiện có dạng p => q , trong đó p và q là các câu lệnh. p là "tiền đề" và q là "hệ quả". Đây là một số thông tin hữu ích
Phủ định của một điều kiện trông như thế này: ~ (p => q) tương đương với p ^ ~ q
Một tiền đề sai lầm ngụ ý bất cứ điều gì. Đó là: nếu p sai, thì bất kỳ câu p => q nào cũng đúng, bất kể q là gì . Ví dụ: "nếu 2 + 2 = 5 thì tôi là Người nhện" là một tuyên bố đúng.
Một số trường hợp kiểm tra đơn giản
Những trường hợp này được đưa ra theo kiểu sau (1) về cách chúng ta đặt vấn đề trong lời nói (2) làm thế nào chúng ta có thể đặt nó vào máy tính (3) đầu ra chính xác mà máy tính có thể đưa ra.
Người A và Người B tiếp cận bạn trên đường và đưa ra các tuyên bố sau:
A: B là một knave hoặc tôi là một hiệp sĩ.
B: A là một hiệp sĩ.
Câu trả lời:
B là Hiệp sĩ và A là Hiệp sĩ.
Đầu vào:
A B # Cast of Characters
A: ( B = 0 ) v ( A = 1)
B: A = 1
Đầu ra:
A = 1 B = 1
Người A, B và F tiếp cận bạn trên đường và đưa ra các tuyên bố sau:
A: Nếu tôi là Hiệp sĩ, thì B là Knave.
B: Nếu đó là sự thật, thì F cũng là một Knave.
Câu trả lời:
A là Hiệp sĩ, B là Knave, F là Hiệp sĩ.
Đầu vào
A B F
A: ( A = 1 ) => ( B = 0 )
B: ( A = 1 ) => ( F = 0 )
Đầu ra:
A = 1 B = 0 F = 1
Q, X và W tiếp cận bạn trên đường và đưa ra các tuyên bố sau:
W: Không đúng khi cả Q và X đều là Hiệp sĩ.
Q: Đó là sự thật.
X: Nếu những gì W nói là đúng, thì những gì Q nói là sai.
Câu trả lời:
W và Q là Hiệp sĩ. X là một Knave.
Đầu vào
Q X W
W: ~( ( Q = 1 ) ^ ( X = 1 ) )
Q: W = 1
X: ( W = 1 ) => ( Q = 0 )
Đầu ra
W = 1 Q = 1 X = 0
Có một thách thức tương tự từ 3 năm trước, tập trung vào phân tích cú pháp và không chứa các điều kiện hoặc De Morgan. Và do đó, tôi sẽ tranh luận, là đủ khác biệt trong tập trung và thực hiện để tránh điều này là một bản sao.
Thử thách này đã được đóng lại trong một thời gian ngắn như một bản dupe. Nó đã được mở lại.
Tôi cho rằng thử thách này trước hết là khác biệt về trọng tâm. Các thách thức khác tập trung vào phân tích tiếng Anh, điều này không. Thứ hai, nó chỉ sử dụng AND và OR trong khi điều này sử dụng các điều kiện và cho phép giải nhiều câu đố hơn. Vào cuối ngày, câu hỏi là liệu câu trả lời từ thử thách đó có thể được thay thế một cách tầm thường cho vấn đề này hay không, và tôi tin rằng việc bao gồm các điều kiện và phủ định có điều kiện sẽ làm tăng thêm sự phức tạp mà cần phải thực hiện các thay đổi mạnh mẽ hơn theo thứ tự để phù hợp với thử thách này.
OR, nó có thể A:1 B:1hoặc A:1 B:0bởi vì B B=1có thể sai trong khi A vẫn đúng.
(B=1)^(C=1)theo cách các điều kiện thường được xử lý
(B=1)=>(C=0)?~((B=1)=>(C=0))hay(B=1)=>(C=1)cái gì khác?