Фон
Є двоє людей, Білл та Джон. Один з них - лицар, який завжди говорить правду, а другий - монастир, який завжди говорить брехню. Ви не знаєте, хто є лицарем, а хто - монастирем. Кожна людина потім говорить кілька тверджень про те, хто є лицарем, а хто - лицарем. Використовуючи цю інформацію, ви повинні дійти висновку щодо того, хто є лицарем, а хто - монастирем.
Логічна задача " Найтс і Кнавс" базується на алгебре Булева. Слова, які людина вимовляє, утворюють булеву задачу задоволеності. Висловлювання лицаря завжди повинні бути хибними, а твердження інших лицарів завжди повинні бути правдивими.
Джон каже: "І я, і монахиня, і Білл - монаха". Якби Джон був лицарем, то це твердження було б помилковим, тому він не може бути лицарем. Якби він був лицарем, а Білл був лицарем, це твердження все одно було б помилковим, навіть думав, що перша частина правдива. Отже, Іван - монастир.
Змагання
Ваше завдання полягає в тому, щоб написати найкоротшу можливу програму, яка складе список заяв, зроблених кожною людиною, і з'ясує, хто є києм, а хто - лицарем. Існує багато деталей, які слід висвітлити, тому ця проблема описана в трьох розділах.
Вхідні дані
Вхід буде двома рядками, а за ними новий рядок. У кожному рядку буде вказано ім’я одного з персонажів, а потім двокрапка, а потім кілька речень, сказаних цією особою. Якщо одна людина - лицар, то всі його вироки будуть істинними, і всі вироки чнака будуть хибними. Перша літера речення завжди буде написана з великої літери, а кожне речення закінчується періодом. Ось приклад:
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.
Розбір
Кожне речення складається щонайменше з одного речення. Кожен пункт містить одну з кількох речей (сподіваємось, ви можете зрозуміти моє позначення):
both [clause] and [clause]
either [clause] or [clause]
neither [clause] nor [clause]
[I am | (other person's name) is] a [knight | knave]
Це неоднозначне, тому що це можна зрозуміти таким чином, як польське позначення. Ось приклад речення:
Both I am a knight and neither Steve is a knave nor I am a knave.
Переклад алгебри Булева простий. Висловлювання "обидва" - це AND, "або" - "XOR", а "ні" - NOR.
(I am a knight) AND ((Steve is a knave) NOR (I am a knave))
Вихідні дані
Вихід буде складатися з двох рядків. Кожен рядок складається з імені людини (по порядку), а потім говорить, чи він лицар чи монастир. Завжди знайдеться один лицар та один монастир. Ось результат для наведеного вище прикладу:
Joe is the knave.
Steve is the knight.
Якщо проблема нерозв'язна (або ви не можете сказати, хто що, або немає рішення), тоді ваша програма може зробити все, ЩО ВЗАЄМО, щоб отримати дійсний вихід.
Більше прикладів
Вхідні дані
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.
Вихідні дані
Sir Lancelot is the knight.
Merlin is the knave.
Вхідні дані
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.
Вихідні дані
David is the knave.
Patrick is the knight.
Вхідні дані
Lizard: I am a knight.
Spock: I am a knave.
Один можливий вихід
Rock Paper Scissors
Правила, положення та примітки
- Діють стандартні правила гольф-коду
- Ваша програма повинна складатися лише з друкованого ASCII
- Усі вхідні та вихідні дані будуть від STDIN та STDOUT