задача
Ваша задача - написать функцию или программу на языке по вашему выбору, который анализирует пару утверждений и определяет, можно ли сделать вывод из этих утверждений, что свиньи способны летать.
вход
Входные данные представляют собой строку, которую можно прочитать из STDIN, принять в качестве аргумента функции или даже сохранить в файле. Входные данные могут быть описаны с использованием следующего EBNF:
input = statement , {statement};
statement = (("Pigs are ", attribute) | ("Everything that is ", attribute, "is also ", attribute)), ". ";
attribute = [not], ("able to fly" | singleAttribute);
singleAttribute = letter, {letter};
letter = "a" | "b" | "c" | "d" | "e" | "f" | "g"
| "h" | "i" | "j" | "k" | "l" | "m" | "n"
| "o" | "p" | "q" | "r" | "s" | "t" | "u"
| "v" | "w" | "x" | "y" | "z" ;
Пример ввода (см. Дополнительные примеры ниже):
Pigs are green. Everything that is green is also intelligent. Everything that is able to fly is also not intelligent. Pigs are sweet.
Выход
Вывод может быть возвращен вашей функцией, записан в файл или распечатан в STDOUT. Есть 5 различных случаев, которые нужно обработать:
- Данные утверждения являются действительными, последовательными и имеют в качестве логического следствия, что свиньи могут летать. В этом случае вы должны вывести
Yes
. - Данные утверждения являются действительными, последовательными и имеют логическое следствие того, что свиньи не могут летать. В этом случае вы должны вывести
No
. - Из приведенных, действительных и последовательных утверждений нельзя сделать вывод, могут ли свиньи летать или нет. В этом случае вы должны вывести
Maybe
. - Данные утверждения являются действительными, но не последовательными (т.е. в данных утверждениях есть противоречие). Так как ex falso quodlibet , мы решаем выводить
Yes
в этом случае. - Данные утверждения недействительны, то есть они не отформатированы в соответствии с данным EBNF. В этом случае вы можете делать все, что хотите.
Детали
- Вы можете предположить, что данные атрибуты независимы друг от друга. Так, например, свинья может быть молодой и старой, зеленой, красной и синей одновременно, не вызывая каких-либо противоречий. Однако свинья не может быть «зеленой» и «не зеленой» в одно и то же время, это противоречит и должно рассматриваться, как описано в (4).
- Для каждого атрибута предположим, что в юниверсе есть хотя бы один объект (не обязательно свинья), у которого есть данный атрибут, и один объект, у которого его нет.
Пример входов и выходов
Входные данные:
Pigs are green. Everything that is green is also intelligent. Everything that is able to fly is also not intelligent.
Вывод: поскольку свиньи зеленые и, следовательно, умные, а все, что умеет летать, не разумно, свиньи не могут летать. Выход есть No
.
Входные данные:
Pigs are old. Everything that is not able to fly is also not old.
Вывод: если свиньи не могли летать, они также не были старыми. Но так как они старые, вы должны вывести Yes
.
Входные данные:
Everything that is sweet is also not old. Everything that is intelligent is also blue.
Выход: Maybe
.
Входные данные:
Pigs are not able to fly. Everything that is red is also sweet. Everything that is sweet is also not red.
Вывод: хотя первое утверждение подразумевает, что свиньи не могут летать, следующие утверждения противоречат друг другу, и поэтому вывод должен быть Yes
.
Входные данные:
Pigs are very smart. Pigs are able to fly.
Вывод: все, что вы хотите, так как строка не соответствует критериям, указанным выше.
победитель
Это код-гольф , поэтому выигрывает самый короткий правильный ответ (в байтах). Победитель будет выбран через неделю после публикации первого правильного ответа.
Ответы:
Perl,
363353350347343297266264Ungolfed / Пояснение:
источник
Haskell,
586566547 байтЯ написал это в предположении, что для каждого свойства P должно существовать несколько x и y, таких, что P (x) истинно, а P (y) ложно; без этого предположения входные данные четвертого примера не имели бы противоречия и отвечали бы «нет».
Это должно быть скомпилировано с опцией командной строки ghc "-cpp". Ввод должен быть завершен EOF (^ D). Вы можете попробовать это онлайн на http://melpon.org/wandbox/ , но вы не можете установить параметры командной строки. Вместо этого вы можете добавить в программу префикс языка
Он работает, собирая набор признаков, затем фильтруя набор характеристик -> истинностных оценок, используя значения во входных данных. Затем результат проверяется, чтобы удостовериться, что каждая черта может быть правильно назначена как True, так и False (неудача здесь - это случай ex falso quodlibet ). Наконец, он ищет оценки, которые соответствуют фактам свиньи, проверяя значение «способен летать» в каждой оценке.
Несколько байт были потеряны из-за состояния потока: набор признаков, которые мы видели до сих пор, функция выбора фактов и функция фильтрации, определяемая последствиями. Вероятно, та же самая идея была бы намного короче на нечистом языке.
Изменить: Сохранение нескольких байтов по предложению гордого haskeller, а затем пару дополнительных путем замены привязки z и "u% drop 2 z" с привязкой к "_: _: z" и "u% z", сохраняя 3.
Редактировать 2: Сохранено еще немного. Использовал трюк (#) = (,), чтобы сохранить 2 байта, и узнал о синонимах шаблонов ( https://ghc.haskell.org/trac/ghc/wiki/PatternSynonyms ), но запись была слишком многословной, чтобы получить экономию от устранение остальных пар в этой программе. Выжали немного больше экономии, изменив шаблоны, которые ищет синтаксический анализатор. Например: если предложение не начинается с Pigs и у нас что-то осталось в состоянии синтаксического анализатора, мы анализируем предложение «Все, что есть ..». Это сохранило много символов в шаблонах для X и%.
источник
u n=(:)<$>[t,f]<*>u(n-1)
(хотя для этого потребуется импортировать Control.Applicative, так что, во-вторых, это хуже)c l=(all(==l!!0)l,and l)
Питон,
547536525521513509497503501Для каждого
a -> b
из входных данных мы добавляем данное предложение и его отрицаниеnot b -> not a
к набору предложений, а затем вычисляем набор предложений, которые->
достижимы из любого предложения, используя цикл с фиксированной точкой. Всякий раз, когда мы сталкиваемся с противоречием, мы бросаем (а потом ловим) aZeroDivisionError
и печатаемYes
.Наконец, мы проверяем, достижимо ли «летать» (и / или его отрицание) из предложения «является свиньей»,
''
и печатаем соответствующий ответ.РЕДАКТИРОВАТЬ :
Это глючит, исправить это.Исправлена.источник
try
блок в ту же строку, что иtry:
Рубин 1.9.3 (
365 364362)использование
Выше код определяет функцию
f
, которая принимает один параметр , представляющий текстовый ввод и возвращаетсяYes
,No
илиMaybe
.Например:
Онлайн тест: http://ideone.com/fxLemg
Разгруженный код (включая юнит-тесты) доступен здесь .
источник