Lý lịch
Có hai người, Bill và John. Một trong số họ là một hiệp sĩ, người luôn nói sự thật, và người kia là một tay sai, luôn nói dối. Bạn không biết ai là hiệp sĩ và ai là người biết điều. Mỗi người sau đó nói một vài câu về ai là người biết hiệp sĩ và ai là hiệp sĩ. Sử dụng thông tin này, bạn phải đi đến kết luận ai là hiệp sĩ và ai là người biết điều.
Bài toán logic của Hiệp sĩ và Knaves dựa trên đại số Booleen. Những từ mà một người nói tạo thành một vấn đề thỏa mãn Booleen. Các tuyên bố của knave phải luôn luôn sai và các tuyên bố của hiệp sĩ khác phải luôn luôn đúng.
John nói "Cả hai tôi là một knave và Bill là một knave". Nếu John là hiệp sĩ, thì tuyên bố này sẽ sai, vì vậy anh ta không thể là hiệp sĩ. Nếu anh ta là tay sai và Bill là hiệp sĩ, tuyên bố này vẫn sẽ sai, thậm chí còn nghĩ phần đầu tiên là đúng. Vì vậy, John là người biết điều.
Các thách thức
Thử thách của bạn là viết chương trình ngắn nhất có thể, sẽ lấy một danh sách các tuyên bố của mỗi người và sẽ tìm ra ai là người biết điều và ai là hiệp sĩ. Có rất nhiều chi tiết để đề cập, vì vậy vấn đề này được mô tả trong ba phần.
Đầu vào
Đầu vào sẽ là hai dòng theo sau là một dòng mới. Mỗi dòng sẽ cho biết tên của một trong các ký tự, theo sau là dấu hai chấm, theo sau là một vài câu được nói bởi người đó. Nếu một người là hiệp sĩ, thì tất cả các câu của anh ta sẽ là đúng, và tất cả các câu của knave sẽ là sai. Chữ cái đầu tiên của câu sẽ luôn được viết hoa và mỗi câu sẽ kết thúc bằng một dấu chấm. Đây là một ví dụ:
Joe: Both I am a knight and neither Steve is a knave nor I am a knave.
Steve: Joe is a knave. Either Joe is a knight or I am a knight.
Phân tích cú pháp
Mỗi câu bao gồm ít nhất một mệnh đề. Mỗi mệnh đề chứa một trong một số điều (hy vọng bạn có thể hiểu ký hiệu của tôi):
both [clause] and [clause]
either [clause] or [clause]
neither [clause] nor [clause]
[I am | (other person's name) is] a [knight | knave]
Điều này là phi tôn giáo vì nó có thể được hiểu theo cách tương tự như ký hiệu Ba Lan. Đây là một ví dụ về một câu:
Both I am a knight and neither Steve is a knave nor I am a knave.
Việc dịch sang đại số Booleen rất đơn giản. Câu lệnh "cả hai" là AND, câu lệnh "hoặc" là XOR và câu lệnh "không" là NOR.
(I am a knight) AND ((Steve is a knave) NOR (I am a knave))
Đầu ra
Đầu ra sẽ bao gồm hai dòng. Mỗi dòng bao gồm tên của một người (theo thứ tự) và sau đó cho biết anh ta là hiệp sĩ hay hiệp sĩ. Sẽ luôn có một hiệp sĩ và một hiệp sĩ. Đây là đầu ra cho ví dụ trên:
Joe is the knave.
Steve is the knight.
Nếu vấn đề không thể giải quyết được (bạn không thể biết ai là ai hoặc không có giải pháp nào), thì chương trình của bạn có thể làm bất cứ điều gì NGOẠI TRỪ tạo ra một đầu ra hợp lệ.
Thêm ví dụ
Đầu vào
Sir Lancelot: Either both I am a knight and Merlin is a knave or both I am a knave and Merlin is a knight.
Merlin: Either both I am a knight and Sir Lancelot is a knight or both I am a knave and Sir Lancelot is a knave.
Đầu ra
Sir Lancelot is the knight.
Merlin is the knave.
Đầu vào
David: Neither I am a knave nor Patrick is a knight. Either I am a knight or Patrick is a knave.
Patrick: Either I am a knight or both I am a knight and David is a knight.
Đầu ra
David is the knave.
Patrick is the knight.
Đầu vào
Lizard: I am a knight.
Spock: I am a knave.
Một đầu ra có thể
Rock Paper Scissors
Quy tắc, quy định và ghi chú
- Luật golf tiêu chuẩn được áp dụng
- Chương trình của bạn phải được tạo thành từ ASCII có thể in được
- Tất cả đầu vào và đầu ra sẽ từ STDIN và STDOUT