Tarefa
Sua tarefa é escrever uma função ou um programa em um idioma de sua escolha que analise algumas declarações e determine se é possível concluir com base nessas declarações que os porcos são capazes de voar.
Entrada
A entrada é uma String que pode ser lida em STDIN, usada como argumento de função ou mesmo armazenada em um arquivo. A entrada pode ser descrita usando o seguinte 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" ;
Exemplo de entrada (veja mais exemplos abaixo):
Pigs are green. Everything that is green is also intelligent. Everything that is able to fly is also not intelligent. Pigs are sweet.
Resultado
A saída pode ser retornada por sua função, ser gravada em um arquivo ou impressa em STDOUT. Existem 5 casos diferentes a serem tratados:
- As declarações dadas são válidas, consistentes e têm como consequência lógica que os porcos possam voar. Nesse caso, você deve produzir
Yes
. - As declarações dadas são válidas, consistentes e têm como consequência lógica que os porcos não podem voar. Nesse caso, você deve produzir
No
. - Não se pode concluir com base em declarações válidas e consistentes, se os porcos podem voar ou não. Nesse caso, você deve produzir
Maybe
. - As declarações dadas são válidas, mas não consistentes (ou seja, há uma contradição nas declarações dadas). Desde o ex quodlibet falso , decidimos produzir
Yes
nesse caso. - As instruções fornecidas não são válidas, ou seja, não são formatadas de acordo com o EBNF fornecido. Nesse caso, você pode fazer o que quiser.
Detalhes
- Você pode assumir que os atributos fornecidos são independentes um do outro. Assim, por exemplo, um porco pode ser jovem e velho, verde, vermelho e azul ao mesmo tempo, sem causar inconsistência. No entanto, um porco pode não ser 'verde' e 'não verde' ao mesmo tempo, isso é uma contradição e deve ser tratado como descrito em (4).
- Para cada atributo, suponha que exista pelo menos um objeto (não necessariamente um porco) no universo que tenha o atributo fornecido e um objeto que não o possua.
Exemplo de entradas e saídas
Entrada:
Pigs are green. Everything that is green is also intelligent. Everything that is able to fly is also not intelligent.
Resultado: Como os porcos são verdes e, portanto, inteligentes, e tudo o que é capaz de voar não é inteligente, os porcos não podem voar. Saída é No
.
Entrada:
Pigs are old. Everything that is not able to fly is also not old.
Resultado: se os porcos não conseguiam voar, eles também não eram velhos. Mas como eles são antigos, você deve produzir Yes
.
Entrada:
Everything that is sweet is also not old. Everything that is intelligent is also blue.
Saída: Maybe
.
Entrada:
Pigs are not able to fly. Everything that is red is also sweet. Everything that is sweet is also not red.
Saída: Embora a primeira declaração implique que os porcos não podem voar, as seguintes declarações se contradizem e, portanto, a saída deve ser Yes
.
Entrada:
Pigs are very smart. Pigs are able to fly.
Saída: o que você quiser, pois a String não corresponde aos critérios mencionados acima.
Vencedora
Isso é código-golfe , então a resposta correta mais curta (em bytes) vence. O vencedor será escolhido uma semana após a publicação da primeira resposta correta.
fonte
Respostas:
Perl,
363353350347343297266264Ungolfed / Explicação:
fonte
Haskell,
586566547 bytesEscrevi isso no pressuposto de que para toda propriedade P deve existir algum x e y, de modo que P (x) seja verdadeiro e P (y) seja falso; sem essa suposição, o quarto exemplo de entrada não teria uma contradição e responderia "Não".
Isso deve ser compilado com a opção de linha de comando ghc "-cpp". A entrada deve ser finalizada por EOF (^ D). Você pode experimentá-lo online em http://melpon.org/wandbox/ , mas não pode definir opções de linha de comando. Em vez disso, você pode prefixar o programa com a opção de idioma
Ele funciona coletando o conjunto de características e, em seguida, filtrando o conjunto de características -> avaliações da verdade usando as implicações na entrada. O resultado é então testado para garantir que cada característica possa ser atribuída validamente a Verdadeiro e Falso (falha aqui é o caso ex falso quodlibet ). Por fim, procura avaliações que correspondam aos fatos do porco, verificando o valor de "capaz de voar" em cada avaliação.
Poucos bytes foram perdidos para o estado de segmentação: o conjunto de características vistas até agora, a função de seleção de fatos de porco e a função de filtragem determinada pelas implicações. Provavelmente a mesma idéia seria muito mais curta em uma linguagem impura.
Editar: salvou vários bytes por sugestão de orgulhoso haskeller, e mais alguns substituindo a ligação de z e "u% drop 2 z" por uma ligação em "_: _: z" e "u% z", salvando 3.
Editar 2: economizou um pouco mais. Usou o truque (#) = (,) para salvar 2 bytes e aprendeu sobre sinônimos de padrões ( https://ghc.haskell.org/trac/ghc/wiki/PatternSynônimos ), mas a notação era muito detalhada para obter uma economia de eliminando o restante dos pares neste programa. Conseguiu um pouco mais de economia, alterando os padrões que o analisador procura. Por exemplo: se uma frase não começa com Porcos e ainda resta alguma coisa no estado do analisador, analisamos a frase "Tudo o que é ..". Isso salvou muitos caracteres nos padrões para X e%.
fonte
u n=(:)<$>[t,f]<*>u(n-1)
(embora isso exigiria importação Control.Applicative, assim, no segundo pensamento é pior)c l=(all(==l!!0)l,and l)
Python,
547536525521513509497503501Para cada
a -> b
entrada, adicionamos a cláusula fornecida e sua negaçãonot b -> not a
ao conjunto de cláusulas e depois calculamos o conjunto de proposições que são->
acessíveis a partir de qualquer proposição usando um loop de ponto de fixação. Sempre que encontramos uma contradição, jogamos (e depois capturamos) umZeroDivisionError
e imprimimosYes
.Finalmente, verificamos se 'capaz de voar' (e / ou sua negação) é acessível a partir da proposição 'é porco'
''
e imprimimos a resposta apropriada.EDIT :
Este é um buggy, corrigindo-o.Fixo.fonte
try
bloco na mesma linhatry:
Ruby 1.9.3 (
365 364362)Uso
O código acima define uma função
f
, que leva um parâmetro que representa a entrada de texto e retornaYes
,No
, ouMaybe
.Por exemplo:
Teste online: http://ideone.com/fxLemg
O código não protegido (incluindo testes de unidade) está disponível aqui .
fonte