Це код-гольф .
У цьому виклику ми будемо писати програми / функції, які розгадують загадки " Лицарі та знать ".
Фон
Ви опиняєтесь на острові ... і т. Д. ... кожна людина на острові, окрім вас, є або лицарем, або монахою .
Лицарі можуть робити лише правдиві твердження.
Ножі можуть робити лише помилкові твердження.
Я не хочу чітко визначати "твердження", але ми скажемо, що твердження - це все, що є "правдивим" або "хибним". Зауважте, що це виключає парадоксальні речення.
Для цілей цього виклику ви натрапляєте на групи острівців; вони будуть робити вам заяви.
Ваше завдання - визначити, хто є Лицарем, а хто - Кнавом.
Вхід:
Вам нададуть (у будь-якому розумному форматі) таку інформацію:
Список присутніх. Вони будуть названі великими символами алфавіту "AZ". Обмеження кількості людей, накладене цим, не буде перевищено.
Твердження, які робить кожна людина. Нижче див. Важливі деталі щодо цього.
Вихідні дані
Потім ви виведете (у будь-якому розумному форматі) те, що є кожною людиною. Наприклад, якби були гравці A B C Dі Aє лицарем, а решта - монахини, ви могли б вивести
A: 1
B: 0
C: 0
D: 0
Важливі деталі:
Великі літери алфавіту AZ відносяться до острівців.
Символи
0(нуль) та1(один) позначають відповідно "Кнав" та "Лицар". (Ви можете будь-які інші два символи AZ, якщо ви вказали)Кожен присутній острівчанин може робити будь-яку природну кількість тверджень, а може і нічого не сказати.
Нормальні логічні оператори можуть використовуватися в операторах ( IS *, AND, OR, NOT ). На додаток до цього, можуть використовуватися Закони та умови Де Моргана . Нижче наведено приклади того, як вони можуть бути представлені у розмовній головоломці з подальшим введенням у вашу програму.
(* щодо більш технічної примітки. Оператор "IS" дійсно використовується як стримуючий елемент (що не є логічним оператором). Коли я кажу "A - лицар", я справді маю на увазі "A є членом набору Лицарі ". Справжній оператор, який використовується, був би" ϵ ". Для простоти, ми замість цього будемо використовувати" = ".)
Я використовую наступне (ви можете використовувати будь-що, якщо це розумно і послідовно):
^ІvАБО=Є~НЕ=>ВПРАВЛІННЯX:Особа X стверджує, що ...
Особа Z може скласти будь-яку комбінацію будь-якого з наступних типів висловлювань:
Person Z каже, що ...
Особа А - лицар.
Z: A = 1Людина Q - Кнав.
Z: Q = 0Я лицар.
Z: Z = 1Особа А - лицар АБО Особа Б - лицар.
Z: ( A = 1 ) v ( B = 1)Людина С - Лицар І Я Кнав.
Z: ( C = 1 ) ^ ( Z = 0 )Людина R НЕ є лицарем.
Z: ~( R = 1 )
Крім цього, вхідні дані також можуть використовувати Закони Де Моргана
НЕ ПРАВИЛЬНО, що і людина А, і Особа Б - це ножі
Z: ~( ( A = 0 ) ^ ( B = 0 ) )Помилково, що або людина A, або людина B - лицар
Z: ~( ( A = 1 ) v ( B = 1) )
Нарешті, можна використовувати умовні умови та їх заперечення
Якщо я лицар, то людина Б - це Кнав
Z: ( Z = 1 ) => ( B = 0 )НЕ ПРАВИЛЬНО, що якщо людина Б - лицар, то особа С - це Кнав.
Z: ~( ( B = 1 ) => ( C = 0 ) )
Примітки до умовних умов
Перегляньте wikipedia для отримання додаткової інформації.
Умовний вираз має вигляд p => q , де p і q - самі твердження. p - "попередник", а q - "наслідковий". Ось корисна інформація
Заперечення умови виглядає так: ~ (p => q) еквівалентно p ^ ~ q
Неправдиве приміщення передбачає що-небудь. Тобто: якщо p хибний, то будь-яке твердження p => q є істинним, незалежно від того, що таке q . Наприклад: "якщо 2 + 2 = 5, то я павук" - це правдиве твердження.
Деякі прості тестові випадки
Ці випадки наведені наступним чином (1), як ми поставили б проблему в мовленні (2), як ми можемо поставити її перед комп'ютером (3) правильний вихід, який може дати комп'ютер.
Особа A та людина B підходять до вас на дорозі і роблять такі заяви:
A: B - коня, або я - лицар.
Б: А - лицар.
Відповідь:
B - лицар, а A - лицар.
Вхід:
A B # Cast of Characters
A: ( B = 0 ) v ( A = 1)
B: A = 1
Вихід:
A = 1 B = 1
Особи A, B і F підходять до вас на дорозі і роблять такі заяви:
A: Якщо я лицар, то B - знахар.
Б: Якщо це правда, то і F - це Кнав.
Відповідь:
A - лицар, B - Knave, F - лицар.
Вхідні дані
A B F
A: ( A = 1 ) => ( B = 0 )
B: ( A = 1 ) => ( F = 0 )
Вихід:
A = 1 B = 0 F = 1
Q, X і W підходять до вас на дорозі і роблять такі заяви:
W: Неправда, що і Q, і X - лицарі.
З: Це правда.
X: Якщо те, що говорить W, є істинним, то те, що говорить Q, є помилковим.
Відповідь:
W і Q - лицарі. X - Кнав.
Вхідні дані
Q X W
W: ~( ( Q = 1 ) ^ ( X = 1 ) )
Q: W = 1
X: ( W = 1 ) => ( Q = 0 )
Вихідні дані
W = 1 Q = 1 X = 0
Існує аналогічний виклик з 3 років тому, який зосереджується на синтаксичному розборі і не містить умовних умов або де-морганівських. І тому, я заперечу, достатньо різний у фокусі та здійсненні, щоб уникнути того, що це було дурнем.
Цей виклик ненадовго було закрито як дурпа. З тих пір вона була відновлена.
Я стверджую, що цей виклик, по-перше, відрізняється по фокусу. Інша проблема зосереджена на синтаксичному розборі англійської мови, це не так. По-друге, він використовує лише І і АБО, тоді як це використовує умовні умови та дозволяє вирішувати ще багато загадок. Зрештою, питання полягає в тому, чи можна відповіді з цього виклику тривіально замінити на цей, і я вважаю, що включення умовних та умовних заперечень додає достатньої складності, що для того, щоб зробити необхідні більш ґрунтовні зміни, щоб відповідати цьому виклику.
OR, це може бути A:1 B:1або A:1 B:0тому, що B B=1може бути помилковим, а A все-таки буде правдою.
(B=1)^(C=1)тому, як умовами зазвичай займаються
(B=1)=>(C=0)?~((B=1)=>(C=0))або(B=1)=>(C=1)чи щось інше?